diff options
924 files changed, 6754 insertions, 7133 deletions
diff --git a/android/app/aidl/android/bluetooth/BluetoothAudioConfig.aidl b/android/app/aidl/android/bluetooth/BluetoothAudioConfig.aidl index 2ef113d9fa..63be5cff87 100644 --- a/android/app/aidl/android/bluetooth/BluetoothAudioConfig.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothAudioConfig.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2009 The Android Open Source Project + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothAvrcpPlayerSettings.aidl b/android/app/aidl/android/bluetooth/BluetoothAvrcpPlayerSettings.aidl index 41b8af6d78..590fd63eda 100644 --- a/android/app/aidl/android/bluetooth/BluetoothAvrcpPlayerSettings.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothAvrcpPlayerSettings.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2015 The Android Open Source Project + * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothCodecConfig.aidl b/android/app/aidl/android/bluetooth/BluetoothCodecConfig.aidl index 58906374ba..553e66e1da 100644 --- a/android/app/aidl/android/bluetooth/BluetoothCodecConfig.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothCodecConfig.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothCodecStatus.aidl b/android/app/aidl/android/bluetooth/BluetoothCodecStatus.aidl index f674db77bd..f9c3a3de2f 100644 --- a/android/app/aidl/android/bluetooth/BluetoothCodecStatus.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothCodecStatus.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothCodecType.aidl b/android/app/aidl/android/bluetooth/BluetoothCodecType.aidl index 2365b126ca..dfd81057ee 100644 --- a/android/app/aidl/android/bluetooth/BluetoothCodecType.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothCodecType.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothGattCharacteristic.aidl b/android/app/aidl/android/bluetooth/BluetoothGattCharacteristic.aidl index 463b7a70b7..bbb8623e21 100644 --- a/android/app/aidl/android/bluetooth/BluetoothGattCharacteristic.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothGattCharacteristic.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothGattDescriptor.aidl b/android/app/aidl/android/bluetooth/BluetoothGattDescriptor.aidl index 6d4cdeb848..4393273316 100644 --- a/android/app/aidl/android/bluetooth/BluetoothGattDescriptor.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothGattDescriptor.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothGattIncludedService.aidl b/android/app/aidl/android/bluetooth/BluetoothGattIncludedService.aidl index d911973467..1ef427edc3 100644 --- a/android/app/aidl/android/bluetooth/BluetoothGattIncludedService.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothGattIncludedService.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothGattService.aidl b/android/app/aidl/android/bluetooth/BluetoothGattService.aidl index 8e72ba91a4..84314d2072 100644 --- a/android/app/aidl/android/bluetooth/BluetoothGattService.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothGattService.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothHeadsetClientCall.aidl b/android/app/aidl/android/bluetooth/BluetoothHeadsetClientCall.aidl index 5403d5149c..35f792387e 100644 --- a/android/app/aidl/android/bluetooth/BluetoothHeadsetClientCall.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothHeadsetClientCall.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothHearingAid.aidl b/android/app/aidl/android/bluetooth/BluetoothHearingAid.aidl index 48c4772c03..bcb2466bda 100644 --- a/android/app/aidl/android/bluetooth/BluetoothHearingAid.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothHearingAid.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecConfig.aidl b/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecConfig.aidl index e32217eff7..3eb42f18e9 100644 --- a/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecConfig.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecConfig.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecStatus.aidl b/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecStatus.aidl index 7c50d6ebe9..52cdf692bc 100644 --- a/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecStatus.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothLeAudioCodecStatus.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothLeAudioContentMetadata.aidl b/android/app/aidl/android/bluetooth/BluetoothLeAudioContentMetadata.aidl index 8962810c62..eb4712a9bb 100644 --- a/android/app/aidl/android/bluetooth/BluetoothLeAudioContentMetadata.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothLeAudioContentMetadata.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothLeBroadcastMetadata.aidl b/android/app/aidl/android/bluetooth/BluetoothLeBroadcastMetadata.aidl index eb00836ec0..5ce8f6ba30 100644 --- a/android/app/aidl/android/bluetooth/BluetoothLeBroadcastMetadata.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothLeBroadcastMetadata.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothLeBroadcastReceiveState.aidl b/android/app/aidl/android/bluetooth/BluetoothLeBroadcastReceiveState.aidl index e3f13b0fbc..1ae4036cdf 100644 --- a/android/app/aidl/android/bluetooth/BluetoothLeBroadcastReceiveState.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothLeBroadcastReceiveState.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothLeBroadcastSettings.aidl b/android/app/aidl/android/bluetooth/BluetoothLeBroadcastSettings.aidl index 69ec550745..b36d69c374 100644 --- a/android/app/aidl/android/bluetooth/BluetoothLeBroadcastSettings.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothLeBroadcastSettings.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/BluetoothSinkAudioPolicy.aidl b/android/app/aidl/android/bluetooth/BluetoothSinkAudioPolicy.aidl index 740249c84f..edb81dd6a2 100644 --- a/android/app/aidl/android/bluetooth/BluetoothSinkAudioPolicy.aidl +++ b/android/app/aidl/android/bluetooth/BluetoothSinkAudioPolicy.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IAudioInputCallback.aidl b/android/app/aidl/android/bluetooth/IAudioInputCallback.aidl index 133dfbebbb..9b358940bd 100644 --- a/android/app/aidl/android/bluetooth/IAudioInputCallback.aidl +++ b/android/app/aidl/android/bluetooth/IAudioInputCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetooth.aidl b/android/app/aidl/android/bluetooth/IBluetooth.aidl index b9cf6bca14..bc46353f7c 100644 --- a/android/app/aidl/android/bluetooth/IBluetooth.aidl +++ b/android/app/aidl/android/bluetooth/IBluetooth.aidl @@ -100,7 +100,9 @@ interface IBluetooth @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)") List<BluetoothDevice> getBondedDevices(in AttributionSource attributionSource); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)") - boolean createBond(in BluetoothDevice device, in int transport, in OobData p192Data, in OobData p256Data, in AttributionSource attributionSource); + boolean createBond(in BluetoothDevice device, in int transport, in AttributionSource attributionSource); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})") + boolean createBondOutOfBand(in BluetoothDevice device, in int transport, in OobData p192Data, in OobData p256Data, in AttributionSource attributionSource); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})") boolean cancelBondProcess(in BluetoothDevice device, in AttributionSource attributionSource); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)") diff --git a/android/app/aidl/android/bluetooth/IBluetoothA2dp.aidl b/android/app/aidl/android/bluetooth/IBluetoothA2dp.aidl index fa5d1362ac..3eeaf4de82 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothA2dp.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothA2dp.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2008 The Android Open Source Project + * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothA2dpSink.aidl b/android/app/aidl/android/bluetooth/IBluetoothA2dpSink.aidl index 53c12167bb..0e09962668 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothA2dpSink.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothA2dpSink.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothAvrcpController.aidl b/android/app/aidl/android/bluetooth/IBluetoothAvrcpController.aidl index 4eae036576..f9226ccca6 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothAvrcpController.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothAvrcpController.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothConnectionCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothConnectionCallback.aidl index 56de49c519..acbccedbb8 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothConnectionCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothConnectionCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothGatt.aidl b/android/app/aidl/android/bluetooth/IBluetoothGatt.aidl index 40976dbf00..225da3e126 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothGatt.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothGatt.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2013 The Android Open Source Project + * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothGattCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothGattCallback.aidl index 78fc874b1c..81ec765973 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothGattCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothGattCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2013 The Android Open Source Project + * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothGattServerCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothGattServerCallback.aidl index f79546dd34..cc0ff314de 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothGattServerCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothGattServerCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothHapClientCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothHapClientCallback.aidl index 2480b305e9..96d1c88eb0 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothHapClientCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothHapClientCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothHciVendorSpecificCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothHciVendorSpecificCallback.aidl index 2aac21b158..ee122fd6b3 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothHciVendorSpecificCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothHciVendorSpecificCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothHeadset.aidl b/android/app/aidl/android/bluetooth/IBluetoothHeadset.aidl index 3b3292cd16..6653bd2320 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothHeadset.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothHeadset.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2008 The Android Open Source Project + * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothHeadsetClient.aidl b/android/app/aidl/android/bluetooth/IBluetoothHeadsetClient.aidl index 59c5f98bfb..2693a0df0a 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothHeadsetClient.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothHeadsetClient.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothHearingAid.aidl b/android/app/aidl/android/bluetooth/IBluetoothHearingAid.aidl index 29e5a1f792..e21da24ef0 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothHearingAid.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothHearingAid.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothHidDevice.aidl b/android/app/aidl/android/bluetooth/IBluetoothHidDevice.aidl index c53d1e63fb..dd82eb5ba1 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothHidDevice.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothHidDevice.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothHidHost.aidl b/android/app/aidl/android/bluetooth/IBluetoothHidHost.aidl index 69ffdc227a..7d44385b1e 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothHidHost.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothHidHost.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2012 The Android Open Source Project + * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothLeAudioCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothLeAudioCallback.aidl index f333405f5e..c1c0480bba 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothLeAudioCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothLeAudioCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistant.aidl b/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistant.aidl index 54b947c061..9c00f3b8c2 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistant.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistant.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistantCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistantCallback.aidl index 9a09254c50..eff415a5b5 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistantCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastAssistantCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastCallback.aidl index aa9f3925cc..78289a01bc 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothLeBroadcastCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothMap.aidl b/android/app/aidl/android/bluetooth/IBluetoothMap.aidl index 2862005ae2..798f34d08a 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothMap.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothMap.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2008 The Android Open Source Project + * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothMapClient.aidl b/android/app/aidl/android/bluetooth/IBluetoothMapClient.aidl index a06a7fc0dc..6dba53c4c1 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothMapClient.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothMapClient.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothMetadataListener.aidl b/android/app/aidl/android/bluetooth/IBluetoothMetadataListener.aidl index e08919fedb..57f6fcb886 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothMetadataListener.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothMetadataListener.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothOobDataCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothOobDataCallback.aidl index 00975b6bbe..a2a635fa45 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothOobDataCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothOobDataCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothPan.aidl b/android/app/aidl/android/bluetooth/IBluetoothPan.aidl index 2d9172fc97..b636e57c1e 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothPan.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothPan.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2012 The Android Open Source Project + * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothPanCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothPanCallback.aidl index 898794a227..24886ae529 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothPanCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothPanCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2012 The Android Open Source Project + * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothPbap.aidl b/android/app/aidl/android/bluetooth/IBluetoothPbap.aidl index 5d4f33431a..0e538b33a9 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothPbap.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothPbap.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2008 The Android Open Source Project + * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothPbapClient.aidl b/android/app/aidl/android/bluetooth/IBluetoothPbapClient.aidl index 7cc66d08ac..cfc5cb78e0 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothPbapClient.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothPbapClient.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothPreferredAudioProfilesCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothPreferredAudioProfilesCallback.aidl index f7ab3ff975..534f54c28c 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothPreferredAudioProfilesCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothPreferredAudioProfilesCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothProfileServiceConnection.aidl b/android/app/aidl/android/bluetooth/IBluetoothProfileServiceConnection.aidl index 5a048cf7e2..0a10d60c4e 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothProfileServiceConnection.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothProfileServiceConnection.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothQualityReportReadyCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothQualityReportReadyCallback.aidl index 7a92a20811..43d3473262 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothQualityReportReadyCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothQualityReportReadyCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothSap.aidl b/android/app/aidl/android/bluetooth/IBluetoothSap.aidl index 94641bf4d5..019d66df0c 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothSap.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothSap.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2013 The Android Open Source Project + * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IBluetoothVolumeControlCallback.aidl b/android/app/aidl/android/bluetooth/IBluetoothVolumeControlCallback.aidl index e067989739..e5239b4b8b 100644 --- a/android/app/aidl/android/bluetooth/IBluetoothVolumeControlCallback.aidl +++ b/android/app/aidl/android/bluetooth/IBluetoothVolumeControlCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/IDistanceMeasurement.aidl b/android/app/aidl/android/bluetooth/IDistanceMeasurement.aidl index 78c793a351..ead28c8ebd 100644 --- a/android/app/aidl/android/bluetooth/IDistanceMeasurement.aidl +++ b/android/app/aidl/android/bluetooth/IDistanceMeasurement.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/OobData.aidl b/android/app/aidl/android/bluetooth/OobData.aidl index 529e0b0a42..d831c64776 100644 --- a/android/app/aidl/android/bluetooth/OobData.aidl +++ b/android/app/aidl/android/bluetooth/OobData.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/AdvertiseData.aidl b/android/app/aidl/android/bluetooth/le/AdvertiseData.aidl index 713635d5ce..bcbf2243e1 100644 --- a/android/app/aidl/android/bluetooth/le/AdvertiseData.aidl +++ b/android/app/aidl/android/bluetooth/le/AdvertiseData.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/AdvertiseSettings.aidl b/android/app/aidl/android/bluetooth/le/AdvertiseSettings.aidl index 3677e752e6..9f47d74ca5 100644 --- a/android/app/aidl/android/bluetooth/le/AdvertiseSettings.aidl +++ b/android/app/aidl/android/bluetooth/le/AdvertiseSettings.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/AdvertisingSetParameters.aidl b/android/app/aidl/android/bluetooth/le/AdvertisingSetParameters.aidl index 3918864bd1..39034a001f 100644 --- a/android/app/aidl/android/bluetooth/le/AdvertisingSetParameters.aidl +++ b/android/app/aidl/android/bluetooth/le/AdvertisingSetParameters.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/DistanceMeasurementMethod.aidl b/android/app/aidl/android/bluetooth/le/DistanceMeasurementMethod.aidl index ee341d30a0..08612dad3f 100644 --- a/android/app/aidl/android/bluetooth/le/DistanceMeasurementMethod.aidl +++ b/android/app/aidl/android/bluetooth/le/DistanceMeasurementMethod.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/DistanceMeasurementParams.aidl b/android/app/aidl/android/bluetooth/le/DistanceMeasurementParams.aidl index be0eba3606..19ec0c0379 100644 --- a/android/app/aidl/android/bluetooth/le/DistanceMeasurementParams.aidl +++ b/android/app/aidl/android/bluetooth/le/DistanceMeasurementParams.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/DistanceMeasurementResult.aidl b/android/app/aidl/android/bluetooth/le/DistanceMeasurementResult.aidl index eb4b0c84fa..dc4cfd9cda 100644 --- a/android/app/aidl/android/bluetooth/le/DistanceMeasurementResult.aidl +++ b/android/app/aidl/android/bluetooth/le/DistanceMeasurementResult.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/IAdvertisingSetCallback.aidl b/android/app/aidl/android/bluetooth/le/IAdvertisingSetCallback.aidl index 449b173309..b5d492905e 100644 --- a/android/app/aidl/android/bluetooth/le/IAdvertisingSetCallback.aidl +++ b/android/app/aidl/android/bluetooth/le/IAdvertisingSetCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/IDistanceMeasurementCallback.aidl b/android/app/aidl/android/bluetooth/le/IDistanceMeasurementCallback.aidl index 19f4ba72e5..518b0be4a6 100644 --- a/android/app/aidl/android/bluetooth/le/IDistanceMeasurementCallback.aidl +++ b/android/app/aidl/android/bluetooth/le/IDistanceMeasurementCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/IPeriodicAdvertisingCallback.aidl b/android/app/aidl/android/bluetooth/le/IPeriodicAdvertisingCallback.aidl index 579ec086b7..b70b03f392 100644 --- a/android/app/aidl/android/bluetooth/le/IPeriodicAdvertisingCallback.aidl +++ b/android/app/aidl/android/bluetooth/le/IPeriodicAdvertisingCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/IScannerCallback.aidl b/android/app/aidl/android/bluetooth/le/IScannerCallback.aidl index 025e7ffbba..8cbbaef41a 100644 --- a/android/app/aidl/android/bluetooth/le/IScannerCallback.aidl +++ b/android/app/aidl/android/bluetooth/le/IScannerCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingParameters.aidl b/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingParameters.aidl index 3f714f0813..f4bea22a12 100644 --- a/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingParameters.aidl +++ b/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingParameters.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingReport.aidl b/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingReport.aidl index 986ac6165c..547d09611f 100644 --- a/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingReport.aidl +++ b/android/app/aidl/android/bluetooth/le/PeriodicAdvertisingReport.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/ResultStorageDescriptor.aidl b/android/app/aidl/android/bluetooth/le/ResultStorageDescriptor.aidl index afc1b41fdf..f218a01a5d 100644 --- a/android/app/aidl/android/bluetooth/le/ResultStorageDescriptor.aidl +++ b/android/app/aidl/android/bluetooth/le/ResultStorageDescriptor.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/ScanFilter.aidl b/android/app/aidl/android/bluetooth/le/ScanFilter.aidl index e3ebd857f4..4cecfe62e1 100644 --- a/android/app/aidl/android/bluetooth/le/ScanFilter.aidl +++ b/android/app/aidl/android/bluetooth/le/ScanFilter.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/ScanResult.aidl b/android/app/aidl/android/bluetooth/le/ScanResult.aidl index f16dc18d43..39430350da 100644 --- a/android/app/aidl/android/bluetooth/le/ScanResult.aidl +++ b/android/app/aidl/android/bluetooth/le/ScanResult.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/aidl/android/bluetooth/le/ScanSettings.aidl b/android/app/aidl/android/bluetooth/le/ScanSettings.aidl index e84e078ed0..eb169c1209 100644 --- a/android/app/aidl/android/bluetooth/le/ScanSettings.aidl +++ b/android/app/aidl/android/bluetooth/le/ScanSettings.aidl @@ -1,5 +1,5 @@ /* - * Copyright 2014 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/jni/com_android_bluetooth_BluetoothHciVendorSpecific.cpp b/android/app/jni/com_android_bluetooth_BluetoothHciVendorSpecific.cpp index 96c15300af..75cf1efea8 100644 --- a/android/app/jni/com_android_bluetooth_BluetoothHciVendorSpecific.cpp +++ b/android/app/jni/com_android_bluetooth_BluetoothHciVendorSpecific.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/jni/com_android_bluetooth_BluetoothQualityReport.cpp b/android/app/jni/com_android_bluetooth_BluetoothQualityReport.cpp index b59bc9116f..8a225555b1 100644 --- a/android/app/jni/com_android_bluetooth_BluetoothQualityReport.cpp +++ b/android/app/jni/com_android_bluetooth_BluetoothQualityReport.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/jni/com_android_bluetooth_btservice_BluetoothKeystore.cpp b/android/app/jni/com_android_bluetooth_btservice_BluetoothKeystore.cpp index 5151bbff2f..b95ccf202d 100644 --- a/android/app/jni/com_android_bluetooth_btservice_BluetoothKeystore.cpp +++ b/android/app/jni/com_android_bluetooth_btservice_BluetoothKeystore.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/jni/com_android_bluetooth_gatt.cpp b/android/app/jni/com_android_bluetooth_gatt.cpp index acd609f8bd..be0922c8fc 100644 --- a/android/app/jni/com_android_bluetooth_gatt.cpp +++ b/android/app/jni/com_android_bluetooth_gatt.cpp @@ -2353,7 +2353,11 @@ static AdvertiseParameters parseParams(JNIEnv* env, jobject i) { p.secondary_advertising_phy = secondaryPhy; p.scan_request_notification_enable = false; p.own_address_type = ownAddressType; - p.peer_address = str2addr(env, peerAddress); + if (peerAddress == nullptr) { + p.peer_address = RawAddress::kEmpty; + } else { + p.peer_address = str2addr(env, peerAddress); + } p.peer_address_type = peerAddressType; p.discoverable = isDiscoverable; return p; diff --git a/android/app/jni/com_android_bluetooth_hearing_aid.cpp b/android/app/jni/com_android_bluetooth_hearing_aid.cpp index dbe2439ed4..312961db41 100644 --- a/android/app/jni/com_android_bluetooth_hearing_aid.cpp +++ b/android/app/jni/com_android_bluetooth_hearing_aid.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/jni/com_android_bluetooth_hfp.cpp b/android/app/jni/com_android_bluetooth_hfp.cpp index 18a0bf1950..f321497e16 100644 --- a/android/app/jni/com_android_bluetooth_hfp.cpp +++ b/android/app/jni/com_android_bluetooth_hfp.cpp @@ -651,7 +651,8 @@ static jboolean isVoiceRecognitionSupportedNative(JNIEnv* env, jobject /* object return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; } -static jboolean startVoiceRecognitionNative(JNIEnv* env, jobject /* object */, jbyteArray address) { +static jboolean startVoiceRecognitionNative(JNIEnv* env, jobject /* object */, jbyteArray address, + jboolean sendResult) { std::shared_lock<std::shared_timed_mutex> lock(interface_mutex); if (!sBluetoothHfpInterface) { log::warn("sBluetoothHfpInterface is null"); @@ -663,7 +664,7 @@ static jboolean startVoiceRecognitionNative(JNIEnv* env, jobject /* object */, j jniThrowIOException(env, EINVAL); return JNI_FALSE; } - bt_status_t status = sBluetoothHfpInterface->StartVoiceRecognition((RawAddress*)addr); + bt_status_t status = sBluetoothHfpInterface->StartVoiceRecognition((RawAddress*)addr, sendResult); if (status != BT_STATUS_SUCCESS) { log::error("Failed to start voice recognition, status: {}", bt_status_text(status)); } @@ -986,7 +987,7 @@ int register_com_android_bluetooth_hfp(JNIEnv* env) { {"disconnectAudioNative", "([B)Z", (void*)disconnectAudioNative}, {"isNoiseReductionSupportedNative", "([B)Z", (void*)isNoiseReductionSupportedNative}, {"isVoiceRecognitionSupportedNative", "([B)Z", (void*)isVoiceRecognitionSupportedNative}, - {"startVoiceRecognitionNative", "([B)Z", (void*)startVoiceRecognitionNative}, + {"startVoiceRecognitionNative", "([BZ)Z", (void*)startVoiceRecognitionNative}, {"stopVoiceRecognitionNative", "([B)Z", (void*)stopVoiceRecognitionNative}, {"setVolumeNative", "(II[B)Z", (void*)setVolumeNative}, {"notifyDeviceStatusNative", "(IIII[B)Z", (void*)notifyDeviceStatusNative}, diff --git a/android/app/src/com/android/bluetooth/BluetoothEventLogger.java b/android/app/src/com/android/bluetooth/BluetoothEventLogger.java index c0db3988fa..db2d7f56ef 100644 --- a/android/app/src/com/android/bluetooth/BluetoothEventLogger.java +++ b/android/app/src/com/android/bluetooth/BluetoothEventLogger.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/BluetoothMethodProxy.java b/android/app/src/com/android/bluetooth/BluetoothMethodProxy.java index 9c1a65a7bc..a4c265adf7 100644 --- a/android/app/src/com/android/bluetooth/BluetoothMethodProxy.java +++ b/android/app/src/com/android/bluetooth/BluetoothMethodProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/Utils.java b/android/app/src/com/android/bluetooth/Utils.java index ce23339f0b..3a681bb7e7 100644 --- a/android/app/src/com/android/bluetooth/Utils.java +++ b/android/app/src/com/android/bluetooth/Utils.java @@ -624,6 +624,13 @@ public final class Utils { return checkPermissionForDataDelivery(context, BLUETOOTH_CONNECT, source, message); } + @SuppressLint("AndroidFrameworkRequiresPermission") // This method enforce the permission + @RequiresPermission(BLUETOOTH_CONNECT) + public static boolean checkConnectPermissionForDataDelivery( + Context context, AttributionSource source, String tag, String method) { + return checkConnectPermissionForDataDelivery(context, source, tag + "." + method + "()"); + } + /** * Returns true if the BLUETOOTH_SCAN permission is granted for the calling app. Returns false * if the result is a soft denial. Throws SecurityException if the result is a hard denial. @@ -646,8 +653,9 @@ public final class Utils { @SuppressLint("AndroidFrameworkRequiresPermission") // This method enforce the permission @RequiresPermission(BLUETOOTH_SCAN) public static boolean checkScanPermissionForDataDelivery( - Context context, AttributionSource source, String message) { - return checkPermissionForDataDelivery(context, BLUETOOTH_SCAN, source, message); + Context context, AttributionSource source, String tag, String method) { + return checkPermissionForDataDelivery( + context, BLUETOOTH_SCAN, source, tag + "." + method + "()"); } /** diff --git a/android/app/src/com/android/bluetooth/a2dp/A2dpCodecConfig.java b/android/app/src/com/android/bluetooth/a2dp/A2dpCodecConfig.java index 340827bd09..30733e2a7f 100644 --- a/android/app/src/com/android/bluetooth/a2dp/A2dpCodecConfig.java +++ b/android/app/src/com/android/bluetooth/a2dp/A2dpCodecConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/a2dp/A2dpNativeCallback.java b/android/app/src/com/android/bluetooth/a2dp/A2dpNativeCallback.java index 314811f71c..5fd94dfea0 100644 --- a/android/app/src/com/android/bluetooth/a2dp/A2dpNativeCallback.java +++ b/android/app/src/com/android/bluetooth/a2dp/A2dpNativeCallback.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/a2dp/A2dpNativeInterface.java b/android/app/src/com/android/bluetooth/a2dp/A2dpNativeInterface.java index 67beb274d5..fe74b2facd 100644 --- a/android/app/src/com/android/bluetooth/a2dp/A2dpNativeInterface.java +++ b/android/app/src/com/android/bluetooth/a2dp/A2dpNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/a2dp/A2dpStackEvent.java b/android/app/src/com/android/bluetooth/a2dp/A2dpStackEvent.java index 6c66f0119b..314beefbaa 100644 --- a/android/app/src/com/android/bluetooth/a2dp/A2dpStackEvent.java +++ b/android/app/src/com/android/bluetooth/a2dp/A2dpStackEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/BrowsablePlayerConnector.java b/android/app/src/com/android/bluetooth/audio_util/BrowsablePlayerConnector.java index 12908fde53..156a54db8e 100644 --- a/android/app/src/com/android/bluetooth/audio_util/BrowsablePlayerConnector.java +++ b/android/app/src/com/android/bluetooth/audio_util/BrowsablePlayerConnector.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/BrowsedPlayerWrapper.java b/android/app/src/com/android/bluetooth/audio_util/BrowsedPlayerWrapper.java index 02598dae03..8b9b73d160 100644 --- a/android/app/src/com/android/bluetooth/audio_util/BrowsedPlayerWrapper.java +++ b/android/app/src/com/android/bluetooth/audio_util/BrowsedPlayerWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/GPMWrapper.java b/android/app/src/com/android/bluetooth/audio_util/GPMWrapper.java index a69a6be6f9..e7c45de50e 100644 --- a/android/app/src/com/android/bluetooth/audio_util/GPMWrapper.java +++ b/android/app/src/com/android/bluetooth/audio_util/GPMWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/MediaBrowserWrapper.java b/android/app/src/com/android/bluetooth/audio_util/MediaBrowserWrapper.java index 253eaa50a9..3c235cce76 100644 --- a/android/app/src/com/android/bluetooth/audio_util/MediaBrowserWrapper.java +++ b/android/app/src/com/android/bluetooth/audio_util/MediaBrowserWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -197,7 +197,7 @@ class MediaBrowserWrapper { mSubscribedIds.put( rootId, new ArrayList<>(Arrays.asList(callback))); mWrappedBrowser.subscribe( - rootId, new BrowserSubscriptionCallback(mediaId)); + rootId, new BrowserSubscriptionCallback(rootId)); }); } else { mSubscribedIds.put(mediaId, new ArrayList<>(Arrays.asList(callback))); diff --git a/android/app/src/com/android/bluetooth/audio_util/MediaPlayerList.java b/android/app/src/com/android/bluetooth/audio_util/MediaPlayerList.java index 17908cf61c..1098cda6fa 100644 --- a/android/app/src/com/android/bluetooth/audio_util/MediaPlayerList.java +++ b/android/app/src/com/android/bluetooth/audio_util/MediaPlayerList.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/MediaPlayerWrapper.java b/android/app/src/com/android/bluetooth/audio_util/MediaPlayerWrapper.java index cca53936a5..29efeaf0be 100644 --- a/android/app/src/com/android/bluetooth/audio_util/MediaPlayerWrapper.java +++ b/android/app/src/com/android/bluetooth/audio_util/MediaPlayerWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/PlayerSettingsManager.java b/android/app/src/com/android/bluetooth/audio_util/PlayerSettingsManager.java index 43733ec15e..6a0f9bd2d7 100644 --- a/android/app/src/com/android/bluetooth/audio_util/PlayerSettingsManager.java +++ b/android/app/src/com/android/bluetooth/audio_util/PlayerSettingsManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/helpers/PlayStatus.java b/android/app/src/com/android/bluetooth/audio_util/helpers/PlayStatus.java index adca4be6a9..eccabe6087 100644 --- a/android/app/src/com/android/bluetooth/audio_util/helpers/PlayStatus.java +++ b/android/app/src/com/android/bluetooth/audio_util/helpers/PlayStatus.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/helpers/PlayerInfo.java b/android/app/src/com/android/bluetooth/audio_util/helpers/PlayerInfo.java index ada64292f7..a6f5c4ee2f 100644 --- a/android/app/src/com/android/bluetooth/audio_util/helpers/PlayerInfo.java +++ b/android/app/src/com/android/bluetooth/audio_util/helpers/PlayerInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowser.java b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowser.java index 93ef130d43..31063529fa 100644 --- a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowser.java +++ b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowser.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowserFactory.java b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowserFactory.java index 4570af982a..835c09c79e 100644 --- a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowserFactory.java +++ b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaBrowserFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaController.java b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaController.java index a0081b2190..ceec1065f8 100644 --- a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaController.java +++ b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaController.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaControllerFactory.java b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaControllerFactory.java index ff477ac7b4..81734c5bae 100644 --- a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaControllerFactory.java +++ b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaControllerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaPlayerWrapperFactory.java b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaPlayerWrapperFactory.java index cb2798bdc3..5a8dfe4ab7 100644 --- a/android/app/src/com/android/bluetooth/audio_util/mockable/MediaPlayerWrapperFactory.java +++ b/android/app/src/com/android/bluetooth/audio_util/mockable/MediaPlayerWrapperFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/avrcp/AvrcpBipObexServer.java b/android/app/src/com/android/bluetooth/avrcp/AvrcpBipObexServer.java index 9df35f9388..fc760cd1ae 100644 --- a/android/app/src/com/android/bluetooth/avrcp/AvrcpBipObexServer.java +++ b/android/app/src/com/android/bluetooth/avrcp/AvrcpBipObexServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtService.java b/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtService.java index 2351f30fc2..7f8823ea35 100644 --- a/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtService.java +++ b/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtService.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorage.java b/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorage.java index cd97e9970c..4146139a12 100644 --- a/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorage.java +++ b/android/app/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorage.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/avrcp/AvrcpNativeInterface.java b/android/app/src/com/android/bluetooth/avrcp/AvrcpNativeInterface.java index 1e2e5607cb..720ce84dd8 100644 --- a/android/app/src/com/android/bluetooth/avrcp/AvrcpNativeInterface.java +++ b/android/app/src/com/android/bluetooth/avrcp/AvrcpNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/avrcp/AvrcpTargetService.java b/android/app/src/com/android/bluetooth/avrcp/AvrcpTargetService.java index e768a976cb..81667dca2c 100644 --- a/android/app/src/com/android/bluetooth/avrcp/AvrcpTargetService.java +++ b/android/app/src/com/android/bluetooth/avrcp/AvrcpTargetService.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,7 +46,6 @@ import com.android.bluetooth.audio_util.PlayStatus; import com.android.bluetooth.audio_util.PlayerInfo; import com.android.bluetooth.audio_util.PlayerSettingsManager; import com.android.bluetooth.btservice.AdapterService; -import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.flags.Flags; diff --git a/android/app/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java b/android/app/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java index 89c961b1f4..010538116f 100644 --- a/android/app/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java +++ b/android/app/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterface.java b/android/app/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterface.java index 0b29c00f3e..345c4ef4d7 100644 --- a/android/app/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterface.java +++ b/android/app/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/avrcpcontroller/bip/ParseException.java b/android/app/src/com/android/bluetooth/avrcpcontroller/bip/ParseException.java index bd23be2972..ee00cef211 100644 --- a/android/app/src/com/android/bluetooth/avrcpcontroller/bip/ParseException.java +++ b/android/app/src/com/android/bluetooth/avrcpcontroller/bip/ParseException.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bas/BatteryService.java b/android/app/src/com/android/bluetooth/bas/BatteryService.java index ac5eaab2f9..0b32dbf837 100644 --- a/android/app/src/com/android/bluetooth/bas/BatteryService.java +++ b/android/app/src/com/android/bluetooth/bas/BatteryService.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bas/BatteryStateMachine.java b/android/app/src/com/android/bluetooth/bas/BatteryStateMachine.java index 991a77cb93..62be4fb838 100644 --- a/android/app/src/com/android/bluetooth/bas/BatteryStateMachine.java +++ b/android/app/src/com/android/bluetooth/bas/BatteryStateMachine.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bass_client/BaseData.java b/android/app/src/com/android/bluetooth/bass_client/BaseData.java index 8f63aecc14..200bfe76a3 100644 --- a/android/app/src/com/android/bluetooth/bass_client/BaseData.java +++ b/android/app/src/com/android/bluetooth/bass_client/BaseData.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientPeriodicAdvertisingManager.java b/android/app/src/com/android/bluetooth/bass_client/BassClientPeriodicAdvertisingManager.java index 28d9f79d12..f54fc44c1a 100644 --- a/android/app/src/com/android/bluetooth/bass_client/BassClientPeriodicAdvertisingManager.java +++ b/android/app/src/com/android/bluetooth/bass_client/BassClientPeriodicAdvertisingManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java index aba5908ea6..edf88f9331 100644 --- a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java +++ b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1803,7 +1803,6 @@ public class BassClientService extends ProfileService { devices.add(sm.getDevice()); } } - log("getConnectedDevices: " + devices); return devices; } } @@ -2763,13 +2762,6 @@ public class BassClientService extends ProfileService { } void addSelectSourceRequest(int broadcastId, boolean hasPriority) { - sEventLogger.logd( - TAG, - "Add Select Broadcast Source, broadcastId: " - + broadcastId - + ", hasPriority: " - + hasPriority); - if (getActiveSyncedSources().contains(getSyncHandleForBroadcastId(broadcastId))) { log("addSelectSourceRequest: Already synced"); return; @@ -2780,6 +2772,13 @@ public class BassClientService extends ProfileService { return; } + sEventLogger.logd( + TAG, + "Add Select Broadcast Source, broadcastId: " + + broadcastId + + ", hasPriority: " + + hasPriority); + ScanResult scanRes = getCachedBroadcast(broadcastId); if (scanRes == null) { log("addSelectSourceRequest: ScanResult empty"); @@ -3523,7 +3522,6 @@ public class BassClientService extends ProfileService { * @return the list of Broadcast Receive State {@link BluetoothLeBroadcastReceiveState} */ public List<BluetoothLeBroadcastReceiveState> getAllSources(BluetoothDevice sink) { - log("getAllSources for " + sink); synchronized (mStateMachines) { BassClientStateMachine stateMachine = getOrCreateStateMachine(sink); if (stateMachine == null) { @@ -4878,7 +4876,8 @@ public class BassClientService extends ProfileService { if (!Utils.checkServiceAvailable(service, TAG) || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG) - || !Utils.checkScanPermissionForDataDelivery(service, source, TAG)) { + || !Utils.checkScanPermissionForDataDelivery( + service, source, TAG, "getServiceAndEnforceScan")) { return null; } diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java index 811333659e..2ebcd5d5d2 100644 --- a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java +++ b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bass_client/BassConstants.java b/android/app/src/com/android/bluetooth/bass_client/BassConstants.java index 13b0339853..e68454d829 100644 --- a/android/app/src/com/android/bluetooth/bass_client/BassConstants.java +++ b/android/app/src/com/android/bluetooth/bass_client/BassConstants.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bass_client/BassUtils.java b/android/app/src/com/android/bluetooth/bass_client/BassUtils.java index 69d61ce234..f84ae4c730 100644 --- a/android/app/src/com/android/bluetooth/bass_client/BassUtils.java +++ b/android/app/src/com/android/bluetooth/bass_client/BassUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResult.java b/android/app/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResult.java index e36f0de976..992e0a4c7e 100644 --- a/android/app/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResult.java +++ b/android/app/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResult.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/bass_client/PublicBroadcastData.java b/android/app/src/com/android/bluetooth/bass_client/PublicBroadcastData.java index 4cd4062906..536c939b59 100644 --- a/android/app/src/com/android/bluetooth/bass_client/PublicBroadcastData.java +++ b/android/app/src/com/android/bluetooth/bass_client/PublicBroadcastData.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterNativeInterface.java b/android/app/src/com/android/bluetooth/btservice/AdapterNativeInterface.java index 63d11202a1..dafcc8cecc 100644 --- a/android/app/src/com/android/bluetooth/btservice/AdapterNativeInterface.java +++ b/android/app/src/com/android/bluetooth/btservice/AdapterNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterService.java b/android/app/src/com/android/bluetooth/btservice/AdapterService.java index 87f5daad12..9bec63769d 100644 --- a/android/app/src/com/android/bluetooth/btservice/AdapterService.java +++ b/android/app/src/com/android/bluetooth/btservice/AdapterService.java @@ -20,16 +20,12 @@ package com.android.bluetooth.btservice; import static android.Manifest.permission.BLUETOOTH_CONNECT; import static android.Manifest.permission.BLUETOOTH_PRIVILEGED; import static android.Manifest.permission.BLUETOOTH_SCAN; -import static android.Manifest.permission.DUMP; -import static android.Manifest.permission.LOCAL_MAC_ADDRESS; -import static android.Manifest.permission.MODIFY_PHONE_STATE; import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE; import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE; import static android.bluetooth.BluetoothAdapter.SCAN_MODE_NONE; import static android.bluetooth.BluetoothAdapter.nameForState; import static android.bluetooth.BluetoothDevice.BATTERY_LEVEL_UNKNOWN; import static android.bluetooth.BluetoothDevice.BOND_NONE; -import static android.bluetooth.BluetoothDevice.TRANSPORT_AUTO; import static android.bluetooth.BluetoothProfile.CONNECTION_POLICY_ALLOWED; import static android.bluetooth.BluetoothProfile.CONNECTION_POLICY_FORBIDDEN; import static android.bluetooth.BluetoothProfile.CONNECTION_POLICY_UNKNOWN; @@ -42,9 +38,6 @@ import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; import static android.text.format.DateUtils.SECOND_IN_MILLIS; -import static com.android.bluetooth.ChangeIds.ENFORCE_CONNECT; -import static com.android.bluetooth.Utils.callerIsSystem; -import static com.android.bluetooth.Utils.callerIsSystemOrActiveOrManagedUser; import static com.android.bluetooth.Utils.getBytesFromAddress; import static com.android.bluetooth.Utils.isDualModeAudioEnabled; import static com.android.bluetooth.Utils.isPackageNameAccurate; @@ -60,7 +53,6 @@ import android.app.AppOpsManager; import android.app.PendingIntent; import android.app.Service; import android.app.admin.DevicePolicyManager; -import android.app.compat.CompatChanges; import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothActivityEnergyInfo; import android.bluetooth.BluetoothAdapter; @@ -72,7 +64,6 @@ import android.bluetooth.BluetoothFrameworkInitializer; import android.bluetooth.BluetoothLeAudio; import android.bluetooth.BluetoothMap; import android.bluetooth.BluetoothProfile; -import android.bluetooth.BluetoothProtoEnums; import android.bluetooth.BluetoothQualityReport; import android.bluetooth.BluetoothSap; import android.bluetooth.BluetoothServerSocket; @@ -82,16 +73,12 @@ import android.bluetooth.BluetoothStatusCodes; import android.bluetooth.BluetoothUtils; import android.bluetooth.BluetoothUuid; import android.bluetooth.BufferConstraints; -import android.bluetooth.IBluetooth; -import android.bluetooth.IBluetoothActivityEnergyInfoListener; import android.bluetooth.IBluetoothCallback; import android.bluetooth.IBluetoothConnectionCallback; -import android.bluetooth.IBluetoothHciVendorSpecificCallback; import android.bluetooth.IBluetoothMetadataListener; import android.bluetooth.IBluetoothOobDataCallback; import android.bluetooth.IBluetoothPreferredAudioProfilesCallback; import android.bluetooth.IBluetoothQualityReportReadyCallback; -import android.bluetooth.IBluetoothSocketManager; import android.bluetooth.IncomingRfcommSocketInfo; import android.bluetooth.OobData; import android.bluetooth.UidTraffic; @@ -115,7 +102,6 @@ import android.os.Message; import android.os.ParcelUuid; import android.os.Parcelable; import android.os.PowerManager; -import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.SystemClock; @@ -125,7 +111,6 @@ import android.provider.DeviceConfig; import android.provider.Settings; import android.sysprop.BluetoothProperties; import android.text.TextUtils; -import android.util.Base64; import android.util.Log; import android.util.Pair; import android.util.SparseArray; @@ -172,16 +157,10 @@ import com.android.bluetooth.telephony.BluetoothInCallService; import com.android.bluetooth.vc.VolumeControlService; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.modules.expresslog.Counter; import com.android.modules.utils.BackgroundThread; import com.android.modules.utils.BytesMatcher; -import libcore.util.SneakyThrow; - -import com.google.protobuf.InvalidProtocolBufferException; - import java.io.FileDescriptor; -import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.nio.file.FileVisitResult; @@ -195,7 +174,6 @@ import java.time.Instant; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -206,14 +184,12 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executor; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Pattern; -import java.util.stream.Collectors; public class AdapterService extends Service { private static final String TAG = @@ -225,9 +201,6 @@ public class AdapterService extends Service { private static final int MESSAGE_PREFERRED_AUDIO_PROFILES_AUDIO_FRAMEWORK_TIMEOUT = 4; private static final int CONTROLLER_ENERGY_UPDATE_TIMEOUT_MILLIS = 100; - private static final int MIN_ADVT_INSTANCES_FOR_MA = 5; - private static final int MIN_OFFLOADED_FILTERS = 10; - private static final int MIN_OFFLOADED_SCAN_STORAGE_BYTES = 1024; private static final Duration PENDING_SOCKET_HANDOFF_TIMEOUT = Duration.ofMinutes(1); private static final Duration GENERATE_LOCAL_OOB_DATA_TIMEOUT = Duration.ofSeconds(2); @@ -309,7 +282,7 @@ public class AdapterService extends Service { new ArrayList<>(); private BluetoothAdapter mAdapter; - @VisibleForTesting AdapterProperties mAdapterProperties; + private AdapterProperties mAdapterProperties; private AdapterState mAdapterStateMachine; private BondStateMachine mBondStateMachine; private RemoteDevices mRemoteDevices; @@ -341,10 +314,10 @@ public class AdapterService extends Service { private BluetoothSocketManagerBinder mBluetoothSocketManagerBinder; private BluetoothKeystoreService mBluetoothKeystoreService; - private A2dpService mA2dpService; - private A2dpSinkService mA2dpSinkService; private HeadsetService mHeadsetService; private HeadsetClientService mHeadsetClientService; + private A2dpService mA2dpService; + private A2dpSinkService mA2dpSinkService; private BluetoothMapService mMapService; private MapClientService mMapClientService; private HidDeviceService mHidDeviceService; @@ -422,10 +395,6 @@ public class AdapterService extends Service { return sAdapterService; } - AdapterNativeInterface getNative() { - return mNativeInterface; - } - /** Allow test to set an AdapterService to be return by AdapterService.getAdapterService() */ @VisibleForTesting public static synchronized void setAdapterService(AdapterService instance) { @@ -791,10 +760,76 @@ public class AdapterService extends Service { return mActiveDeviceManager; } + public RemoteDevices getRemoteDevices() { + return mRemoteDevices; + } + public SilenceDeviceManager getSilenceDeviceManager() { return mSilenceDeviceManager; } + AdapterNativeInterface getNative() { + return mNativeInterface; + } + + AdapterServiceHandler getHandler() { + return mHandler; + } + + DatabaseManager getDatabaseManager() { + return mDatabaseManager; + } + + AdapterProperties getAdapterProperties() { + return mAdapterProperties; + } + + Map<BluetoothDevice, RemoteCallbackList<IBluetoothMetadataListener>> getMetadataListeners() { + return mMetadataListeners; + } + + Map<String, CallerInfo> getBondAttemptCallerInfo() { + return mBondAttemptCallerInfo; + } + + Optional<PhonePolicy> getPhonePolicy() { + return mPhonePolicy; + } + + BondStateMachine getBondStateMachine() { + return mBondStateMachine; + } + + CompanionDeviceManager getCompanionDeviceManager() { + return mCompanionDeviceManager; + } + + BluetoothSocketManagerBinder getBluetoothSocketManagerBinder() { + return mBluetoothSocketManagerBinder; + } + + RemoteCallbackList<IBluetoothConnectionCallback> getBluetoothConnectionCallbacks() { + return mBluetoothConnectionCallbacks; + } + + RemoteCallbackList<IBluetoothPreferredAudioProfilesCallback> + getPreferredAudioProfilesCallbacks() { + return mPreferredAudioProfilesCallbacks; + } + + RemoteCallbackList<IBluetoothQualityReportReadyCallback> + getBluetoothQualityReportReadyCallbacks() { + return mBluetoothQualityReportReadyCallbacks; + } + + BluetoothHciVendorSpecificDispatcher getBluetoothHciVendorSpecificDispatcher() { + return mBluetoothHciVendorSpecificDispatcher; + } + + BluetoothHciVendorSpecificNativeInterface getBluetoothHciVendorSpecificNativeInterface() { + return mBluetoothHciVendorSpecificNativeInterface; + } + /** * Log L2CAP CoC Server Connection Metrics * @@ -1727,14 +1762,6 @@ public class AdapterService extends Service { * @return false if one of profile is enabled or disabled, true otherwise */ boolean isAllProfilesUnknown(BluetoothDevice device) { - if (mA2dpService != null - && mA2dpService.getConnectionPolicy(device) != CONNECTION_POLICY_UNKNOWN) { - return false; - } - if (mA2dpSinkService != null - && mA2dpSinkService.getConnectionPolicy(device) != CONNECTION_POLICY_UNKNOWN) { - return false; - } if (mHeadsetService != null && mHeadsetService.getConnectionPolicy(device) != CONNECTION_POLICY_UNKNOWN) { return false; @@ -1743,6 +1770,14 @@ public class AdapterService extends Service { && mHeadsetClientService.getConnectionPolicy(device) != CONNECTION_POLICY_UNKNOWN) { return false; } + if (mA2dpService != null + && mA2dpService.getConnectionPolicy(device) != CONNECTION_POLICY_UNKNOWN) { + return false; + } + if (mA2dpSinkService != null + && mA2dpSinkService.getConnectionPolicy(device) != CONNECTION_POLICY_UNKNOWN) { + return false; + } if (mMapClientService != null && mMapClientService.getConnectionPolicy(device) != CONNECTION_POLICY_UNKNOWN) { return false; @@ -1802,18 +1837,7 @@ public class AdapterService extends Service { Log.i(TAG, "connectEnabledProfiles: Connecting Coordinated Set Profile"); mCsipSetCoordinatorService.connect(device); } - if (mA2dpService != null - && isProfileSupported(device, BluetoothProfile.A2DP) - && mA2dpService.getConnectionPolicy(device) > CONNECTION_POLICY_FORBIDDEN) { - Log.i(TAG, "connectEnabledProfiles: Connecting A2dp"); - mA2dpService.connect(device); - } - if (mA2dpSinkService != null - && isProfileSupported(device, BluetoothProfile.A2DP_SINK) - && mA2dpSinkService.getConnectionPolicy(device) > CONNECTION_POLICY_FORBIDDEN) { - Log.i(TAG, "connectEnabledProfiles: Connecting A2dp Sink"); - mA2dpSinkService.connect(device); - } + // Order matters, some devices do not accept A2DP connection before HFP connection if (mHeadsetService != null && isProfileSupported(device, BluetoothProfile.HEADSET) && mHeadsetService.getConnectionPolicy(device) > CONNECTION_POLICY_FORBIDDEN) { @@ -1827,6 +1851,18 @@ public class AdapterService extends Service { Log.i(TAG, "connectEnabledProfiles: Connecting HFP"); mHeadsetClientService.connect(device); } + if (mA2dpService != null + && isProfileSupported(device, BluetoothProfile.A2DP) + && mA2dpService.getConnectionPolicy(device) > CONNECTION_POLICY_FORBIDDEN) { + Log.i(TAG, "connectEnabledProfiles: Connecting A2dp"); + mA2dpService.connect(device); + } + if (mA2dpSinkService != null + && isProfileSupported(device, BluetoothProfile.A2DP_SINK) + && mA2dpSinkService.getConnectionPolicy(device) > CONNECTION_POLICY_FORBIDDEN) { + Log.i(TAG, "connectEnabledProfiles: Connecting A2dp Sink"); + mA2dpSinkService.connect(device); + } if (mMapClientService != null && isProfileSupported(device, BluetoothProfile.MAP_CLIENT) && mMapClientService.getConnectionPolicy(device) > CONNECTION_POLICY_FORBIDDEN) { @@ -1909,10 +1945,10 @@ public class AdapterService extends Service { /** Initializes all the profile services fields */ private void initProfileServices() { Log.i(TAG, "initProfileServices: Initializing all bluetooth profile services"); - mA2dpService = A2dpService.getA2dpService(); - mA2dpSinkService = A2dpSinkService.getA2dpSinkService(); mHeadsetService = HeadsetService.getHeadsetService(); mHeadsetClientService = HeadsetClientService.getHeadsetClientService(); + mA2dpService = A2dpService.getA2dpService(); + mA2dpSinkService = A2dpSinkService.getA2dpSinkService(); mMapService = BluetoothMapService.getBluetoothMapService(); mMapClientService = MapClientService.getMapClientService(); mHidDeviceService = HidDeviceService.getHidDeviceService(); @@ -1932,7 +1968,7 @@ public class AdapterService extends Service { @BluetoothAdapter.RfcommListenerResult @RequiresPermission(BLUETOOTH_CONNECT) - private int startRfcommListener( + int startRfcommListener( String name, ParcelUuid uuid, PendingIntent pendingIntent, AttributionSource source) { if (mBluetoothServerSockets.containsKey(uuid.getUuid())) { Log.d(TAG, "Cannot start RFCOMM listener: UUID " + uuid.getUuid() + "already in use."); @@ -1949,7 +1985,6 @@ public class AdapterService extends Service { } @BluetoothAdapter.RfcommListenerResult - @VisibleForTesting int stopRfcommListener(ParcelUuid uuid, AttributionSource source) { RfcommListenerData listenerData = mBluetoothServerSockets.get(uuid.getUuid()); @@ -1968,7 +2003,6 @@ public class AdapterService extends Service { return listenerData.closeServerAndPendingSockets(mHandler); } - @VisibleForTesting IncomingRfcommSocketInfo retrievePendingSocketForServiceRecord( ParcelUuid uuid, AttributionSource source) { IncomingRfcommSocketInfo socketInfo = new IncomingRfcommSocketInfo(); @@ -2124,7 +2158,6 @@ public class AdapterService extends Service { } } - @VisibleForTesting boolean isAvailable() { return !mCleaningUp; } @@ -2160,2203 +2193,6 @@ public class AdapterService extends Service { } /** - * There is no leak of this binder since it is never re-used and the process is systematically - * killed - */ - @VisibleForTesting - public static class AdapterServiceBinder extends IBluetooth.Stub { - private final AdapterService mService; - - AdapterServiceBinder(AdapterService svc) { - mService = svc; - } - - public AdapterService getService() { - if (!mService.isAvailable()) { - return null; - } - return mService; - } - - @Override - public int getState() { - AdapterService service = getService(); - if (service == null) { - return BluetoothAdapter.STATE_OFF; - } - - return service.getState(); - } - - @Override - public void killBluetoothProcess() { - mService.enforceCallingPermission(BLUETOOTH_PRIVILEGED, null); - - Runnable killAction = - () -> { - if (Flags.killInsteadOfExit()) { - Log.i(TAG, "killBluetoothProcess: Calling killProcess(myPid())"); - Process.killProcess(Process.myPid()); - } else { - Log.i(TAG, "killBluetoothProcess: Calling System.exit"); - System.exit(0); - } - }; - - // Post on the main handler to let the cleanup complete before calling exit - mService.mHandler.post(killAction); - - try { - // Wait for Bluetooth to be killed from its main thread - Thread.sleep(1_000); // SystemServer is waiting 2000 ms, we need to wait less here - } catch (InterruptedException e) { - Log.e(TAG, "killBluetoothProcess: Interrupted while waiting for kill"); - } - - // Bluetooth cannot be killed on the main thread; it is in a deadLock. - // Trying to recover by killing the Bluetooth from the binder thread. - // This is bad :( - Counter.logIncrement("bluetooth.value_kill_from_binder_thread"); - Log.wtf(TAG, "Failed to kill Bluetooth using its main thread. Trying from binder"); - killAction.run(); - } - - @Override - public void offToBleOn(boolean quietMode, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "offToBleOn")) { - return; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.offToBleOn(quietMode); - } - - @Override - public void onToBleOn(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "onToBleOn")) { - return; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.onToBleOn(); - } - - @Override - public String getAddress(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getAddress") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getAddress")) { - return null; - } - - service.enforceCallingOrSelfPermission(LOCAL_MAC_ADDRESS, null); - - return Utils.getAddressStringFromByte(service.mAdapterProperties.getAddress()); - } - - @Override - public List<ParcelUuid> getUuids(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getUuids") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getUuids")) { - return Collections.emptyList(); - } - - ParcelUuid[] parcels = service.mAdapterProperties.getUuids(); - if (parcels == null) { - parcels = new ParcelUuid[0]; - } - return Arrays.asList(parcels); - } - - @Override - public String getIdentityAddress(String address) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getIdentityAddress") - || !Utils.checkConnectPermissionForDataDelivery( - service, - Utils.getCallingAttributionSource(mService), - "AdapterService getIdentityAddress")) { - return null; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.getIdentityAddress(address); - } - - @Override - @NonNull - public BluetoothAddress getIdentityAddressWithType(@NonNull String address) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "getIdentityAddressWithType") - || !Utils.checkConnectPermissionForDataDelivery( - service, - Utils.getCallingAttributionSource(mService), - "AdapterService getIdentityAddressWithType")) { - return new BluetoothAddress(null, BluetoothDevice.ADDRESS_TYPE_UNKNOWN); - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.getIdentityAddressWithType(address); - } - - @Override - public String getName(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getName") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getName")) { - return null; - } - - return service.getName(); - } - - @Override - public int getNameLengthForAdvertise(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "getNameLengthForAdvertise") - || !Utils.checkAdvertisePermissionForDataDelivery(service, source, TAG)) { - return -1; - } - - return service.getNameLengthForAdvertise(); - } - - @Override - public boolean setName(String name, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setName") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService setName")) { - return false; - } - - if (Flags.emptyNamesAreInvalid()) { - requireNonNull(name); - name = name.trim(); - if (name.isEmpty()) { - throw new IllegalArgumentException("Empty names are not valid"); - } - } - - Log.d(TAG, "AdapterServiceBinder.setName(" + name + ")"); - return service.mAdapterProperties.setName(name); - } - - @Override - public int getScanMode(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getScanMode") - || !Utils.checkScanPermissionForDataDelivery( - service, source, "AdapterService getScanMode")) { - return SCAN_MODE_NONE; - } - - return service.getScanMode(); - } - - @Override - public int setScanMode(int mode, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setScanMode") - || !Utils.checkScanPermissionForDataDelivery( - service, source, "AdapterService setScanMode")) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_SCAN_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - String logCaller = Utils.getUidPidString() + " packageName=" + source.getPackageName(); - CompletableFuture<Boolean> future = new CompletableFuture<>(); - mService.mHandler.post( - () -> - future.complete( - service.getState() == BluetoothAdapter.STATE_ON - && service.setScanMode(mode, logCaller))); - return future.join() - ? BluetoothStatusCodes.SUCCESS - : BluetoothStatusCodes.ERROR_UNKNOWN; - } - - @Override - public long getDiscoverableTimeout(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getDiscoverableTimeout") - || !Utils.checkScanPermissionForDataDelivery( - service, source, "AdapterService getDiscoverableTimeout")) { - return -1; - } - - return service.mAdapterProperties.getDiscoverableTimeout(); - } - - @Override - public int setDiscoverableTimeout(long timeout, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setDiscoverableTimeout") - || !Utils.checkScanPermissionForDataDelivery( - service, source, "AdapterService setDiscoverableTimeout")) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_SCAN_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.mAdapterProperties.setDiscoverableTimeout((int) timeout) - ? BluetoothStatusCodes.SUCCESS - : BluetoothStatusCodes.ERROR_UNKNOWN; - } - - @Override - public boolean startDiscovery(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "startDiscovery")) { - return false; - } - - if (!Utils.checkScanPermissionForDataDelivery(service, source, "Starting discovery.")) { - return false; - } - - Log.i(TAG, "startDiscovery: from " + Utils.getUidPidString()); - return service.startDiscovery(source); - } - - @Override - public boolean cancelDiscovery(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "cancelDiscovery") - || !Utils.checkScanPermissionForDataDelivery( - service, source, "AdapterService cancelDiscovery")) { - return false; - } - - Log.i(TAG, "cancelDiscovery: from " + Utils.getUidPidString()); - return service.mNativeInterface.cancelDiscovery(); - } - - @Override - public boolean isDiscovering(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "isDiscovering") - || !Utils.checkScanPermissionForDataDelivery( - service, source, "AdapterService isDiscovering")) { - return false; - } - - return service.mAdapterProperties.isDiscovering(); - } - - @Override - public long getDiscoveryEndMillis(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getDiscoveryEndMillis") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return -1; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.mAdapterProperties.discoveryEndMillis(); - } - - @Override - public List<BluetoothDevice> getMostRecentlyConnectedDevices(AttributionSource source) { - // don't check caller, may be called from system UI - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getMostRecentlyConnectedDevices")) { - return Collections.emptyList(); - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.mDatabaseManager.getMostRecentlyConnectedDevices(); - } - - @Override - public List<BluetoothDevice> getBondedDevices(AttributionSource source) { - // don't check caller, may be called from system UI - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getBondedDevices")) { - return Collections.emptyList(); - } - - return Arrays.asList(service.getBondedDevices()); - } - - @Override - public int getAdapterConnectionState() { - // don't check caller, may be called from system UI - AdapterService service = getService(); - if (service == null) { - return BluetoothAdapter.STATE_DISCONNECTED; - } - - return service.mAdapterProperties.getConnectionState(); - } - - /** - * This method has an associated binder cache. The invalidation methods must be changed if - * the logic behind this method changes. - */ - @Override - public int getProfileConnectionState(int profile, AttributionSource source) { - AdapterService service = getService(); - boolean checkConnect = false; - final int callingUid = Binder.getCallingUid(); - final long token = Binder.clearCallingIdentity(); - try { - checkConnect = CompatChanges.isChangeEnabled(ENFORCE_CONNECT, callingUid); - } finally { - Binder.restoreCallingIdentity(token); - } - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "getProfileConnectionState") - || (checkConnect - && !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getProfileConnectionState"))) { - return STATE_DISCONNECTED; - } - - return service.mAdapterProperties.getProfileConnectionState(profile); - } - - @Override - public boolean createBond( - BluetoothDevice device, - int transport, - OobData remoteP192Data, - OobData remoteP256Data, - AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "createBond") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService createBond")) { - return false; - } - - // This conditional is required to satisfy permission dependencies - // since createBond calls createBondOutOfBand with null value passed as data. - // BluetoothDevice#createBond requires BLUETOOTH_ADMIN only. - service.enforceBluetoothPrivilegedPermissionIfNeeded(remoteP192Data, remoteP256Data); - - Log.i( - TAG, - "createBond:" - + (" device=" + device) - + (" transport=" + transport) - + (" from " + Utils.getUidPidString())); - return service.createBond( - device, transport, remoteP192Data, remoteP256Data, source.getPackageName()); - } - - @Override - public boolean cancelBondProcess(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "cancelBondProcess") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService cancelBondProcess")) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - Log.i(TAG, "cancelBondProcess: device=" + device + ", from " + Utils.getUidPidString()); - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - if (deviceProp != null) { - deviceProp.setBondingInitiatedLocally(false); - } - - service.logUserBondResponse(device, false, source); - return service.mNativeInterface.cancelBond(getBytesFromAddress(device.getAddress())); - } - - @Override - public boolean removeBond(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "removeBond") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService removeBond")) { - return false; - } - - Log.i(TAG, "removeBond: device=" + device + ", from " + Utils.getUidPidString()); - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - if (deviceProp == null || deviceProp.getBondState() != BluetoothDevice.BOND_BONDED) { - Log.w( - TAG, - device - + " cannot be removed since " - + ((deviceProp == null) - ? "properties are empty" - : "bond state is " + deviceProp.getBondState())); - return false; - } - service.logUserBondResponse(device, false, source); - service.mBondAttemptCallerInfo.remove(device.getAddress()); - service.mPhonePolicy.ifPresent(policy -> policy.onRemoveBondRequest(device)); - deviceProp.setBondingInitiatedLocally(false); - - Message msg = service.mBondStateMachine.obtainMessage(BondStateMachine.REMOVE_BOND); - msg.obj = device; - service.mBondStateMachine.sendMessage(msg); - return true; - } - - @Override - public int getBondState(BluetoothDevice device, AttributionSource source) { - // don't check caller, may be called from system UI - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getBondState")) { - return BluetoothDevice.BOND_NONE; - } - - return service.getBondState(device); - } - - @Override - public boolean isBondingInitiatedLocally(BluetoothDevice device, AttributionSource source) { - // don't check caller, may be called from system UI - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService isBondingInitiatedLocally")) { - return false; - } - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - return deviceProp != null && deviceProp.isBondingInitiatedLocally(); - } - - @Override - public void generateLocalOobData( - int transport, IBluetoothOobDataCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "generateLocalOobData") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - service.generateLocalOobData(transport, callback); - } - - @Override - public long getSupportedProfiles(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return 0; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return Config.getSupportedProfilesBitMask(); - } - - @Override - public int getConnectionState(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getConnectionState")) { - return BluetoothDevice.CONNECTION_STATE_DISCONNECTED; - } - - return service.getConnectionState(device); - } - - @Override - public int getConnectionHandle( - BluetoothDevice device, int transport, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getConnectionHandle") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothDevice.ERROR; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.getConnectionHandle(device, transport); - } - - @Override - public boolean canBondWithoutDialog(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.canBondWithoutDialog(device); - } - - @Override - public String getPackageNameOfBondingApplication( - BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - - if (service == null - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return null; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.getPackageNameOfBondingApplication(device); - } - - @Override - public boolean removeActiveDevice(@ActiveDeviceUse int profiles, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "removeActiveDevice") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null); - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - Log.i( - TAG, - "removeActiveDevice: profiles=" - + profiles - + ", from " - + Utils.getUidPidString()); - return service.setActiveDevice(null, profiles); - } - - @Override - public boolean setActiveDevice( - BluetoothDevice device, @ActiveDeviceUse int profiles, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setActiveDevice") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null); - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - Log.i( - TAG, - "setActiveDevice: device=" - + device - + ", profiles=" - + profiles - + ", from " - + Utils.getUidPidString()); - - return service.setActiveDevice(device, profiles); - } - - @Override - public List<BluetoothDevice> getActiveDevices( - @ActiveDeviceProfile int profile, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getActiveDevices") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return Collections.emptyList(); - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.getActiveDevices(profile); - } - - @Override - public int connectAllEnabledProfiles(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null || !service.isEnabled()) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "connectAllEnabledProfiles")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - if (device == null) { - throw new IllegalArgumentException("device cannot be null"); - } - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - - service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null); - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - Log.i( - TAG, - "connectAllEnabledProfiles: device=" - + device - + ", from " - + Utils.getUidPidString()); - MetricsLogger.getInstance() - .logBluetoothEvent( - device, - BluetoothStatsLog - .BLUETOOTH_CROSS_LAYER_EVENT_REPORTED__EVENT_TYPE__INITIATOR_CONNECTION, - BluetoothStatsLog.BLUETOOTH_CROSS_LAYER_EVENT_REPORTED__STATE__START, - source.getUid()); - - try { - return service.connectAllEnabledProfiles(device); - } catch (Exception e) { - Log.v(TAG, "connectAllEnabledProfiles() failed", e); - SneakyThrow.sneakyThrow(e); - throw new RuntimeException(e); - } - } - - @Override - public int disconnectAllEnabledProfiles(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "disconnectAllEnabledProfiles")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - if (device == null) { - throw new IllegalArgumentException("device cannot be null"); - } - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - Log.i( - TAG, - "disconnectAllEnabledProfiles: device=" - + device - + ", from " - + Utils.getUidPidString()); - - try { - return service.disconnectAllEnabledProfiles(device); - } catch (Exception e) { - Log.v(TAG, "disconnectAllEnabledProfiles() failed", e); - SneakyThrow.sneakyThrow(e); - throw new RuntimeException(e); - } - } - - @Override - public String getRemoteName(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteName") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getRemoteName")) { - return null; - } - - return service.getRemoteName(device); - } - - @Override - public int getRemoteType(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteType") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getRemoteType")) { - return BluetoothDevice.DEVICE_TYPE_UNKNOWN; - } - - return service.getRemoteType(device); - } - - @Override - public String getRemoteAlias(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteAlias") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getRemoteAlias")) { - return null; - } - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - return deviceProp != null ? deviceProp.getAlias() : null; - } - - @Override - public int setRemoteAlias(BluetoothDevice device, String name, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setRemoteAlias")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - if (name != null && name.isEmpty()) { - throw new IllegalArgumentException("alias cannot be the empty string"); - } - - if (!Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService setRemoteAlias")) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - - Utils.enforceCdmAssociationIfNotBluetoothPrivileged( - service, service.mCompanionDeviceManager, source, device); - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - if (deviceProp == null) { - return BluetoothStatusCodes.ERROR_DEVICE_NOT_BONDED; - } - deviceProp.setAlias(device, name); - return BluetoothStatusCodes.SUCCESS; - } - - @Override - public int getRemoteClass(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteClass") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getRemoteClass")) { - return 0; - } - - return service.getRemoteClass(device); - } - - @Override - public List<ParcelUuid> getRemoteUuids(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteUuids") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getRemoteUuids")) { - return Collections.emptyList(); - } - - final ParcelUuid[] parcels = service.getRemoteUuids(device); - if (parcels == null) { - return null; - } - return Arrays.asList(parcels); - } - - @Override - public boolean fetchRemoteUuids( - BluetoothDevice device, int transport, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "fetchRemoteUuids") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService fetchRemoteUuids")) { - return false; - } - if (transport != TRANSPORT_AUTO) { - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - } - - Log.i( - TAG, - "fetchRemoteUuids: device=" - + device - + ", transport=" - + transport - + ", from " - + Utils.getUidPidString()); - - service.mRemoteDevices.fetchUuids(device, transport); - MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.SDP_FETCH_UUID_REQUEST, 1); - return true; - } - - @Override - public boolean setPin( - BluetoothDevice device, - boolean accept, - int len, - byte[] pinCode, - AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setPin") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService setPin")) { - return false; - } - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - // Only allow setting a pin in bonding state, or bonded state in case of security - // upgrade. - if (deviceProp == null || !deviceProp.isBondingOrBonded()) { - Log.e(TAG, "setPin: device=" + device + ", not bonding"); - return false; - } - if (pinCode.length != len) { - android.util.EventLog.writeEvent( - 0x534e4554, "139287605", -1, "PIN code length mismatch"); - return false; - } - service.logUserBondResponse(device, accept, source); - Log.i( - TAG, - "setPin: device=" - + device - + ", accept=" - + accept - + ", from " - + Utils.getUidPidString()); - return service.mNativeInterface.pinReply( - getBytesFromAddress(device.getAddress()), accept, len, pinCode); - } - - @Override - public boolean setPasskey( - BluetoothDevice device, - boolean accept, - int len, - byte[] passkey, - AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setPasskey") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService setPasskey")) { - return false; - } - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - if (deviceProp == null || !deviceProp.isBonding()) { - Log.e(TAG, "setPasskey: device=" + device + ", not bonding"); - return false; - } - if (passkey.length != len) { - android.util.EventLog.writeEvent( - 0x534e4554, "139287605", -1, "Passkey length mismatch"); - return false; - } - service.logUserBondResponse(device, accept, source); - Log.i( - TAG, - "setPasskey: device=" - + device - + ", accept=" - + accept - + ", from " - + Utils.getUidPidString()); - - return service.mNativeInterface.sspReply( - getBytesFromAddress(device.getAddress()), - AbstractionLayer.BT_SSP_VARIANT_PASSKEY_ENTRY, - accept, - Utils.byteArrayToInt(passkey)); - } - - @Override - public boolean setPairingConfirmation( - BluetoothDevice device, boolean accept, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setPairingConfirmation") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - if (deviceProp == null || !deviceProp.isBonding()) { - Log.e(TAG, "setPairingConfirmation: device=" + device + ", not bonding"); - return false; - } - service.logUserBondResponse(device, accept, source); - Log.i( - TAG, - "setPairingConfirmation: device=" - + device - + ", accept=" - + accept - + ", from " - + Utils.getUidPidString()); - - return service.mNativeInterface.sspReply( - getBytesFromAddress(device.getAddress()), - AbstractionLayer.BT_SSP_VARIANT_PASSKEY_CONFIRMATION, - accept, - 0); - } - - @Override - public boolean getSilenceMode(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getSilenceMode") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.mSilenceDeviceManager.getSilenceMode(device); - } - - @Override - public boolean setSilenceMode( - BluetoothDevice device, boolean silence, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setSilenceMode") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.mSilenceDeviceManager.setSilenceMode(device, silence); - return true; - } - - @Override - public int getPhonebookAccessPermission(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "getPhonebookAccessPermission") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getPhonebookAccessPermission")) { - return BluetoothDevice.ACCESS_UNKNOWN; - } - - return service.getPhonebookAccessPermission(device); - } - - @Override - public boolean setPhonebookAccessPermission( - BluetoothDevice device, int value, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "setPhonebookAccessPermission") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.setPhonebookAccessPermission(device, value); - return true; - } - - @Override - public int getMessageAccessPermission(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "getMessageAccessPermission") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getMessageAccessPermission")) { - return BluetoothDevice.ACCESS_UNKNOWN; - } - - return service.getMessageAccessPermission(device); - } - - @Override - public boolean setMessageAccessPermission( - BluetoothDevice device, int value, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "setMessageAccessPermission") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.setMessageAccessPermission(device, value); - return true; - } - - @Override - public int getSimAccessPermission(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getSimAccessPermission") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getSimAccessPermission")) { - return BluetoothDevice.ACCESS_UNKNOWN; - } - - return service.getSimAccessPermission(device); - } - - @Override - public boolean setSimAccessPermission( - BluetoothDevice device, int value, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setSimAccessPermission") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.setSimAccessPermission(device, value); - return true; - } - - @Override - public void logL2capcocServerConnection( - BluetoothDevice device, - int port, - boolean isSecured, - int result, - long socketCreationTimeMillis, - long socketCreationLatencyMillis, - long socketConnectionTimeMillis, - long timeoutMillis) { - AdapterService service = getService(); - if (service == null) { - return; - } - service.logL2capcocServerConnection( - device, - port, - isSecured, - result, - socketCreationTimeMillis, - socketCreationLatencyMillis, - socketConnectionTimeMillis, - timeoutMillis, - Binder.getCallingUid()); - } - - @Override - public IBluetoothSocketManager getSocketManager() { - AdapterService service = getService(); - if (service == null) { - return null; - } - - return IBluetoothSocketManager.Stub.asInterface(service.mBluetoothSocketManagerBinder); - } - - @Override - public void logL2capcocClientConnection( - BluetoothDevice device, - int port, - boolean isSecured, - int result, - long socketCreationTimeNanos, - long socketCreationLatencyNanos, - long socketConnectionTimeNanos) { - AdapterService service = getService(); - if (service == null) { - return; - } - service.logL2capcocClientConnection( - device, - port, - isSecured, - result, - socketCreationTimeNanos, - socketCreationLatencyNanos, - socketConnectionTimeNanos, - Binder.getCallingUid()); - } - - @Override - public void logRfcommConnectionAttempt( - BluetoothDevice device, - boolean isSecured, - int resultCode, - long socketCreationTimeNanos, - boolean isSerialPort) { - AdapterService service = getService(); - if (service == null) { - return; - } - service.logRfcommConnectionAttempt( - device, - isSecured, - resultCode, - socketCreationTimeNanos, - isSerialPort, - Binder.getCallingUid()); - } - - @Override - public boolean sdpSearch( - BluetoothDevice device, ParcelUuid uuid, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "sdpSearch") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService sdpSearch")) { - return false; - } - return service.sdpSearch(device, uuid); - } - - @Override - public int getBatteryLevel(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getBatteryLevel") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getBatteryLevel")) { - return BluetoothDevice.BATTERY_LEVEL_UNKNOWN; - } - - DeviceProperties deviceProp = service.mRemoteDevices.getDeviceProperties(device); - if (deviceProp == null) { - return BluetoothDevice.BATTERY_LEVEL_UNKNOWN; - } - return deviceProp.getBatteryLevel(); - } - - @Override - public int getMaxConnectedAudioDevices(AttributionSource source) { - // don't check caller, may be called from system UI - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getMaxConnectedAudioDevices")) { - return -1; - } - - return service.getMaxConnectedAudioDevices(); - } - - @Override - public boolean factoryReset(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.factoryReset(); - } - - @Override - public void registerBluetoothConnectionCallback( - IBluetoothConnectionCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "registerBluetoothConnectionCallback") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - service.mBluetoothConnectionCallbacks.register(callback); - } - - @Override - public void unregisterBluetoothConnectionCallback( - IBluetoothConnectionCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "unregisterBluetoothConnectionCallback") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - service.mBluetoothConnectionCallbacks.unregister(callback); - } - - @Override - public void registerCallback(IBluetoothCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "registerCallback") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.registerRemoteCallback(callback); - } - - @Override - public void unregisterCallback(IBluetoothCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "unregisterCallback") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.unregisterRemoteCallback(callback); - } - - @Override - public boolean isMultiAdvertisementSupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - int val = service.mAdapterProperties.getNumOfAdvertisementInstancesSupported(); - return val >= MIN_ADVT_INSTANCES_FOR_MA; - } - - /** - * This method has an associated binder cache. The invalidation methods must be changed if - * the logic behind this method changes. - */ - @Override - public boolean isOffloadedFilteringSupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - int val = service.getNumOfOffloadedScanFilterSupported(); - return val >= MIN_OFFLOADED_FILTERS; - } - - @Override - public boolean isOffloadedScanBatchingSupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - int val = service.getOffloadedScanResultStorage(); - return val >= MIN_OFFLOADED_SCAN_STORAGE_BYTES; - } - - @Override - public boolean isLe2MPhySupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - return service.isLe2MPhySupported(); - } - - @Override - public boolean isLeCodedPhySupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - return service.isLeCodedPhySupported(); - } - - @Override - public boolean isLeExtendedAdvertisingSupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - return service.isLeExtendedAdvertisingSupported(); - } - - @Override - public boolean isLePeriodicAdvertisingSupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - return service.isLePeriodicAdvertisingSupported(); - } - - @Override - public int isLeAudioSupported() { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - - Set<Integer> supportedProfileServices = - Arrays.stream(Config.getSupportedProfiles()) - .boxed() - .collect(Collectors.toSet()); - int[] leAudioUnicastProfiles = Config.getLeAudioUnicastProfiles(); - - if (Arrays.stream(leAudioUnicastProfiles) - .allMatch(supportedProfileServices::contains)) { - return BluetoothStatusCodes.FEATURE_SUPPORTED; - } - - return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; - } - - @Override - public int isLeAudioBroadcastSourceSupported() { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - - long supportBitMask = Config.getSupportedProfilesBitMask(); - if ((supportBitMask & (1 << BluetoothProfile.LE_AUDIO_BROADCAST)) != 0) { - return BluetoothStatusCodes.FEATURE_SUPPORTED; - } - - return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; - } - - @Override - public int isLeAudioBroadcastAssistantSupported() { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - - int[] supportedProfileServices = Config.getSupportedProfiles(); - - if (Arrays.stream(supportedProfileServices) - .anyMatch( - profileId -> - profileId == BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT)) { - return BluetoothStatusCodes.FEATURE_SUPPORTED; - } - - return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; - } - - @Override - public int isDistanceMeasurementSupported(AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } else if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "isDistanceMeasurementSupported")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } else if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return BluetoothStatusCodes.FEATURE_SUPPORTED; - } - - @Override - public int getLeMaximumAdvertisingDataLength() { - AdapterService service = getService(); - if (service == null) { - return 0; - } - - return service.getLeMaximumAdvertisingDataLength(); - } - - @Override - public boolean isActivityAndEnergyReportingSupported() { - AdapterService service = getService(); - if (service == null) { - return false; - } - - return service.mAdapterProperties.isActivityAndEnergyReportingSupported(); - } - - @Override - public BluetoothActivityEnergyInfo reportActivityInfo(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return null; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.reportActivityInfo(); - } - - @Override - public boolean registerMetadataListener( - IBluetoothMetadataListener listener, - BluetoothDevice device, - AttributionSource source) { - requireNonNull(device); - requireNonNull(listener); - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "registerMetadataListener") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.mHandler.post( - () -> - service.mMetadataListeners - .computeIfAbsent(device, k -> new RemoteCallbackList()) - .register(listener)); - - return true; - } - - @Override - public boolean unregisterMetadataListener( - IBluetoothMetadataListener listener, - BluetoothDevice device, - AttributionSource source) { - requireNonNull(device); - requireNonNull(listener); - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "unregisterMetadataListener") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.mHandler.post( - () -> - service.mMetadataListeners.computeIfPresent( - device, - (k, v) -> { - v.unregister(listener); - if (v.getRegisteredCallbackCount() == 0) { - return null; - } - return v; - })); - return true; - } - - @Override - public boolean setMetadata( - BluetoothDevice device, int key, byte[] value, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setMetadata") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return false; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.setMetadata(device, key, value); - } - - @Override - public byte[] getMetadata(BluetoothDevice device, int key, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getMetadata") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return null; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.getMetadata(device, key); - } - - @Override - public int isRequestAudioPolicyAsSinkSupported( - BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "isRequestAudioPolicyAsSinkSupported") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.FEATURE_NOT_CONFIGURED; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.isRequestAudioPolicyAsSinkSupported(device); - } - - @Override - public int requestAudioPolicyAsSink( - BluetoothDevice device, - BluetoothSinkAudioPolicy policies, - AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } else if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "requestAudioPolicyAsSink")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } else if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.requestAudioPolicyAsSink(device, policies); - } - - @Override - public BluetoothSinkAudioPolicy getRequestedAudioPolicyAsSink( - BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "getRequestedAudioPolicyAsSink") - || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return null; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.getRequestedAudioPolicyAsSink(device); - } - - @Override - public void requestActivityInfo( - IBluetoothActivityEnergyInfoListener listener, AttributionSource source) { - BluetoothActivityEnergyInfo info = reportActivityInfo(source); - try { - listener.onBluetoothActivityEnergyInfoAvailable(info); - } catch (RemoteException e) { - Log.e(TAG, "onBluetoothActivityEnergyInfo: RemoteException", e); - } - } - - @Override - public void bleOnToOn(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "bleOnToOn")) { - return; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.bleOnToOn(); - } - - @Override - public void bleOnToOff(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "bleOnToOff")) { - return; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.bleOnToOff(); - } - - @Override - public void dump(FileDescriptor fd, String[] args) { - PrintWriter writer = new PrintWriter(new FileOutputStream(fd)); - AdapterService service = getService(); - if (service == null) { - return; - } - - service.enforceCallingOrSelfPermission(DUMP, null); - - service.dump(fd, writer, args); - writer.close(); - } - - @Override - public boolean allowLowLatencyAudio(boolean allowed, BluetoothDevice device) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "allowLowLatencyAudio") - || !Utils.checkConnectPermissionForDataDelivery( - service, - Utils.getCallingAttributionSource(service), - "AdapterService allowLowLatencyAudio")) { - return false; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.allowLowLatencyAudio(allowed, device); - } - - @Override - public int startRfcommListener( - String name, - ParcelUuid uuid, - PendingIntent pendingIntent, - AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "startRfcommListener") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService startRfcommListener")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.startRfcommListener(name, uuid, pendingIntent, source); - } - - @Override - public int stopRfcommListener(ParcelUuid uuid, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser(service, TAG, "stopRfcommListener") - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService stopRfcommListener")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.stopRfcommListener(uuid, source); - } - - @Override - public IncomingRfcommSocketInfo retrievePendingSocketForServiceRecord( - ParcelUuid uuid, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "retrievePendingSocketForServiceRecord") - || !Utils.checkConnectPermissionForDataDelivery( - service, - source, - "AdapterService retrievePendingSocketForServiceRecord")) { - return null; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.retrievePendingSocketForServiceRecord(uuid, source); - } - - @Override - public void setForegroundUserId(int userId, AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, - Utils.getCallingAttributionSource(mService), - "AdapterService setForegroundUserId")) { - return; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - Utils.setForegroundUserId(userId); - } - - @Override - public int setPreferredAudioProfiles( - BluetoothDevice device, Bundle modeToProfileBundle, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setPreferredAudioProfiles")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - requireNonNull(device); - requireNonNull(modeToProfileBundle); - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (service.getBondState(device) != BluetoothDevice.BOND_BONDED) { - return BluetoothStatusCodes.ERROR_DEVICE_NOT_BONDED; - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.setPreferredAudioProfiles(device, modeToProfileBundle); - } - - @Override - public Bundle getPreferredAudioProfiles(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return Bundle.EMPTY; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "getPreferredAudioProfiles")) { - return Bundle.EMPTY; - } - requireNonNull(device); - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (service.getBondState(device) != BluetoothDevice.BOND_BONDED) { - return Bundle.EMPTY; - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return Bundle.EMPTY; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.getPreferredAudioProfiles(device); - } - - @Override - public int notifyActiveDeviceChangeApplied( - BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystem(TAG, "notifyActiveDeviceChangeApplied")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - requireNonNull(device); - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (service.getBondState(device) != BluetoothDevice.BOND_BONDED) { - return BluetoothStatusCodes.ERROR_DEVICE_NOT_BONDED; - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.notifyActiveDeviceChangeApplied(device); - } - - @Override - public int isDualModeAudioEnabled(AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - if (!Utils.isDualModeAudioEnabled()) { - return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; - } - - return BluetoothStatusCodes.SUCCESS; - } - - @Override - public int registerPreferredAudioProfilesChangedCallback( - IBluetoothPreferredAudioProfilesCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "registerPreferredAudioProfilesChangedCallback")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - requireNonNull(callback); - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - // If LE only mode is enabled, the dual mode audio feature is disabled - if (!Utils.isDualModeAudioEnabled()) { - return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; - } - - service.mPreferredAudioProfilesCallbacks.register(callback); - return BluetoothStatusCodes.SUCCESS; - } - - @Override - public int unregisterPreferredAudioProfilesChangedCallback( - IBluetoothPreferredAudioProfilesCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "unregisterPreferredAudioProfilesChangedCallback")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - requireNonNull(callback); - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - if (!service.mPreferredAudioProfilesCallbacks.unregister(callback)) { - Log.e( - TAG, - "unregisterPreferredAudioProfilesChangedCallback: callback was never " - + "registered"); - return BluetoothStatusCodes.ERROR_CALLBACK_NOT_REGISTERED; - } - return BluetoothStatusCodes.SUCCESS; - } - - @Override - public int registerBluetoothQualityReportReadyCallback( - IBluetoothQualityReportReadyCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "registerBluetoothQualityReportReadyCallback")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - requireNonNull(callback); - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - service.mBluetoothQualityReportReadyCallbacks.register(callback); - return BluetoothStatusCodes.SUCCESS; - } - - @Override - public int unregisterBluetoothQualityReportReadyCallback( - IBluetoothQualityReportReadyCallback callback, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "unregisterBluetoothQualityReportReadyCallback")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - requireNonNull(callback); - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - if (!service.mBluetoothQualityReportReadyCallbacks.unregister(callback)) { - Log.e( - TAG, - "unregisterBluetoothQualityReportReadyCallback: callback was never " - + "registered"); - return BluetoothStatusCodes.ERROR_CALLBACK_NOT_REGISTERED; - } - return BluetoothStatusCodes.SUCCESS; - } - - @Override - public void registerHciVendorSpecificCallback( - IBluetoothHciVendorSpecificCallback callback, int[] eventCodes) { - AdapterService service = getService(); - if (service == null) { - return; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "registerHciVendorSpecificCallback")) { - throw new SecurityException("not allowed"); - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - requireNonNull(callback); - requireNonNull(eventCodes); - - Set<Integer> eventCodesSet = - Arrays.stream(eventCodes).boxed().collect(Collectors.toSet()); - if (eventCodesSet.stream() - .anyMatch((n) -> (n < 0) || (n >= 0x52 && n < 0x60) || (n > 0xff))) { - throw new IllegalArgumentException("invalid vendor-specific event code"); - } - - service.mBluetoothHciVendorSpecificDispatcher.register(callback, eventCodesSet); - } - - @Override - public void unregisterHciVendorSpecificCallback( - IBluetoothHciVendorSpecificCallback callback) { - AdapterService service = getService(); - if (service == null) { - return; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "unregisterHciVendorSpecificCallback")) { - throw new SecurityException("not allowed"); - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - requireNonNull(callback); - - service.mBluetoothHciVendorSpecificDispatcher.unregister(callback); - } - - @Override - public void sendHciVendorSpecificCommand( - int ocf, byte[] parameters, IBluetoothHciVendorSpecificCallback callback) { - AdapterService service = getService(); - if (service == null) { - return; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "sendHciVendorSpecificCommand")) { - throw new SecurityException("not allowed"); - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - // Open this no-op android command for test purpose - int getVendorCapabilitiesOcf = 0x153; - if (ocf < 0 - || (ocf >= 0x150 && ocf < 0x160 && ocf != getVendorCapabilitiesOcf) - || (ocf > 0x3ff)) { - throw new IllegalArgumentException("invalid vendor-specific event code"); - } - requireNonNull(parameters); - if (parameters.length > 255) { - throw new IllegalArgumentException("Parameters size is too big"); - } - - Optional<byte[]> cookie = - service.mBluetoothHciVendorSpecificDispatcher.getRegisteredCookie(callback); - if (!cookie.isPresent()) { - Log.e(TAG, "send command without registered callback"); - throw new IllegalStateException("callback not registered"); - } - - service.mBluetoothHciVendorSpecificNativeInterface.sendCommand( - ocf, parameters, cookie.get()); - } - - @Override - public int getOffloadedTransportDiscoveryDataScanSupported(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !callerIsSystemOrActiveOrManagedUser( - service, TAG, "getOffloadedTransportDiscoveryDataScanSupported") - || !Utils.checkScanPermissionForDataDelivery( - service, source, "getOffloadedTransportDiscoveryDataScanSupported")) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_SCAN_PERMISSION; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.getOffloadedTransportDiscoveryDataScanSupported(); - } - - @Override - public boolean isMediaProfileConnected(AttributionSource source) { - AdapterService service = getService(); - if (service == null - || !Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService.isMediaProfileConnected")) { - return false; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - - return service.isMediaProfileConnected(); - } - - @Override - public IBinder getBluetoothGatt() { - AdapterService service = getService(); - return service == null ? null : service.getBluetoothGatt(); - } - - @Override - public IBinder getBluetoothScan() { - AdapterService service = getService(); - return service == null ? null : service.getBluetoothScan(); - } - - @Override - public void unregAllGattClient(AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - service.unregAllGattClient(source); - } - - @Override - public IBinder getProfile(int profileId) { - AdapterService service = getService(); - if (service == null) { - return null; - } - - return service.getProfile(profileId); - } - - @Override - public int setActiveAudioDevicePolicy( - BluetoothDevice device, int activeAudioDevicePolicy, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setActiveAudioDevicePolicy")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.mDatabaseManager.setActiveAudioDevicePolicy( - device, activeAudioDevicePolicy); - } - - @Override - public int getActiveAudioDevicePolicy(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return BluetoothDevice.ACTIVE_AUDIO_DEVICE_POLICY_DEFAULT; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "getActiveAudioDevicePolicy")) { - throw new IllegalStateException( - "Caller is not the system or part of the active/managed user"); - } - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { - return BluetoothDevice.ACTIVE_AUDIO_DEVICE_POLICY_DEFAULT; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.mDatabaseManager.getActiveAudioDevicePolicy(device); - } - - @Override - public int setMicrophonePreferredForCalls( - BluetoothDevice device, boolean enabled, AttributionSource source) { - requireNonNull(device); - AdapterService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "setMicrophonePreferredForCalls")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (!Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService setMicrophonePreferredForCalls")) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.mDatabaseManager.setMicrophonePreferredForCalls(device, enabled); - } - - @Override - public boolean isMicrophonePreferredForCalls( - BluetoothDevice device, AttributionSource source) { - requireNonNull(device); - AdapterService service = getService(); - if (service == null) { - return true; - } - if (!callerIsSystemOrActiveOrManagedUser( - service, TAG, "isMicrophonePreferredForCalls")) { - throw new IllegalStateException( - "Caller is not the system or part of the active/managed user"); - } - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (!Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService isMicrophonePreferredForCalls")) { - return true; - } - - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.mDatabaseManager.isMicrophonePreferredForCalls(device); - } - - @Override - public boolean isLeCocSocketOffloadSupported(AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return false; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.isLeCocSocketOffloadSupported(); - } - - @Override - public boolean isRfcommSocketOffloadSupported(AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return false; - } - service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - return service.isRfcommSocketOffloadSupported(); - } - - @Override - public IBinder getBluetoothAdvertise() { - AdapterService service = getService(); - return service == null ? null : service.getBluetoothAdvertise(); - } - - @Override - public IBinder getDistanceMeasurement() { - AdapterService service = getService(); - return service == null ? null : service.getDistanceMeasurement(); - } - - @Override - public int getKeyMissingCount(BluetoothDevice device, AttributionSource source) { - AdapterService service = getService(); - if (service == null) { - return -1; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "getKeyMissingCount")) { - throw new IllegalStateException( - "Caller is not the system or part of the active/managed user"); - } - if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { - throw new IllegalArgumentException("device cannot have an invalid address"); - } - if (!Utils.checkConnectPermissionForDataDelivery( - service, source, "AdapterService getKeyMissingCount")) { - return -1; - } - - return service.mDatabaseManager.getKeyMissingCount(device); - } - } - - /** * Gets the preferred audio profiles for the device. See {@link * BluetoothAdapter#getPreferredAudioProfiles(BluetoothDevice)} for more details. * @@ -4429,7 +2265,7 @@ public class AdapterService extends Service { * @param modeToProfileBundle is the preferences we want to set for the device * @return whether the preferences were successfully requested */ - private int setPreferredAudioProfiles(BluetoothDevice device, Bundle modeToProfileBundle) { + int setPreferredAudioProfiles(BluetoothDevice device, Bundle modeToProfileBundle) { Log.i(TAG, "setPreferredAudioProfiles for device=" + device); if (!isDualModeAudioEnabled()) { Log.e(TAG, "setPreferredAudioProfiles called while sysprop is disabled"); @@ -4649,7 +2485,7 @@ public class AdapterService extends Service { * @param device the remote device whose preferred audio profiles have been changed * @return whether the Bluetooth stack acknowledged the change successfully */ - private int notifyActiveDeviceChangeApplied(BluetoothDevice device) { + int notifyActiveDeviceChangeApplied(BluetoothDevice device) { if (mLeAudioService == null) { Log.e(TAG, "LE Audio profile not enabled"); return BluetoothStatusCodes.ERROR_PROFILE_NOT_CONNECTED; @@ -4919,6 +2755,15 @@ public class AdapterService extends Service { return new BluetoothAddress(identityAddress, identityAddressType); } + public boolean addAssociatedPackage(BluetoothDevice device, String packageName) { + DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device); + if (deviceProp == null) { + return false; + } + deviceProp.addPackage(packageName); + return true; + } + private record CallerInfo(String callerPackageName, UserHandle user) {} boolean createBond( @@ -5368,35 +3213,32 @@ public class AdapterService extends Service { Log.e(TAG, "setActiveDevice: Bluetooth is not enabled"); return false; } - boolean setA2dp = false; boolean setHeadset = false; + boolean setA2dp = false; // Determine for which profiles we want to set device as our active device switch (profiles) { - case BluetoothAdapter.ACTIVE_DEVICE_AUDIO: - setA2dp = true; - break; - case BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL: + case BluetoothAdapter.ACTIVE_DEVICE_PHONE_CALL -> setHeadset = true; + case BluetoothAdapter.ACTIVE_DEVICE_AUDIO -> setA2dp = true; + case BluetoothAdapter.ACTIVE_DEVICE_ALL -> { setHeadset = true; - break; - case BluetoothAdapter.ACTIVE_DEVICE_ALL: setA2dp = true; - setHeadset = true; - break; - default: + } + default -> { return false; + } } - boolean a2dpSupported = - mA2dpService != null - && (device == null - || mA2dpService.getConnectionPolicy(device) - == CONNECTION_POLICY_ALLOWED); boolean hfpSupported = mHeadsetService != null && (device == null || mHeadsetService.getConnectionPolicy(device) == CONNECTION_POLICY_ALLOWED); + boolean a2dpSupported = + mA2dpService != null + && (device == null + || mA2dpService.getConnectionPolicy(device) + == CONNECTION_POLICY_ALLOWED); boolean leAudioSupported = mLeAudioService != null && (device == null @@ -5419,6 +3261,12 @@ public class AdapterService extends Service { } } + // Order matters, some devices do not accept A2DP connection before HFP connection + if (setHeadset && hfpSupported) { + Log.i(TAG, "setActiveDevice: Setting active Headset " + device); + mHeadsetService.setActiveDevice(device); + } + if (setA2dp && a2dpSupported) { Log.i(TAG, "setActiveDevice: Setting active A2dp device " + device); if (device == null) { @@ -5450,11 +3298,6 @@ public class AdapterService extends Service { } } - if (setHeadset && hfpSupported) { - Log.i(TAG, "setActiveDevice: Setting active Headset " + device); - mHeadsetService.setActiveDevice(device); - } - return true; } @@ -5469,8 +3312,8 @@ public class AdapterService extends Service { if (mLeAudioService == null) { return false; } - boolean a2dpSupported = isProfileSupported(leAudioDevice, BluetoothProfile.A2DP); boolean hfpSupported = isProfileSupported(leAudioDevice, BluetoothProfile.HEADSET); + boolean a2dpSupported = isProfileSupported(leAudioDevice, BluetoothProfile.A2DP); List<BluetoothDevice> groupDevices = mLeAudioService.getGroupDevices(leAudioDevice); if (hfpSupported && mHeadsetService != null) { @@ -5576,26 +3419,11 @@ public class AdapterService extends Service { return BluetoothStatusCodes.SUCCESS; } - /** - * Connect all supported bluetooth profiles between the local and remote device - * - * @param device is the remote device with which to connect all supported profiles - */ + /** All profile toggles are disabled, so connects all supported profiles */ void connectAllSupportedProfiles(BluetoothDevice device) { int numProfilesConnected = 0; - // All profile toggles disabled, so connects all supported profiles - if (mA2dpService != null && isProfileSupported(device, BluetoothProfile.A2DP)) { - Log.i(TAG, "connectAllSupportedProfiles: Connecting A2dp"); - // Set connection policy also connects the profile with CONNECTION_POLICY_ALLOWED - mA2dpService.setConnectionPolicy(device, CONNECTION_POLICY_ALLOWED); - numProfilesConnected++; - } - if (mA2dpSinkService != null && isProfileSupported(device, BluetoothProfile.A2DP_SINK)) { - Log.i(TAG, "connectAllSupportedProfiles: Connecting A2dp Sink"); - mA2dpSinkService.setConnectionPolicy(device, CONNECTION_POLICY_ALLOWED); - numProfilesConnected++; - } + // Order matters, some devices do not accept A2DP connection before HFP connection if (mHeadsetService != null && isProfileSupported(device, BluetoothProfile.HEADSET)) { Log.i(TAG, "connectAllSupportedProfiles: Connecting Headset Profile"); mHeadsetService.setConnectionPolicy(device, CONNECTION_POLICY_ALLOWED); @@ -5607,6 +3435,17 @@ public class AdapterService extends Service { mHeadsetClientService.setConnectionPolicy(device, CONNECTION_POLICY_ALLOWED); numProfilesConnected++; } + if (mA2dpService != null && isProfileSupported(device, BluetoothProfile.A2DP)) { + Log.i(TAG, "connectAllSupportedProfiles: Connecting A2dp"); + // Set connection policy also connects the profile with CONNECTION_POLICY_ALLOWED + mA2dpService.setConnectionPolicy(device, CONNECTION_POLICY_ALLOWED); + numProfilesConnected++; + } + if (mA2dpSinkService != null && isProfileSupported(device, BluetoothProfile.A2DP_SINK)) { + Log.i(TAG, "connectAllSupportedProfiles: Connecting A2dp Sink"); + mA2dpSinkService.setConnectionPolicy(device, CONNECTION_POLICY_ALLOWED); + numProfilesConnected++; + } if (mMapClientService != null && isProfileSupported(device, BluetoothProfile.MAP_CLIENT)) { Log.i(TAG, "connectAllSupportedProfiles: Connecting MAP"); mMapClientService.setConnectionPolicy(device, CONNECTION_POLICY_ALLOWED); @@ -5695,18 +3534,6 @@ public class AdapterService extends Service { return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; } - if (mA2dpService != null - && (mA2dpService.getConnectionState(device) == STATE_CONNECTED - || mA2dpService.getConnectionState(device) == STATE_CONNECTING)) { - Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting A2dp"); - mA2dpService.disconnect(device); - } - if (mA2dpSinkService != null - && (mA2dpSinkService.getConnectionState(device) == STATE_CONNECTED - || mA2dpSinkService.getConnectionState(device) == STATE_CONNECTING)) { - Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting A2dp Sink"); - mA2dpSinkService.disconnect(device); - } if (mHeadsetService != null && (mHeadsetService.getConnectionState(device) == STATE_CONNECTED || mHeadsetService.getConnectionState(device) == STATE_CONNECTING)) { @@ -5719,6 +3546,18 @@ public class AdapterService extends Service { Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting HFP"); mHeadsetClientService.disconnect(device); } + if (mA2dpService != null + && (mA2dpService.getConnectionState(device) == STATE_CONNECTED + || mA2dpService.getConnectionState(device) == STATE_CONNECTING)) { + Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting A2dp"); + mA2dpService.disconnect(device); + } + if (mA2dpSinkService != null + && (mA2dpSinkService.getConnectionState(device) == STATE_CONNECTED + || mA2dpSinkService.getConnectionState(device) == STATE_CONNECTING)) { + Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting A2dp Sink"); + mA2dpSinkService.disconnect(device); + } if (mMapClientService != null && (mMapClientService.getConnectionState(device) == STATE_CONNECTED || mMapClientService.getConnectionState(device) == STATE_CONNECTING)) { @@ -6105,27 +3944,22 @@ public class AdapterService extends Service { mLocalCallbacks.remove(callback); } - @VisibleForTesting void registerRemoteCallback(IBluetoothCallback callback) { mSystemServerCallbacks.register(callback); } - @VisibleForTesting void unregisterRemoteCallback(IBluetoothCallback callback) { mSystemServerCallbacks.unregister(callback); } - @VisibleForTesting void bleOnToOn() { mAdapterStateMachine.sendMessage(AdapterState.USER_TURN_ON); } - @VisibleForTesting void bleOnToOff() { mAdapterStateMachine.sendMessage(AdapterState.BLE_TURN_OFF); } - @VisibleForTesting boolean factoryReset() { mDatabaseManager.factoryReset(); @@ -6144,12 +3978,11 @@ public class AdapterService extends Service { return mNativeInterface.factoryReset(); } - @VisibleForTesting int getScanMode() { return mScanMode; } - private boolean setScanMode(int mode, String from) { + boolean setScanMode(int mode, String from) { mScanModeChanges.add(from + ": " + scanModeName(mode)); if (!mNativeInterface.setScanMode(convertScanModeToHal(mode))) { return false; @@ -6163,7 +3996,6 @@ public class AdapterService extends Service { return true; } - @VisibleForTesting BluetoothActivityEnergyInfo reportActivityInfo() { if (mAdapterProperties.getState() != BluetoothAdapter.STATE_ON || !mAdapterProperties.isActivityAndEnergyReportingSupported()) { @@ -6378,12 +4210,12 @@ public class AdapterService extends Service { /** Handle Bluetooth profiles when bond state changes with a {@link BluetoothDevice} */ public void handleBondStateChanged(BluetoothDevice device, int fromState, int toState) { - if (mA2dpService != null && mA2dpService.isAvailable()) { - mA2dpService.handleBondStateChanged(device, fromState, toState); - } if (mHeadsetService != null && mHeadsetService.isAvailable()) { mHeadsetService.handleBondStateChanged(device, fromState, toState); } + if (mA2dpService != null && mA2dpService.isAvailable()) { + mA2dpService.handleBondStateChanged(device, fromState, toState); + } if (mLeAudioService != null && mLeAudioService.isAvailable()) { mLeAudioService.handleBondStateChanged(device, fromState, toState); } @@ -6609,10 +4441,6 @@ public class AdapterService extends Service { return BluetoothProperties.getHardwareOperatingVoltageMv().orElse(0) / 1000.0; } - public RemoteDevices getRemoteDevices() { - return mRemoteDevices; - } - private static String scanModeName(int scanMode) { return switch (scanMode) { case SCAN_MODE_NONE -> "SCAN_MODE_NONE"; @@ -6701,14 +4529,6 @@ public class AdapterService extends Service { } } - @SuppressLint("AndroidFrameworkRequiresPermission") - private void enforceBluetoothPrivilegedPermissionIfNeeded( - OobData remoteP192Data, OobData remoteP256Data) { - if (remoteP192Data != null || remoteP256Data != null) { - this.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); - } - } - private final Object mDeviceConfigLock = new Object(); /** diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterServiceBinder.java b/android/app/src/com/android/bluetooth/btservice/AdapterServiceBinder.java new file mode 100644 index 0000000000..aff6642b7d --- /dev/null +++ b/android/app/src/com/android/bluetooth/btservice/AdapterServiceBinder.java @@ -0,0 +1,2262 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bluetooth.btservice; + +import static android.Manifest.permission.BLUETOOTH_PRIVILEGED; +import static android.Manifest.permission.DUMP; +import static android.Manifest.permission.LOCAL_MAC_ADDRESS; +import static android.Manifest.permission.MODIFY_PHONE_STATE; +import static android.bluetooth.BluetoothAdapter.SCAN_MODE_NONE; +import static android.bluetooth.BluetoothDevice.TRANSPORT_AUTO; +import static android.bluetooth.BluetoothProfile.STATE_DISCONNECTED; + +import static com.android.bluetooth.ChangeIds.ENFORCE_CONNECT; +import static com.android.bluetooth.Utils.callerIsSystem; +import static com.android.bluetooth.Utils.callerIsSystemOrActiveOrManagedUser; +import static com.android.bluetooth.Utils.checkConnectPermissionForDataDelivery; +import static com.android.bluetooth.Utils.checkScanPermissionForDataDelivery; +import static com.android.bluetooth.Utils.getBytesFromAddress; +import static com.android.bluetooth.Utils.getUidPidString; + +import static java.util.Objects.requireNonNull; + +import android.annotation.NonNull; +import android.app.PendingIntent; +import android.app.compat.CompatChanges; +import android.bluetooth.BluetoothActivityEnergyInfo; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.ActiveDeviceProfile; +import android.bluetooth.BluetoothAdapter.ActiveDeviceUse; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothDevice.BluetoothAddress; +import android.bluetooth.BluetoothProfile; +import android.bluetooth.BluetoothProtoEnums; +import android.bluetooth.BluetoothSinkAudioPolicy; +import android.bluetooth.BluetoothStatusCodes; +import android.bluetooth.IBluetooth; +import android.bluetooth.IBluetoothActivityEnergyInfoListener; +import android.bluetooth.IBluetoothCallback; +import android.bluetooth.IBluetoothConnectionCallback; +import android.bluetooth.IBluetoothHciVendorSpecificCallback; +import android.bluetooth.IBluetoothMetadataListener; +import android.bluetooth.IBluetoothOobDataCallback; +import android.bluetooth.IBluetoothPreferredAudioProfilesCallback; +import android.bluetooth.IBluetoothQualityReportReadyCallback; +import android.bluetooth.IBluetoothSocketManager; +import android.bluetooth.IncomingRfcommSocketInfo; +import android.bluetooth.OobData; +import android.content.AttributionSource; +import android.os.Binder; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Message; +import android.os.ParcelUuid; +import android.os.Process; +import android.os.RemoteCallbackList; +import android.os.RemoteException; +import android.util.Log; + +import com.android.bluetooth.BluetoothStatsLog; +import com.android.bluetooth.Utils; +import com.android.bluetooth.btservice.RemoteDevices.DeviceProperties; +import com.android.bluetooth.flags.Flags; +import com.android.modules.expresslog.Counter; + +import libcore.util.SneakyThrow; + +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +/** + * There is no leak of this binder since it is never re-used and the process is systematically + * killed + */ +class AdapterServiceBinder extends IBluetooth.Stub { + private static final String TAG = + Utils.TAG_PREFIX_BLUETOOTH + AdapterServiceBinder.class.getSimpleName(); + + private static final int MIN_ADVT_INSTANCES_FOR_MA = 5; + private static final int MIN_OFFLOADED_FILTERS = 10; + private static final int MIN_OFFLOADED_SCAN_STORAGE_BYTES = 1024; + + private final AdapterService mService; + + AdapterServiceBinder(AdapterService svc) { + mService = svc; + } + + public AdapterService getService() { + if (!mService.isAvailable()) { + return null; + } + return mService; + } + + @Override + public int getState() { + AdapterService service = getService(); + if (service == null) { + return BluetoothAdapter.STATE_OFF; + } + + return service.getState(); + } + + @Override + public void killBluetoothProcess() { + mService.enforceCallingPermission(BLUETOOTH_PRIVILEGED, null); + + Runnable killAction = + () -> { + if (Flags.killInsteadOfExit()) { + Log.i(TAG, "killBluetoothProcess: Calling killProcess(myPid())"); + Process.killProcess(Process.myPid()); + } else { + Log.i(TAG, "killBluetoothProcess: Calling System.exit"); + System.exit(0); + } + }; + + // Post on the main handler to let the cleanup complete before calling exit + mService.getHandler().post(killAction); + + try { + // Wait for Bluetooth to be killed from its main thread + Thread.sleep(1_000); // SystemServer is waiting 2000 ms, we need to wait less here + } catch (InterruptedException e) { + Log.e(TAG, "killBluetoothProcess: Interrupted while waiting for kill"); + } + + // Bluetooth cannot be killed on the main thread; it is in a deadLock. + // Trying to recover by killing the Bluetooth from the binder thread. + // This is bad :( + Counter.logIncrement("bluetooth.value_kill_from_binder_thread"); + Log.wtf(TAG, "Failed to kill Bluetooth using its main thread. Trying from binder"); + killAction.run(); + } + + @Override + public void offToBleOn(boolean quietMode, AttributionSource source) { + AdapterService service = getService(); + if (service == null || !callerIsSystemOrActiveOrManagedUser(service, TAG, "offToBleOn")) { + return; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.offToBleOn(quietMode); + } + + @Override + public void onToBleOn(AttributionSource source) { + AdapterService service = getService(); + if (service == null || !callerIsSystemOrActiveOrManagedUser(service, TAG, "onToBleOn")) { + return; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.onToBleOn(); + } + + @Override + public String getAddress(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getAddress") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getAddress")) { + return null; + } + + service.enforceCallingOrSelfPermission(LOCAL_MAC_ADDRESS, null); + return Utils.getAddressStringFromByte(service.getAdapterProperties().getAddress()); + } + + @Override + public List<ParcelUuid> getUuids(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getUuids") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getUuids")) { + return Collections.emptyList(); + } + + ParcelUuid[] parcels = service.getAdapterProperties().getUuids(); + if (parcels == null) { + parcels = new ParcelUuid[0]; + } + return Arrays.asList(parcels); + } + + @Override + public String getIdentityAddress(String address) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getIdentityAddress") + || !checkConnectPermissionForDataDelivery( + service, + Utils.getCallingAttributionSource(mService), + TAG, + "getIdentityAddress")) { + return null; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getIdentityAddress(address); + } + + @Override + @NonNull + public BluetoothAddress getIdentityAddressWithType(@NonNull String address) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getIdentityAddressWithType") + || !checkConnectPermissionForDataDelivery( + service, + Utils.getCallingAttributionSource(mService), + TAG, + "getIdentityAddressWithType")) { + return new BluetoothAddress(null, BluetoothDevice.ADDRESS_TYPE_UNKNOWN); + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getIdentityAddressWithType(address); + } + + @Override + public String getName(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getName") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getName")) { + return null; + } + + return service.getName(); + } + + @Override + public int getNameLengthForAdvertise(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getNameLengthForAdvertise") + || !Utils.checkAdvertisePermissionForDataDelivery(service, source, TAG)) { + return -1; + } + + return service.getNameLengthForAdvertise(); + } + + @Override + public boolean setName(String name, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setName") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "setName")) { + return false; + } + + if (Flags.emptyNamesAreInvalid()) { + requireNonNull(name); + name = name.trim(); + if (name.isEmpty()) { + throw new IllegalArgumentException("Empty names are not valid"); + } + } + + Log.d(TAG, "AdapterServiceBinder.setName(" + name + ")"); + return service.getAdapterProperties().setName(name); + } + + @Override + public int getScanMode(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getScanMode") + || !checkScanPermissionForDataDelivery(service, source, TAG, "getScanMode")) { + return SCAN_MODE_NONE; + } + + return service.getScanMode(); + } + + @Override + public int setScanMode(int mode, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setScanMode") + || !checkScanPermissionForDataDelivery(service, source, TAG, "setScanMode")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_SCAN_PERMISSION; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + String logCaller = getUidPidString() + " packageName=" + source.getPackageName(); + CompletableFuture<Boolean> future = new CompletableFuture<>(); + mService.getHandler() + .post( + () -> + future.complete( + service.getState() == BluetoothAdapter.STATE_ON + && service.setScanMode(mode, logCaller))); + return future.join() ? BluetoothStatusCodes.SUCCESS : BluetoothStatusCodes.ERROR_UNKNOWN; + } + + @Override + public long getDiscoverableTimeout(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getDiscoverableTimeout") + || !checkScanPermissionForDataDelivery( + service, source, TAG, "getDiscoverableTimeout")) { + return -1; + } + + return service.getAdapterProperties().getDiscoverableTimeout(); + } + + @Override + public int setDiscoverableTimeout(long timeout, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setDiscoverableTimeout") + || !checkScanPermissionForDataDelivery( + service, source, TAG, "setDiscoverableTimeout")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_SCAN_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getAdapterProperties().setDiscoverableTimeout((int) timeout) + ? BluetoothStatusCodes.SUCCESS + : BluetoothStatusCodes.ERROR_UNKNOWN; + } + + @Override + public boolean startDiscovery(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "startDiscovery") + || !checkScanPermissionForDataDelivery(service, source, TAG, "startDiscovery")) { + return false; + } + + Log.i(TAG, "startDiscovery: from " + getUidPidString()); + return service.startDiscovery(source); + } + + @Override + public boolean cancelDiscovery(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "cancelDiscovery") + || !checkScanPermissionForDataDelivery(service, source, TAG, "cancelDiscovery")) { + return false; + } + + Log.i(TAG, "cancelDiscovery: from " + getUidPidString()); + return service.getNative().cancelDiscovery(); + } + + @Override + public boolean isDiscovering(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "isDiscovering") + || !checkScanPermissionForDataDelivery(service, source, TAG, "isDiscovering")) { + return false; + } + + return service.getAdapterProperties().isDiscovering(); + } + + @Override + public long getDiscoveryEndMillis(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getDiscoveryEndMillis") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getDiscoveryEndMillis")) { + return -1; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + return service.getAdapterProperties().discoveryEndMillis(); + } + + @Override + public List<BluetoothDevice> getMostRecentlyConnectedDevices(AttributionSource source) { + // don't check caller, may be called from system UI + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getMostRecentlyConnectedDevices")) { + return Collections.emptyList(); + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + return service.getDatabaseManager().getMostRecentlyConnectedDevices(); + } + + @Override + public List<BluetoothDevice> getBondedDevices(AttributionSource source) { + // don't check caller, may be called from system UI + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getBondedDevices")) { + return Collections.emptyList(); + } + + return Arrays.asList(service.getBondedDevices()); + } + + @Override + public int getAdapterConnectionState() { + // don't check caller, may be called from system UI + AdapterService service = getService(); + if (service == null) { + return BluetoothAdapter.STATE_DISCONNECTED; + } + + return service.getAdapterProperties().getConnectionState(); + } + + /** + * This method has an associated binder cache. The invalidation methods must be changed if the + * logic behind this method changes. + */ + @Override + public int getProfileConnectionState(int profile, AttributionSource source) { + AdapterService service = getService(); + boolean checkConnect = false; + final int callingUid = Binder.getCallingUid(); + final long token = Binder.clearCallingIdentity(); + try { + checkConnect = CompatChanges.isChangeEnabled(ENFORCE_CONNECT, callingUid); + } finally { + Binder.restoreCallingIdentity(token); + } + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getProfileConnectionState") + || (checkConnect + && !checkConnectPermissionForDataDelivery( + service, source, TAG, "getProfileConnectionState"))) { + return STATE_DISCONNECTED; + } + + return service.getAdapterProperties().getProfileConnectionState(profile); + } + + @Override + public boolean createBond(BluetoothDevice device, int transport, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "createBond") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "createBond")) { + return false; + } + + Log.i( + TAG, + "createBond:" + + (" device=" + device) + + (" transport=" + transport) + + (" from " + getUidPidString())); + return service.createBond(device, transport, null, null, source.getPackageName()); + } + + @Override + public boolean createBondOutOfBand( + BluetoothDevice device, + int transport, + OobData remoteP192Data, + OobData remoteP256Data, + AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "createBondOutOfBand") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "createBondOutOfBand")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + Log.i( + TAG, + "createBondOutOfBand:" + + (" device=" + device) + + (" transport=" + transport) + + (" from " + getUidPidString())); + return service.createBond( + device, transport, remoteP192Data, remoteP256Data, source.getPackageName()); + } + + @Override + public boolean cancelBondProcess(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "cancelBondProcess") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "cancelBondProcess")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + Log.i(TAG, "cancelBondProcess: device=" + device + ", from " + getUidPidString()); + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + if (deviceProp != null) { + deviceProp.setBondingInitiatedLocally(false); + } + + service.logUserBondResponse(device, false, source); + return service.getNative().cancelBond(getBytesFromAddress(device.getAddress())); + } + + @Override + public boolean removeBond(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "removeBond") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "removeBond")) { + return false; + } + + Log.i(TAG, "removeBond: device=" + device + ", from " + getUidPidString()); + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + if (deviceProp == null || deviceProp.getBondState() != BluetoothDevice.BOND_BONDED) { + Log.w( + TAG, + device + + " cannot be removed since " + + ((deviceProp == null) + ? "properties are empty" + : "bond state is " + deviceProp.getBondState())); + return false; + } + service.logUserBondResponse(device, false, source); + service.getBondAttemptCallerInfo().remove(device.getAddress()); + service.getPhonePolicy().ifPresent(policy -> policy.onRemoveBondRequest(device)); + deviceProp.setBondingInitiatedLocally(false); + + Message msg = service.getBondStateMachine().obtainMessage(BondStateMachine.REMOVE_BOND); + msg.obj = device; + service.getBondStateMachine().sendMessage(msg); + return true; + } + + @Override + public int getBondState(BluetoothDevice device, AttributionSource source) { + // don't check caller, may be called from system UI + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getBondState")) { + return BluetoothDevice.BOND_NONE; + } + + return service.getBondState(device); + } + + @Override + public boolean isBondingInitiatedLocally(BluetoothDevice device, AttributionSource source) { + // don't check caller, may be called from system UI + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "isBondingInitiatedLocally")) { + return false; + } + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + return deviceProp != null && deviceProp.isBondingInitiatedLocally(); + } + + @Override + public void generateLocalOobData( + int transport, IBluetoothOobDataCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "generateLocalOobData") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "generateLocalOobData")) { + return; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.generateLocalOobData(transport, callback); + } + + @Override + public long getSupportedProfiles(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getSupportedProfiles")) { + return 0; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return Config.getSupportedProfilesBitMask(); + } + + @Override + public int getConnectionState(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getConnectionState")) { + return BluetoothDevice.CONNECTION_STATE_DISCONNECTED; + } + + return service.getConnectionState(device); + } + + @Override + public int getConnectionHandle( + BluetoothDevice device, int transport, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getConnectionHandle") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getConnectionHandle")) { + return BluetoothDevice.ERROR; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getConnectionHandle(device, transport); + } + + @Override + public boolean canBondWithoutDialog(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "canBondWithoutDialog")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.canBondWithoutDialog(device); + } + + @Override + public String getPackageNameOfBondingApplication( + BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getPackageNameOfBondingApplication")) { + return null; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getPackageNameOfBondingApplication(device); + } + + @Override + public boolean removeActiveDevice(@ActiveDeviceUse int profiles, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "removeActiveDevice") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "removeActiveDevice")) { + return false; + } + + service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null); + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + Log.i(TAG, "removeActiveDevice: profiles=" + profiles + ", from " + getUidPidString()); + return service.setActiveDevice(null, profiles); + } + + @Override + public boolean setActiveDevice( + BluetoothDevice device, @ActiveDeviceUse int profiles, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setActiveDevice") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "setActiveDevice")) { + return false; + } + + service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null); + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + Log.i( + TAG, + "setActiveDevice: device=" + + device + + ", profiles=" + + profiles + + ", from " + + getUidPidString()); + + return service.setActiveDevice(device, profiles); + } + + @Override + public List<BluetoothDevice> getActiveDevices( + @ActiveDeviceProfile int profile, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getActiveDevices") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getActiveDevices")) { + return Collections.emptyList(); + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getActiveDevices(profile); + } + + @Override + public int connectAllEnabledProfiles(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null || !service.isEnabled()) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "connectAllEnabledProfiles")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + if (device == null) { + throw new IllegalArgumentException("device cannot be null"); + } + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "connectAllEnabledProfiles")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null); + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + Log.i(TAG, "connectAllEnabledProfiles: device=" + device + ", from " + getUidPidString()); + MetricsLogger.getInstance() + .logBluetoothEvent( + device, + BluetoothStatsLog + .BLUETOOTH_CROSS_LAYER_EVENT_REPORTED__EVENT_TYPE__INITIATOR_CONNECTION, + BluetoothStatsLog.BLUETOOTH_CROSS_LAYER_EVENT_REPORTED__STATE__START, + source.getUid()); + + try { + return service.connectAllEnabledProfiles(device); + } catch (Exception e) { + Log.v(TAG, "connectAllEnabledProfiles() failed", e); + SneakyThrow.sneakyThrow(e); + throw new RuntimeException(e); + } + } + + @Override + public int disconnectAllEnabledProfiles(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "disconnectAllEnabledProfiles")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + if (device == null) { + throw new IllegalArgumentException("device cannot be null"); + } + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "disconnectAllEnabledProfiles")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + Log.i( + TAG, + "disconnectAllEnabledProfiles: device=" + device + ", from " + getUidPidString()); + + try { + return service.disconnectAllEnabledProfiles(device); + } catch (Exception e) { + Log.v(TAG, "disconnectAllEnabledProfiles() failed", e); + SneakyThrow.sneakyThrow(e); + throw new RuntimeException(e); + } + } + + @Override + public String getRemoteName(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteName") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getRemoteName")) { + return null; + } + + return service.getRemoteName(device); + } + + @Override + public int getRemoteType(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteType") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getRemoteType")) { + return BluetoothDevice.DEVICE_TYPE_UNKNOWN; + } + + return service.getRemoteType(device); + } + + @Override + public String getRemoteAlias(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteAlias") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getRemoteAlias")) { + return null; + } + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + return deviceProp != null ? deviceProp.getAlias() : null; + } + + @Override + public int setRemoteAlias(BluetoothDevice device, String name, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setRemoteAlias")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + if (name != null && name.isEmpty()) { + throw new IllegalArgumentException("alias cannot be the empty string"); + } + + if (!checkConnectPermissionForDataDelivery(service, source, TAG, "setRemoteAlias")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + Utils.enforceCdmAssociationIfNotBluetoothPrivileged( + service, service.getCompanionDeviceManager(), source, device); + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + if (deviceProp == null) { + return BluetoothStatusCodes.ERROR_DEVICE_NOT_BONDED; + } + deviceProp.setAlias(device, name); + return BluetoothStatusCodes.SUCCESS; + } + + @Override + public int getRemoteClass(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteClass") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getRemoteClass")) { + return 0; + } + + return service.getRemoteClass(device); + } + + @Override + public List<ParcelUuid> getRemoteUuids(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getRemoteUuids") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getRemoteUuids")) { + return Collections.emptyList(); + } + + final ParcelUuid[] parcels = service.getRemoteUuids(device); + if (parcels == null) { + return null; + } + return Arrays.asList(parcels); + } + + @Override + public boolean fetchRemoteUuids( + BluetoothDevice device, int transport, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "fetchRemoteUuids") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "fetchRemoteUuids")) { + return false; + } + if (transport != TRANSPORT_AUTO) { + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + } + + Log.i( + TAG, + "fetchRemoteUuids: device=" + + device + + ", transport=" + + transport + + ", from " + + getUidPidString()); + + service.getRemoteDevices().fetchUuids(device, transport); + MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.SDP_FETCH_UUID_REQUEST, 1); + return true; + } + + @Override + public boolean setPin( + BluetoothDevice device, + boolean accept, + int len, + byte[] pinCode, + AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setPin") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "setPin")) { + return false; + } + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + // Only allow setting a pin in bonding state, or bonded state in case of security + // upgrade. + if (deviceProp == null || !deviceProp.isBondingOrBonded()) { + Log.e(TAG, "setPin: device=" + device + ", not bonding"); + return false; + } + if (pinCode.length != len) { + android.util.EventLog.writeEvent( + 0x534e4554, "139287605", -1, "PIN code length mismatch"); + return false; + } + service.logUserBondResponse(device, accept, source); + Log.i( + TAG, + "setPin: device=" + device + ", accept=" + accept + ", from " + getUidPidString()); + return service.getNative() + .pinReply(getBytesFromAddress(device.getAddress()), accept, len, pinCode); + } + + @Override + public boolean setPasskey( + BluetoothDevice device, + boolean accept, + int len, + byte[] passkey, + AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setPasskey") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "setPasskey")) { + return false; + } + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + if (deviceProp == null || !deviceProp.isBonding()) { + Log.e(TAG, "setPasskey: device=" + device + ", not bonding"); + return false; + } + if (passkey.length != len) { + android.util.EventLog.writeEvent( + 0x534e4554, "139287605", -1, "Passkey length mismatch"); + return false; + } + service.logUserBondResponse(device, accept, source); + Log.i( + TAG, + "setPasskey: device=" + + device + + ", accept=" + + accept + + ", from " + + getUidPidString()); + + return service.getNative() + .sspReply( + getBytesFromAddress(device.getAddress()), + AbstractionLayer.BT_SSP_VARIANT_PASSKEY_ENTRY, + accept, + Utils.byteArrayToInt(passkey)); + } + + @Override + public boolean setPairingConfirmation( + BluetoothDevice device, boolean accept, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setPairingConfirmation") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "setPairingConfirmation")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + if (deviceProp == null || !deviceProp.isBonding()) { + Log.e(TAG, "setPairingConfirmation: device=" + device + ", not bonding"); + return false; + } + service.logUserBondResponse(device, accept, source); + Log.i( + TAG, + "setPairingConfirmation: device=" + + device + + ", accept=" + + accept + + ", from " + + getUidPidString()); + + return service.getNative() + .sspReply( + getBytesFromAddress(device.getAddress()), + AbstractionLayer.BT_SSP_VARIANT_PASSKEY_CONFIRMATION, + accept, + 0); + } + + @Override + public boolean getSilenceMode(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getSilenceMode") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getSilenceMode")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getSilenceDeviceManager().getSilenceMode(device); + } + + @Override + public boolean setSilenceMode( + BluetoothDevice device, boolean silence, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setSilenceMode") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "setSilenceMode")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.getSilenceDeviceManager().setSilenceMode(device, silence); + return true; + } + + @Override + public int getPhonebookAccessPermission(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "getPhonebookAccessPermission") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getPhonebookAccessPermission")) { + return BluetoothDevice.ACCESS_UNKNOWN; + } + + return service.getPhonebookAccessPermission(device); + } + + @Override + public boolean setPhonebookAccessPermission( + BluetoothDevice device, int value, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "setPhonebookAccessPermission") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "setPhonebookAccessPermission")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.setPhonebookAccessPermission(device, value); + return true; + } + + @Override + public int getMessageAccessPermission(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getMessageAccessPermission") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getMessageAccessPermission")) { + return BluetoothDevice.ACCESS_UNKNOWN; + } + + return service.getMessageAccessPermission(device); + } + + @Override + public boolean setMessageAccessPermission( + BluetoothDevice device, int value, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setMessageAccessPermission") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "setMessageAccessPermission")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.setMessageAccessPermission(device, value); + return true; + } + + @Override + public int getSimAccessPermission(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getSimAccessPermission") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getSimAccessPermission")) { + return BluetoothDevice.ACCESS_UNKNOWN; + } + + return service.getSimAccessPermission(device); + } + + @Override + public boolean setSimAccessPermission( + BluetoothDevice device, int value, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setSimAccessPermission") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "setSimAccessPermission")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.setSimAccessPermission(device, value); + return true; + } + + @Override + public void logL2capcocServerConnection( + BluetoothDevice device, + int port, + boolean isSecured, + int result, + long socketCreationTimeMillis, + long socketCreationLatencyMillis, + long socketConnectionTimeMillis, + long timeoutMillis) { + AdapterService service = getService(); + if (service == null) { + return; + } + service.logL2capcocServerConnection( + device, + port, + isSecured, + result, + socketCreationTimeMillis, + socketCreationLatencyMillis, + socketConnectionTimeMillis, + timeoutMillis, + Binder.getCallingUid()); + } + + @Override + public IBluetoothSocketManager getSocketManager() { + AdapterService service = getService(); + if (service == null) { + return null; + } + + return IBluetoothSocketManager.Stub.asInterface(service.getBluetoothSocketManagerBinder()); + } + + @Override + public void logL2capcocClientConnection( + BluetoothDevice device, + int port, + boolean isSecured, + int result, + long socketCreationTimeNanos, + long socketCreationLatencyNanos, + long socketConnectionTimeNanos) { + AdapterService service = getService(); + if (service == null) { + return; + } + service.logL2capcocClientConnection( + device, + port, + isSecured, + result, + socketCreationTimeNanos, + socketCreationLatencyNanos, + socketConnectionTimeNanos, + Binder.getCallingUid()); + } + + @Override + public void logRfcommConnectionAttempt( + BluetoothDevice device, + boolean isSecured, + int resultCode, + long socketCreationTimeNanos, + boolean isSerialPort) { + AdapterService service = getService(); + if (service == null) { + return; + } + service.logRfcommConnectionAttempt( + device, + isSecured, + resultCode, + socketCreationTimeNanos, + isSerialPort, + Binder.getCallingUid()); + } + + @Override + public boolean sdpSearch(BluetoothDevice device, ParcelUuid uuid, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "sdpSearch") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "sdpSearch")) { + return false; + } + return service.sdpSearch(device, uuid); + } + + @Override + public int getBatteryLevel(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getBatteryLevel") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getBatteryLevel")) { + return BluetoothDevice.BATTERY_LEVEL_UNKNOWN; + } + + DeviceProperties deviceProp = service.getRemoteDevices().getDeviceProperties(device); + if (deviceProp == null) { + return BluetoothDevice.BATTERY_LEVEL_UNKNOWN; + } + return deviceProp.getBatteryLevel(); + } + + @Override + public int getMaxConnectedAudioDevices(AttributionSource source) { + // don't check caller, may be called from system UI + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getMaxConnectedAudioDevices")) { + return -1; + } + + return service.getMaxConnectedAudioDevices(); + } + + @Override + public boolean factoryReset(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery(service, source, TAG, "factoryReset")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.factoryReset(); + } + + @Override + public void registerBluetoothConnectionCallback( + IBluetoothConnectionCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "registerBluetoothConnectionCallback") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "registerBluetoothConnectionCallback")) { + return; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.getBluetoothConnectionCallbacks().register(callback); + } + + @Override + public void unregisterBluetoothConnectionCallback( + IBluetoothConnectionCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "unregisterBluetoothConnectionCallback") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "unregisterBluetoothConnectionCallback")) { + return; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.getBluetoothConnectionCallbacks().unregister(callback); + } + + @Override + public void registerCallback(IBluetoothCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "registerCallback") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "registerCallback")) { + return; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.registerRemoteCallback(callback); + } + + @Override + public void unregisterCallback(IBluetoothCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "unregisterCallback") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "unregisterCallback")) { + return; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.unregisterRemoteCallback(callback); + } + + @Override + public boolean isMultiAdvertisementSupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + int val = service.getAdapterProperties().getNumOfAdvertisementInstancesSupported(); + return val >= MIN_ADVT_INSTANCES_FOR_MA; + } + + /** + * This method has an associated binder cache. The invalidation methods must be changed if the + * logic behind this method changes. + */ + @Override + public boolean isOffloadedFilteringSupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + int val = service.getNumOfOffloadedScanFilterSupported(); + return val >= MIN_OFFLOADED_FILTERS; + } + + @Override + public boolean isOffloadedScanBatchingSupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + int val = service.getOffloadedScanResultStorage(); + return val >= MIN_OFFLOADED_SCAN_STORAGE_BYTES; + } + + @Override + public boolean isLe2MPhySupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + return service.isLe2MPhySupported(); + } + + @Override + public boolean isLeCodedPhySupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + return service.isLeCodedPhySupported(); + } + + @Override + public boolean isLeExtendedAdvertisingSupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + return service.isLeExtendedAdvertisingSupported(); + } + + @Override + public boolean isLePeriodicAdvertisingSupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + return service.isLePeriodicAdvertisingSupported(); + } + + @Override + public int isLeAudioSupported() { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + + Set<Integer> supportedProfileServices = + Arrays.stream(Config.getSupportedProfiles()).boxed().collect(Collectors.toSet()); + int[] leAudioUnicastProfiles = Config.getLeAudioUnicastProfiles(); + + if (Arrays.stream(leAudioUnicastProfiles).allMatch(supportedProfileServices::contains)) { + return BluetoothStatusCodes.FEATURE_SUPPORTED; + } + + return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; + } + + @Override + public int isLeAudioBroadcastSourceSupported() { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + + long supportBitMask = Config.getSupportedProfilesBitMask(); + if ((supportBitMask & (1 << BluetoothProfile.LE_AUDIO_BROADCAST)) != 0) { + return BluetoothStatusCodes.FEATURE_SUPPORTED; + } + + return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; + } + + @Override + public int isLeAudioBroadcastAssistantSupported() { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + + int[] supportedProfileServices = Config.getSupportedProfiles(); + + if (Arrays.stream(supportedProfileServices) + .anyMatch( + profileId -> profileId == BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT)) { + return BluetoothStatusCodes.FEATURE_SUPPORTED; + } + + return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; + } + + @Override + public int isDistanceMeasurementSupported(AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } else if (!callerIsSystemOrActiveOrManagedUser( + service, TAG, "isDistanceMeasurementSupported")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } else if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "isDistanceMeasurementSupported")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return BluetoothStatusCodes.FEATURE_SUPPORTED; + } + + @Override + public int getLeMaximumAdvertisingDataLength() { + AdapterService service = getService(); + if (service == null) { + return 0; + } + + return service.getLeMaximumAdvertisingDataLength(); + } + + @Override + public boolean isActivityAndEnergyReportingSupported() { + AdapterService service = getService(); + if (service == null) { + return false; + } + + return service.getAdapterProperties().isActivityAndEnergyReportingSupported(); + } + + @Override + public BluetoothActivityEnergyInfo reportActivityInfo(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "reportActivityInfo")) { + return null; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.reportActivityInfo(); + } + + @Override + public boolean registerMetadataListener( + IBluetoothMetadataListener listener, BluetoothDevice device, AttributionSource source) { + requireNonNull(device); + requireNonNull(listener); + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "registerMetadataListener") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "registerMetadataListener")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.getHandler() + .post( + () -> + service.getMetadataListeners() + .computeIfAbsent(device, k -> new RemoteCallbackList()) + .register(listener)); + return true; + } + + @Override + public boolean unregisterMetadataListener( + IBluetoothMetadataListener listener, BluetoothDevice device, AttributionSource source) { + requireNonNull(device); + requireNonNull(listener); + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "unregisterMetadataListener") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "unregisterMetadataListener")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.getHandler() + .post( + () -> + service.getMetadataListeners() + .computeIfPresent( + device, + (k, v) -> { + v.unregister(listener); + if (v.getRegisteredCallbackCount() == 0) { + return null; + } + return v; + })); + return true; + } + + @Override + public boolean setMetadata( + BluetoothDevice device, int key, byte[] value, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "setMetadata") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "setMetadata")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.setMetadata(device, key, value); + } + + @Override + public byte[] getMetadata(BluetoothDevice device, int key, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getMetadata") + || !checkConnectPermissionForDataDelivery(service, source, TAG, "getMetadata")) { + return null; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getMetadata(device, key); + } + + @Override + public int isRequestAudioPolicyAsSinkSupported( + BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "isRequestAudioPolicyAsSinkSupported") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "isRequestAudioPolicyAsSinkSupported")) { + return BluetoothStatusCodes.FEATURE_NOT_CONFIGURED; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.isRequestAudioPolicyAsSinkSupported(device); + } + + @Override + public int requestAudioPolicyAsSink( + BluetoothDevice device, BluetoothSinkAudioPolicy policies, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } else if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "requestAudioPolicyAsSink")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } else if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "requestAudioPolicyAsSink")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.requestAudioPolicyAsSink(device, policies); + } + + @Override + public BluetoothSinkAudioPolicy getRequestedAudioPolicyAsSink( + BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "getRequestedAudioPolicyAsSink") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "getRequestedAudioPolicyAsSink")) { + return null; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getRequestedAudioPolicyAsSink(device); + } + + @Override + public void requestActivityInfo( + IBluetoothActivityEnergyInfoListener listener, AttributionSource source) { + BluetoothActivityEnergyInfo info = reportActivityInfo(source); + try { + listener.onBluetoothActivityEnergyInfoAvailable(info); + } catch (RemoteException e) { + Log.e(TAG, "onBluetoothActivityEnergyInfo: RemoteException", e); + } + } + + @Override + public void bleOnToOn(AttributionSource source) { + AdapterService service = getService(); + if (service == null || !callerIsSystemOrActiveOrManagedUser(service, TAG, "bleOnToOn")) { + return; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.bleOnToOn(); + } + + @Override + public void bleOnToOff(AttributionSource source) { + AdapterService service = getService(); + if (service == null || !callerIsSystemOrActiveOrManagedUser(service, TAG, "bleOnToOff")) { + return; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.bleOnToOff(); + } + + @Override + public void dump(FileDescriptor fd, String[] args) { + PrintWriter writer = new PrintWriter(new FileOutputStream(fd)); + AdapterService service = getService(); + if (service == null) { + return; + } + + service.enforceCallingOrSelfPermission(DUMP, null); + service.dump(fd, writer, args); + writer.close(); + } + + @Override + public boolean allowLowLatencyAudio(boolean allowed, BluetoothDevice device) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "allowLowLatencyAudio") + || !checkConnectPermissionForDataDelivery( + service, + Utils.getCallingAttributionSource(service), + TAG, + "allowLowLatencyAudio")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.allowLowLatencyAudio(allowed, device); + } + + @Override + public int startRfcommListener( + String name, ParcelUuid uuid, PendingIntent pendingIntent, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "startRfcommListener") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "startRfcommListener")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.startRfcommListener(name, uuid, pendingIntent, source); + } + + @Override + public int stopRfcommListener(ParcelUuid uuid, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser(service, TAG, "stopRfcommListener") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "stopRfcommListener")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.stopRfcommListener(uuid, source); + } + + @Override + public IncomingRfcommSocketInfo retrievePendingSocketForServiceRecord( + ParcelUuid uuid, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "retrievePendingSocketForServiceRecord") + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "retrievePendingSocketForServiceRecord")) { + return null; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.retrievePendingSocketForServiceRecord(uuid, source); + } + + @Override + public void setForegroundUserId(int userId, AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, + Utils.getCallingAttributionSource(mService), + TAG, + "setForegroundUserId")) { + return; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + Utils.setForegroundUserId(userId); + } + + @Override + public int setPreferredAudioProfiles( + BluetoothDevice device, Bundle modeToProfileBundle, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setPreferredAudioProfiles")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + requireNonNull(device); + requireNonNull(modeToProfileBundle); + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (service.getBondState(device) != BluetoothDevice.BOND_BONDED) { + return BluetoothStatusCodes.ERROR_DEVICE_NOT_BONDED; + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "setPreferredAudioProfiles")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.setPreferredAudioProfiles(device, modeToProfileBundle); + } + + @Override + public Bundle getPreferredAudioProfiles(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return Bundle.EMPTY; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "getPreferredAudioProfiles")) { + return Bundle.EMPTY; + } + requireNonNull(device); + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (service.getBondState(device) != BluetoothDevice.BOND_BONDED) { + return Bundle.EMPTY; + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "getPreferredAudioProfiles")) { + return Bundle.EMPTY; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getPreferredAudioProfiles(device); + } + + @Override + public int notifyActiveDeviceChangeApplied(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystem(TAG, "notifyActiveDeviceChangeApplied")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + requireNonNull(device); + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (service.getBondState(device) != BluetoothDevice.BOND_BONDED) { + return BluetoothStatusCodes.ERROR_DEVICE_NOT_BONDED; + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "notifyActiveDeviceChangeApplied")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.notifyActiveDeviceChangeApplied(device); + } + + @Override + public int isDualModeAudioEnabled(AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "isDualModeAudioEnabled")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + if (!Utils.isDualModeAudioEnabled()) { + return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; + } + + return BluetoothStatusCodes.SUCCESS; + } + + @Override + public int registerPreferredAudioProfilesChangedCallback( + IBluetoothPreferredAudioProfilesCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser( + service, TAG, "registerPreferredAudioProfilesChangedCallback")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + requireNonNull(callback); + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "registerPreferredAudioProfilesChangedCallback")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + // If LE only mode is enabled, the dual mode audio feature is disabled + if (!Utils.isDualModeAudioEnabled()) { + return BluetoothStatusCodes.FEATURE_NOT_SUPPORTED; + } + + service.getPreferredAudioProfilesCallbacks().register(callback); + return BluetoothStatusCodes.SUCCESS; + } + + @Override + public int unregisterPreferredAudioProfilesChangedCallback( + IBluetoothPreferredAudioProfilesCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser( + service, TAG, "unregisterPreferredAudioProfilesChangedCallback")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + requireNonNull(callback); + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "unregisterPreferredAudioProfilesChangedCallback")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + if (!service.getPreferredAudioProfilesCallbacks().unregister(callback)) { + Log.e( + TAG, + "unregisterPreferredAudioProfilesChangedCallback: callback was never " + + "registered"); + return BluetoothStatusCodes.ERROR_CALLBACK_NOT_REGISTERED; + } + return BluetoothStatusCodes.SUCCESS; + } + + @Override + public int registerBluetoothQualityReportReadyCallback( + IBluetoothQualityReportReadyCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser( + service, TAG, "registerBluetoothQualityReportReadyCallback")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + requireNonNull(callback); + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "registerBluetoothQualityReportReadyCallback")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.getBluetoothQualityReportReadyCallbacks().register(callback); + return BluetoothStatusCodes.SUCCESS; + } + + @Override + public int unregisterBluetoothQualityReportReadyCallback( + IBluetoothQualityReportReadyCallback callback, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser( + service, TAG, "unregisterBluetoothQualityReportReadyCallback")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + requireNonNull(callback); + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "unregisterBluetoothQualityReportReadyCallback")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + if (!service.getBluetoothQualityReportReadyCallbacks().unregister(callback)) { + Log.e( + TAG, + "unregisterBluetoothQualityReportReadyCallback: callback was never registered"); + return BluetoothStatusCodes.ERROR_CALLBACK_NOT_REGISTERED; + } + return BluetoothStatusCodes.SUCCESS; + } + + @Override + public void registerHciVendorSpecificCallback( + IBluetoothHciVendorSpecificCallback callback, int[] eventCodes) { + AdapterService service = getService(); + if (service == null) { + return; + } + if (!callerIsSystemOrActiveOrManagedUser( + service, TAG, "registerHciVendorSpecificCallback")) { + throw new SecurityException("not allowed"); + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + requireNonNull(callback); + requireNonNull(eventCodes); + + Set<Integer> eventCodesSet = Arrays.stream(eventCodes).boxed().collect(Collectors.toSet()); + if (eventCodesSet.stream() + .anyMatch((n) -> (n < 0) || (n >= 0x52 && n < 0x60) || (n > 0xff))) { + throw new IllegalArgumentException("invalid vendor-specific event code"); + } + + service.getBluetoothHciVendorSpecificDispatcher().register(callback, eventCodesSet); + } + + @Override + public void unregisterHciVendorSpecificCallback(IBluetoothHciVendorSpecificCallback callback) { + AdapterService service = getService(); + if (service == null) { + return; + } + if (!callerIsSystemOrActiveOrManagedUser( + service, TAG, "unregisterHciVendorSpecificCallback")) { + throw new SecurityException("not allowed"); + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + requireNonNull(callback); + service.getBluetoothHciVendorSpecificDispatcher().unregister(callback); + } + + @Override + public void sendHciVendorSpecificCommand( + int ocf, byte[] parameters, IBluetoothHciVendorSpecificCallback callback) { + AdapterService service = getService(); + if (service == null) { + return; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "sendHciVendorSpecificCommand")) { + throw new SecurityException("not allowed"); + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + + // Open this no-op android command for test purpose + int getVendorCapabilitiesOcf = 0x153; + if (ocf < 0 + || (ocf >= 0x150 && ocf < 0x160 && ocf != getVendorCapabilitiesOcf) + || (ocf > 0x3ff)) { + throw new IllegalArgumentException("invalid vendor-specific event code"); + } + requireNonNull(parameters); + if (parameters.length > 255) { + throw new IllegalArgumentException("Parameters size is too big"); + } + + Optional<byte[]> cookie = + service.getBluetoothHciVendorSpecificDispatcher().getRegisteredCookie(callback); + if (!cookie.isPresent()) { + Log.e(TAG, "send command without registered callback"); + throw new IllegalStateException("callback not registered"); + } + + service.getBluetoothHciVendorSpecificNativeInterface() + .sendCommand(ocf, parameters, cookie.get()); + } + + @Override + public int getOffloadedTransportDiscoveryDataScanSupported(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !callerIsSystemOrActiveOrManagedUser( + service, TAG, "getOffloadedTransportDiscoveryDataScanSupported") + || !checkScanPermissionForDataDelivery( + service, source, TAG, "getOffloadedTransportDiscoveryDataScanSupported")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_SCAN_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getOffloadedTransportDiscoveryDataScanSupported(); + } + + @Override + public boolean isMediaProfileConnected(AttributionSource source) { + AdapterService service = getService(); + if (service == null + || !checkConnectPermissionForDataDelivery( + service, source, TAG, "isMediaProfileConnected")) { + return false; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.isMediaProfileConnected(); + } + + @Override + public IBinder getBluetoothGatt() { + AdapterService service = getService(); + return service == null ? null : service.getBluetoothGatt(); + } + + @Override + public IBinder getBluetoothScan() { + AdapterService service = getService(); + return service == null ? null : service.getBluetoothScan(); + } + + @Override + public void unregAllGattClient(AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + service.unregAllGattClient(source); + } + + @Override + public IBinder getProfile(int profileId) { + AdapterService service = getService(); + if (service == null) { + return null; + } + + return service.getProfile(profileId); + } + + @Override + public int setActiveAudioDevicePolicy( + BluetoothDevice device, int activeAudioDevicePolicy, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setActiveAudioDevicePolicy")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "setActiveAudioDevicePolicy")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getDatabaseManager() + .setActiveAudioDevicePolicy(device, activeAudioDevicePolicy); + } + + @Override + public int getActiveAudioDevicePolicy(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return BluetoothDevice.ACTIVE_AUDIO_DEVICE_POLICY_DEFAULT; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "getActiveAudioDevicePolicy")) { + throw new IllegalStateException( + "Caller is not the system or part of the active/managed user"); + } + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "getActiveAudioDevicePolicy")) { + return BluetoothDevice.ACTIVE_AUDIO_DEVICE_POLICY_DEFAULT; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getDatabaseManager().getActiveAudioDevicePolicy(device); + } + + @Override + public int setMicrophonePreferredForCalls( + BluetoothDevice device, boolean enabled, AttributionSource source) { + requireNonNull(device); + AdapterService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setMicrophonePreferredForCalls")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "setMicrophonePreferredForCalls")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getDatabaseManager().setMicrophonePreferredForCalls(device, enabled); + } + + @Override + public boolean isMicrophonePreferredForCalls(BluetoothDevice device, AttributionSource source) { + requireNonNull(device); + AdapterService service = getService(); + if (service == null) { + return true; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "isMicrophonePreferredForCalls")) { + throw new IllegalStateException( + "Caller is not the system or part of the active/managed user"); + } + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (!checkConnectPermissionForDataDelivery( + service, source, TAG, "isMicrophonePreferredForCalls")) { + return true; + } + + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.getDatabaseManager().isMicrophonePreferredForCalls(device); + } + + @Override + public boolean isLeCocSocketOffloadSupported(AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return false; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.isLeCocSocketOffloadSupported(); + } + + @Override + public boolean isRfcommSocketOffloadSupported(AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return false; + } + service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); + return service.isRfcommSocketOffloadSupported(); + } + + @Override + public IBinder getBluetoothAdvertise() { + AdapterService service = getService(); + return service == null ? null : service.getBluetoothAdvertise(); + } + + @Override + public IBinder getDistanceMeasurement() { + AdapterService service = getService(); + return service == null ? null : service.getDistanceMeasurement(); + } + + @Override + public int getKeyMissingCount(BluetoothDevice device, AttributionSource source) { + AdapterService service = getService(); + if (service == null) { + return -1; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "getKeyMissingCount")) { + throw new IllegalStateException( + "Caller is not the system or part of the active/managed user"); + } + if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + throw new IllegalArgumentException("device cannot have an invalid address"); + } + if (!checkConnectPermissionForDataDelivery(service, source, TAG, "getKeyMissingCount")) { + return -1; + } + + return service.getDatabaseManager().getKeyMissingCount(device); + } +} diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterSuspend.java b/android/app/src/com/android/bluetooth/btservice/AdapterSuspend.java index d49865e1ce..e7e9e870b8 100644 --- a/android/app/src/com/android/bluetooth/btservice/AdapterSuspend.java +++ b/android/app/src/com/android/bluetooth/btservice/AdapterSuspend.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/BluetoothAdapterProxy.java b/android/app/src/com/android/bluetooth/btservice/BluetoothAdapterProxy.java index b7a67a7e66..20d3f5577f 100644 --- a/android/app/src/com/android/bluetooth/btservice/BluetoothAdapterProxy.java +++ b/android/app/src/com/android/bluetooth/btservice/BluetoothAdapterProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificDispatcher.java b/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificDispatcher.java index 1635742b76..a767c6a3c9 100644 --- a/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificDispatcher.java +++ b/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificNativeInterface.java b/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificNativeInterface.java index 010b1e6ce5..58c55978a7 100644 --- a/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificNativeInterface.java +++ b/android/app/src/com/android/bluetooth/btservice/BluetoothHciVendorSpecificNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/BluetoothQualityReportNativeInterface.java b/android/app/src/com/android/bluetooth/btservice/BluetoothQualityReportNativeInterface.java index 2f4c03c17c..88f6e13638 100644 --- a/android/app/src/com/android/bluetooth/btservice/BluetoothQualityReportNativeInterface.java +++ b/android/app/src/com/android/bluetooth/btservice/BluetoothQualityReportNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/BluetoothSocketManagerBinder.java b/android/app/src/com/android/bluetooth/btservice/BluetoothSocketManagerBinder.java index c9b1c82473..f9dcbe8017 100644 --- a/android/app/src/com/android/bluetooth/btservice/BluetoothSocketManagerBinder.java +++ b/android/app/src/com/android/bluetooth/btservice/BluetoothSocketManagerBinder.java @@ -286,7 +286,7 @@ class BluetoothSocketManagerBinder extends IBluetoothSocketManager.Stub { || !Utils.callerIsSystemOrActiveOrManagedUser( service, TAG, "getL2capLocalChannelId") || !Utils.checkConnectPermissionForDataDelivery( - service, source, "BluetoothSocketManagerBinder getL2capLocalChannelId")) { + service, source, TAG, "getL2capLocalChannelId")) { return INVALID_CID; } service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); @@ -300,7 +300,7 @@ class BluetoothSocketManagerBinder extends IBluetoothSocketManager.Stub { || !Utils.callerIsSystemOrActiveOrManagedUser( service, TAG, "getL2capRemoteChannelId") || !Utils.checkConnectPermissionForDataDelivery( - service, source, "BluetoothSocketManagerBinder getL2capRemoteChannelId")) { + service, source, TAG, "getL2capRemoteChannelId")) { return INVALID_CID; } service.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, null); diff --git a/android/app/src/com/android/bluetooth/btservice/DiscoveringPackage.java b/android/app/src/com/android/bluetooth/btservice/DiscoveringPackage.java index 02723ef984..1e96abce86 100644 --- a/android/app/src/com/android/bluetooth/btservice/DiscoveringPackage.java +++ b/android/app/src/com/android/bluetooth/btservice/DiscoveringPackage.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java b/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java index 736d6e88e2..87794605dc 100644 --- a/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java +++ b/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -646,7 +646,8 @@ public class MetricsLogger { int numOngoingScan, boolean isScreenOn, boolean isAppDead, - int appImportance) { + int appImportance, + String attributionTag) { BluetoothStatsLog.write( BluetoothStatsLog.LE_APP_SCAN_STATE_CHANGED, uids, @@ -662,7 +663,8 @@ public class MetricsLogger { numOngoingScan, isScreenOn, isAppDead, - convertAppImportance(appImportance)); + convertAppImportance(appImportance), + attributionTag); } /** Logs the radio scan stats with app attribution when the radio scan stopped. */ @@ -675,7 +677,8 @@ public class MetricsLogger { long scanWindowMillis, boolean isScreenOn, long scanDurationMillis, - int appImportance) { + int appImportance, + String attributionTag) { BluetoothStatsLog.write( BluetoothStatsLog.LE_RADIO_SCAN_STOPPED, uids, @@ -686,7 +689,8 @@ public class MetricsLogger { scanWindowMillis, isScreenOn, scanDurationMillis, - convertAppImportance(appImportance)); + convertAppImportance(appImportance), + attributionTag); } /** Logs the advertise stats with app attribution when the advertise state changed. */ @@ -702,7 +706,8 @@ public class MetricsLogger { boolean isExtendedAdv, int instanceCount, long advDurationMs, - int appImportance) { + int appImportance, + String attributionTag) { BluetoothStatsLog.write( BluetoothStatsLog.LE_ADV_STATE_CHANGED, uids, @@ -716,7 +721,8 @@ public class MetricsLogger { isExtendedAdv, instanceCount, advDurationMs, - convertAppImportance(appImportance)); + convertAppImportance(appImportance), + attributionTag); } protected String getAllowlistedDeviceNameHash( diff --git a/android/app/src/com/android/bluetooth/btservice/RemoteDevices.java b/android/app/src/com/android/bluetooth/btservice/RemoteDevices.java index 456545a42a..c49659863b 100644 --- a/android/app/src/com/android/bluetooth/btservice/RemoteDevices.java +++ b/android/app/src/com/android/bluetooth/btservice/RemoteDevices.java @@ -27,6 +27,7 @@ import static com.android.modules.utils.build.SdkLevel.isAtLeastV; import static java.util.Objects.requireNonNullElseGet; +import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.app.Activity; @@ -43,8 +44,11 @@ import android.bluetooth.BluetoothProtoEnums; import android.bluetooth.BluetoothSinkAudioPolicy; import android.bluetooth.BluetoothUtils; import android.bluetooth.IBluetoothConnectionCallback; +import android.content.AttributionSource; import android.content.Intent; +import android.content.pm.Attribution; import android.net.MacAddress; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -64,9 +68,13 @@ import com.android.modules.utils.build.SdkLevel; import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.Predicate; @@ -329,6 +337,7 @@ public class RemoteDevices { } class DeviceProperties { + private static final int MAX_PACKAGE_NAMES = 4; private String mName; private byte[] mAddress; private String mIdentityAddress; @@ -354,6 +363,16 @@ public class RemoteDevices { @VisibleForTesting boolean mHfpBatteryIndicator = false; private BluetoothSinkAudioPolicy mAudioPolicy; + // LRU cache of package names associated to this device + private final Set<String> mPackages = + Collections.newSetFromMap( + new LinkedHashMap<String, Boolean>() { + // This is called on every add. Returning true removes the eldest entry. + protected boolean removeEldestEntry(Map.Entry<String, Boolean> eldest) { + return size() >= MAX_PACKAGE_NAMES; + } + }); + DeviceProperties() { mBondState = BluetoothDevice.BOND_NONE; } @@ -858,6 +877,22 @@ public class RemoteDevices { return mModelName; } } + + @NonNull + public String[] getPackages() { + synchronized (mObject) { + return mPackages.toArray(new String[0]); + } + } + + public void addPackage(String packageName) { + synchronized (mObject) { + // Removing the package ensures that the LRU cache order is updated. Adding it back + // will make it the newest. + mPackages.remove(packageName); + mPackages.add(packageName); + } + } } private void sendUuidIntent(BluetoothDevice device, DeviceProperties prop, boolean success) { @@ -1574,6 +1609,28 @@ public class RemoteDevices { // Bond loss detected, add to the count. mAdapterService.getDatabase().updateKeyMissingCount(bluetoothDevice, true); + // Some apps are not able to handle the key missing broadcast, so we need to remove + // the bond to prevent them from misbehaving. + // TODO (b/402854328): Remove when the misbehaving apps are updated + if (bondLossIopFixNeeded(bluetoothDevice)) { + DeviceProperties deviceProperties = getDeviceProperties(bluetoothDevice); + if (deviceProperties == null) { + return; + } + String[] packages = deviceProperties.getPackages(); + if (packages.length == 0) { + return; + } + + Log.w( + TAG, + "Removing " + + bluetoothDevice + + " on behalf of: " + + Arrays.toString(packages)); + bluetoothDevice.removeBond(); + } + if (Flags.keyMissingPublic()) { mAdapterService.sendOrderedBroadcast( intent, @@ -1992,6 +2049,55 @@ public class RemoteDevices { device, batteryChargeIndicatorToPercentage(batteryLevel), /* isBas= */ false); } + private static final String[] BOND_LOSS_IOP_PACKAGES = { + "com.sjm.crmd.patientApp_Android", "com.abbott.crm.ngq.patient", + }; + + private static final Set<String> BOND_LOSS_IOP_DEVICE_NAMES = Set.of("CM", "DM"); + + // TODO (b/402854328): Remove when the misbehaving apps are updated + public boolean bondLossIopFixNeeded(BluetoothDevice device) { + DeviceProperties deviceProperties = getDeviceProperties(device); + if (deviceProperties == null) { + return false; + } + + String deviceName = deviceProperties.getName(); + if (deviceName == null) { + return false; + } + + String[] packages = deviceProperties.getPackages(); + if (packages.length == 0) { + return false; + } + + if (!BOND_LOSS_IOP_DEVICE_NAMES.contains(deviceName)) { + return false; + } + + for (String iopFixPackage : BOND_LOSS_IOP_PACKAGES) { + for (String packageName : packages) { + if (packageName.contains(iopFixPackage) + && !Utils.checkCallerTargetSdk( + mAdapterService, packageName, Build.VERSION_CODES.BAKLAVA)) { + Log.w( + TAG, + "bondLossIopFixNeeded(): " + + " IOP fix needed for " + + device + + " name: " + + deviceName + + " package: " + + packageName); + return true; + } + } + } + + return false; + } + private static void errorLog(String msg) { Log.e(TAG, msg); } diff --git a/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java b/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java index b250e2ffe9..90d9a4bee6 100644 --- a/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java +++ b/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,6 @@ import android.util.Log; import com.android.bluetooth.Utils; import com.android.bluetooth.a2dp.A2dpService; import com.android.bluetooth.hfp.HeadsetService; -import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.HashMap; @@ -205,7 +204,6 @@ public class SilenceDeviceManager { mSilenceDevices.clear(); } - @VisibleForTesting boolean setSilenceMode(BluetoothDevice device, boolean silence) { Log.d(TAG, "setSilenceMode: " + device + ", " + silence); mHandler.obtainMessage( diff --git a/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreNativeInterface.java b/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreNativeInterface.java index 073aa34302..09761f58d9 100644 --- a/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreNativeInterface.java +++ b/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java b/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java index 020692ae6f..26922d0aff 100644 --- a/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java +++ b/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/AudioPolicyEntity.java b/android/app/src/com/android/bluetooth/btservice/storage/AudioPolicyEntity.java index 76ba89e0a4..2f70150270 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/AudioPolicyEntity.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/AudioPolicyEntity.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/BluetoothDatabaseMigration.java b/android/app/src/com/android/bluetooth/btservice/storage/BluetoothDatabaseMigration.java index c083c04e01..bcaad1ef16 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/BluetoothDatabaseMigration.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/BluetoothDatabaseMigration.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/CustomizedMetadataEntity.java b/android/app/src/com/android/bluetooth/btservice/storage/CustomizedMetadataEntity.java index 4b224c24d0..d7cb75cbbf 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/CustomizedMetadataEntity.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/CustomizedMetadataEntity.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java b/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java index ca0d8ac3eb..b5724c4fa4 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/Metadata.java b/android/app/src/com/android/bluetooth/btservice/storage/Metadata.java index 28b286280f..d60ccadc21 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/Metadata.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/Metadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/MetadataDao.java b/android/app/src/com/android/bluetooth/btservice/storage/MetadataDao.java index 7db45bf9e3..be485b5c1e 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/MetadataDao.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/MetadataDao.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/MetadataDatabase.java b/android/app/src/com/android/bluetooth/btservice/storage/MetadataDatabase.java index 00c52734a8..d535ab5ff8 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/MetadataDatabase.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/MetadataDatabase.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/btservice/storage/ProfilePrioritiesEntity.java b/android/app/src/com/android/bluetooth/btservice/storage/ProfilePrioritiesEntity.java index 5fb23b9267..758a17e1c2 100644 --- a/android/app/src/com/android/bluetooth/btservice/storage/ProfilePrioritiesEntity.java +++ b/android/app/src/com/android/bluetooth/btservice/storage/ProfilePrioritiesEntity.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtils.java b/android/app/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtils.java index 72be2ec6b3..0b6d2179d6 100644 --- a/android/app/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtils.java +++ b/android/app/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/gatt/AdvertiseBinder.kt b/android/app/src/com/android/bluetooth/gatt/AdvertiseBinder.kt index 02f4f9ff98..9d08625db7 100644 --- a/android/app/src/com/android/bluetooth/gatt/AdvertiseBinder.kt +++ b/android/app/src/com/android/bluetooth/gatt/AdvertiseBinder.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/gatt/AppAdvertiseStats.java b/android/app/src/com/android/bluetooth/gatt/AppAdvertiseStats.java index b9ebfad69f..44154b31bd 100644 --- a/android/app/src/com/android/bluetooth/gatt/AppAdvertiseStats.java +++ b/android/app/src/com/android/bluetooth/gatt/AppAdvertiseStats.java @@ -35,7 +35,6 @@ import androidx.annotation.VisibleForTesting; import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.btservice.MetricsLogger; -import com.android.bluetooth.flags.Flags; import java.time.Duration; import java.time.Instant; @@ -219,14 +218,13 @@ class AppAdvertiseStats { } void recordAdvertiseErrorCount(int status) { - if (Flags.bleScanAdvMetricsRedesign()) { - BluetoothStatsLog.write( - BluetoothStatsLog.LE_ADV_ERROR_REPORTED, - new int[] {mAppUid}, - new String[] {mAppName}, - BluetoothStatsLog.LE_ADV_ERROR_REPORTED__LE_ADV_OP_CODE__ERROR_CODE_ON_START, - convertStatusCode(status)); - } + BluetoothStatsLog.write( + BluetoothStatsLog.LE_ADV_ERROR_REPORTED, + new int[] {mAppUid}, + new String[] {mAppName}, + BluetoothStatsLog.LE_ADV_ERROR_REPORTED__LE_ADV_OP_CODE__ERROR_CODE_ON_START, + convertStatusCode(status), + getAttributionTag()); MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_ERROR_ON_START_COUNT, 1); } @@ -355,6 +353,10 @@ class AppAdvertiseStats { mAppImportance = importance; } + private String getAttributionTag() { + return mAttributionTag != null ? mAttributionTag : ""; + } + private static void recordAdvertiseDurationCount( Duration duration, boolean isConnectable, boolean inPeriodic) { if (duration.compareTo(Duration.ofMinutes(1)) < 0) { @@ -416,22 +418,21 @@ class AppAdvertiseStats { } private void recordAdvertiseEnableCount(boolean enable, int instanceCount, long durationMs) { - if (Flags.bleScanAdvMetricsRedesign()) { - MetricsLogger.getInstance() - .logAdvStateChanged( - new int[] {mAppUid}, - new String[] {mAppName}, - enable /* enabled */, - convertAdvInterval(mInterval), - convertTxPowerLevel(mTxPowerLevel), - mConnectable, - mPeriodicAdvertisingEnabled, - mScanResponseData != null && mScannable /* hasScanResponse */, - !mLegacy /* isExtendedAdv */, - instanceCount, - durationMs, - mAppImportance); - } + MetricsLogger.getInstance() + .logAdvStateChanged( + new int[] {mAppUid}, + new String[] {mAppName}, + enable /* enabled */, + convertAdvInterval(mInterval), + convertTxPowerLevel(mTxPowerLevel), + mConnectable, + mPeriodicAdvertisingEnabled, + mScanResponseData != null && mScannable /* hasScanResponse */, + !mLegacy /* isExtendedAdv */, + instanceCount, + durationMs, + mAppImportance, + getAttributionTag()); if (enable) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_COUNT_ENABLE, 1); if (mConnectable) { diff --git a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementBinder.kt b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementBinder.kt index a63b757904..4d0835c175 100644 --- a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementBinder.kt +++ b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementBinder.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.bluetooth.gatt import android.Manifest diff --git a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementManager.java b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementManager.java index 5494b442a6..186865c23a 100644 --- a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementManager.java +++ b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementNativeInterface.java b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementNativeInterface.java index f5118d01d7..8cc365c291 100644 --- a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementNativeInterface.java +++ b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementTracker.java b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementTracker.java index 0885d393fe..dee39179af 100644 --- a/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementTracker.java +++ b/android/app/src/com/android/bluetooth/gatt/DistanceMeasurementTracker.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/gatt/GattNativeInterface.java b/android/app/src/com/android/bluetooth/gatt/GattNativeInterface.java index 5a19a96186..37699ff2e1 100644 --- a/android/app/src/com/android/bluetooth/gatt/GattNativeInterface.java +++ b/android/app/src/com/android/bluetooth/gatt/GattNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/gatt/GattObjectsFactory.java b/android/app/src/com/android/bluetooth/gatt/GattObjectsFactory.java index 0279b2b199..28ecaa7b4f 100644 --- a/android/app/src/com/android/bluetooth/gatt/GattObjectsFactory.java +++ b/android/app/src/com/android/bluetooth/gatt/GattObjectsFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/gatt/GattService.java b/android/app/src/com/android/bluetooth/gatt/GattService.java index aaa00b45df..6e5faefa9f 100644 --- a/android/app/src/com/android/bluetooth/gatt/GattService.java +++ b/android/app/src/com/android/bluetooth/gatt/GattService.java @@ -24,8 +24,8 @@ import static android.bluetooth.BluetoothProfile.STATE_DISCONNECTED; import static android.bluetooth.BluetoothUtils.toAnonymizedAddress; import static com.android.bluetooth.Utils.callbackToApp; -import static com.android.bluetooth.Utils.callerIsSystemOrActiveOrManagedUser; import static com.android.bluetooth.Utils.checkCallerTargetSdk; +import static com.android.bluetooth.Utils.checkConnectPermissionForDataDelivery; import static com.android.bluetooth.util.AttributionSourceUtil.getLastAttributionTag; import static java.util.Objects.requireNonNull; @@ -43,7 +43,6 @@ import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothProtoEnums; import android.bluetooth.BluetoothStatusCodes; -import android.bluetooth.IBluetoothGatt; import android.bluetooth.IBluetoothGattCallback; import android.bluetooth.IBluetoothGattServerCallback; import android.companion.CompanionDeviceManager; @@ -212,7 +211,7 @@ public class GattService extends ProfileService { @Override protected IProfileServiceBinder initBinder() { - return new BluetoothGattBinder(this); + return new GattServiceBinder(this); } @Override @@ -263,6 +262,10 @@ public class GattService extends ProfileService { return mScanController; } + CompanionDeviceManager getCompanionDeviceManager() { + return mCompanionDeviceManager; + } + @Override protected void setTestModeEnabled(boolean enableTestMode) { if (mScanController != null) { @@ -330,479 +333,6 @@ public class GattService extends ProfileService { } } - /** Handlers for incoming service calls */ - @VisibleForTesting - static class BluetoothGattBinder extends IBluetoothGatt.Stub implements IProfileServiceBinder { - private GattService mService; - - BluetoothGattBinder(GattService svc) { - mService = svc; - } - - @Override - public void cleanup() { - mService = null; - } - - private GattService getService() { - // Cache mService because it can change while getService is called - GattService service = mService; - - if (service == null || !service.isAvailable()) { - Log.e(TAG, "getService() - Service requested, but not available!"); - return null; - } - - return service; - } - - @Override - public List<BluetoothDevice> getDevicesMatchingConnectionStates( - int[] states, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return Collections.emptyList(); - } - return service.getDevicesMatchingConnectionStates(states, source); - } - - @Override - public void registerClient( - ParcelUuid uuid, - IBluetoothGattCallback callback, - boolean eattSupport, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.registerClient(uuid.getUuid(), callback, eattSupport, source); - } - - @Override - public void unregisterClient(int clientIf, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.unregisterClient( - clientIf, source, ContextMap.RemoveReason.REASON_UNREGISTER_CLIENT); - } - - @Override - public void clientConnect( - int clientIf, - String address, - int addressType, - boolean isDirect, - int transport, - boolean opportunistic, - int phy, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.clientConnect( - clientIf, - address, - addressType, - isDirect, - transport, - opportunistic, - phy, - source); - } - - @Override - public void clientDisconnect(int clientIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.clientDisconnect(clientIf, address, source); - } - - @Override - public void clientSetPreferredPhy( - int clientIf, - String address, - int txPhy, - int rxPhy, - int phyOptions, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.clientSetPreferredPhy(clientIf, address, txPhy, rxPhy, phyOptions, source); - } - - @Override - public void clientReadPhy(int clientIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.clientReadPhy(clientIf, address, source); - } - - @Override - public void refreshDevice(int clientIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.refreshDevice(clientIf, address, source); - } - - @Override - public void discoverServices(int clientIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.discoverServices(clientIf, address, source); - } - - @Override - public void discoverServiceByUuid( - int clientIf, String address, ParcelUuid uuid, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.discoverServiceByUuid(clientIf, address, uuid.getUuid(), source); - } - - @Override - public void readCharacteristic( - int clientIf, String address, int handle, int authReq, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.readCharacteristic(clientIf, address, handle, authReq, source); - } - - @Override - public void readUsingCharacteristicUuid( - int clientIf, - String address, - ParcelUuid uuid, - int startHandle, - int endHandle, - int authReq, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.readUsingCharacteristicUuid( - clientIf, address, uuid.getUuid(), startHandle, endHandle, authReq, source); - } - - @Override - public int writeCharacteristic( - int clientIf, - String address, - int handle, - int writeType, - int authReq, - byte[] value, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_PROFILE_SERVICE_NOT_BOUND; - } - return service.writeCharacteristic( - clientIf, address, handle, writeType, authReq, value, source); - } - - @Override - public void readDescriptor( - int clientIf, String address, int handle, int authReq, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.readDescriptor(clientIf, address, handle, authReq, source); - } - - @Override - public int writeDescriptor( - int clientIf, - String address, - int handle, - int authReq, - byte[] value, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_PROFILE_SERVICE_NOT_BOUND; - } - return service.writeDescriptor(clientIf, address, handle, authReq, value, source); - } - - @Override - public void beginReliableWrite(int clientIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.beginReliableWrite(clientIf, address, source); - } - - @Override - public void endReliableWrite( - int clientIf, String address, boolean execute, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.endReliableWrite(clientIf, address, execute, source); - } - - @Override - public void registerForNotification( - int clientIf, - String address, - int handle, - boolean enable, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.registerForNotification(clientIf, address, handle, enable, source); - } - - @Override - public void readRemoteRssi(int clientIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.readRemoteRssi(clientIf, address, source); - } - - @Override - public void configureMTU(int clientIf, String address, int mtu, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.configureMTU(clientIf, address, mtu, source); - } - - @Override - public void connectionParameterUpdate( - int clientIf, String address, int connectionPriority, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.connectionParameterUpdate(clientIf, address, connectionPriority, source); - } - - @Override - public void leConnectionUpdate( - int clientIf, - String address, - int minConnectionInterval, - int maxConnectionInterval, - int peripheralLatency, - int supervisionTimeout, - int minConnectionEventLen, - int maxConnectionEventLen, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.leConnectionUpdate( - clientIf, - address, - minConnectionInterval, - maxConnectionInterval, - peripheralLatency, - supervisionTimeout, - minConnectionEventLen, - maxConnectionEventLen, - source); - } - - @Override - public int subrateModeRequest( - int clientIf, BluetoothDevice device, int subrateMode, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; - } - if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "subrateModeRequest")) { - return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; - } - - if (!Utils.checkConnectPermissionForDataDelivery( - service, source, "GattService subrateModeRequest")) { - return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; - } - - Utils.enforceCdmAssociationIfNotBluetoothPrivileged( - service, service.mCompanionDeviceManager, source, device); - - if (subrateMode < BluetoothGatt.SUBRATE_REQUEST_MODE_BALANCED - || subrateMode > BluetoothGatt.SUBRATE_REQUEST_MODE_LOW_POWER) { - throw new IllegalArgumentException("Subrate Mode not within valid range"); - } - - requireNonNull(device); - String address = device.getAddress(); - if (!BluetoothAdapter.checkBluetoothAddress(address)) { - throw new IllegalArgumentException("Invalid device address: " + address); - } - - return service.subrateModeRequest(clientIf, device, subrateMode); - } - - @Override - public void registerServer( - ParcelUuid uuid, - IBluetoothGattServerCallback callback, - boolean eattSupport, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.registerServer(uuid.getUuid(), callback, eattSupport, source); - } - - @Override - public void unregisterServer(int serverIf, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.unregisterServer(serverIf, source); - } - - @Override - public void serverConnect( - int serverIf, - String address, - int addressType, - boolean isDirect, - int transport, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.serverConnect(serverIf, address, addressType, isDirect, transport, source); - } - - @Override - public void serverDisconnect(int serverIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.serverDisconnect(serverIf, address, source); - } - - @Override - public void serverSetPreferredPhy( - int serverIf, - String address, - int txPhy, - int rxPhy, - int phyOptions, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.serverSetPreferredPhy(serverIf, address, txPhy, rxPhy, phyOptions, source); - } - - @Override - public void serverReadPhy(int clientIf, String address, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.serverReadPhy(clientIf, address, source); - } - - @Override - public void addService(int serverIf, BluetoothGattService svc, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.addService(serverIf, svc, source); - } - - @Override - public void removeService(int serverIf, int handle, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.removeService(serverIf, handle, source); - } - - @Override - public void clearServices(int serverIf, AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.clearServices(serverIf, source); - } - - @Override - public void sendResponse( - int serverIf, - String address, - int requestId, - int status, - int offset, - byte[] value, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.sendResponse(serverIf, address, requestId, status, offset, value, source); - } - - @Override - public int sendNotification( - int serverIf, - String address, - int handle, - boolean confirm, - byte[] value, - AttributionSource source) { - GattService service = getService(); - if (service == null) { - return BluetoothStatusCodes.ERROR_PROFILE_SERVICE_NOT_BOUND; - } - return service.sendNotification(serverIf, address, handle, confirm, value, source); - } - - @Override - public void disconnectAll(AttributionSource source) { - GattService service = getService(); - if (service == null) { - return; - } - service.disconnectAll(source); - } - } - /************************************************************************** * Callback functions - CLIENT *************************************************************************/ @@ -1426,8 +956,8 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) List<BluetoothDevice> getDevicesMatchingConnectionStates( int[] states, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService getDevicesMatchingConnectionStates")) { + if (!checkConnectPermissionForDataDelivery( + this, source, TAG, "getDevicesMatchingConnectionStates")) { return Collections.emptyList(); } @@ -1492,8 +1022,7 @@ public class GattService extends ProfileService { IBluetoothGattCallback callback, boolean eatt_support, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService registerClient")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "registerClient")) { return; } if (Flags.gattClientDynamicAllocation() @@ -1522,8 +1051,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void unregisterClient(int clientIf, AttributionSource source, ContextMap.RemoveReason reason) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService unregisterClient")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "unregisterClient")) { return; } @@ -1551,8 +1079,7 @@ public class GattService extends ProfileService { boolean opportunistic, int phy, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService clientConnect")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "clientConnect")) { return; } @@ -1593,9 +1120,11 @@ public class GattService extends ProfileService { int preferredMtu = 0; - // Some applications expect MTU to be exchanged immediately on connections String packageName = source.getPackageName(); if (packageName != null) { + mAdapterService.addAssociatedPackage(getDevice(address), packageName); + + // Some apps expect MTU to be exchanged immediately on connections for (Map.Entry<String, Integer> entry : EARLY_MTU_EXCHANGE_PACKAGES.entrySet()) { if (packageName.contains(entry.getKey())) { preferredMtu = entry.getValue(); @@ -1640,8 +1169,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void clientDisconnect(int clientIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService clientDisconnect")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "clientDisconnect")) { return; } @@ -1679,8 +1207,7 @@ public class GattService extends ProfileService { int rxPhy, int phyOptions, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService clientSetPreferredPhy")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "clientSetPreferredPhy")) { return; } @@ -1703,8 +1230,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void clientReadPhy(int clientIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService clientReadPhy")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "clientReadPhy")) { return; } @@ -1722,8 +1248,8 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) synchronized List<ParcelUuid> getRegisteredServiceUuids(AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService getRegisteredServiceUuids")) { + if (!checkConnectPermissionForDataDelivery( + this, source, TAG, "getRegisteredServiceUuids")) { return Collections.emptyList(); } return mHandleMap.getEntries().stream() @@ -1733,8 +1259,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) List<String> getConnectedDevices(AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService getConnectedDevices")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "getConnectedDevices")) { return Collections.emptyList(); } @@ -1747,8 +1272,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void refreshDevice(int clientIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService refreshDevice")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "refreshDevice")) { return; } @@ -1758,8 +1282,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void discoverServices(int clientIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService discoverServices")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "discoverServices")) { return; } @@ -1784,8 +1307,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void discoverServiceByUuid(int clientIf, String address, UUID uuid, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService discoverServiceByUuid")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "discoverServiceByUuid")) { return; } @@ -1805,8 +1327,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void readCharacteristic( int clientIf, String address, int handle, int authReq, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService readCharacteristic")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "readCharacteristic")) { return; } @@ -1846,8 +1367,8 @@ public class GattService extends ProfileService { int endHandle, int authReq, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService readUsingCharacteristicUuid")) { + if (!checkConnectPermissionForDataDelivery( + this, source, TAG, "readUsingCharacteristicUuid")) { return; } @@ -1893,8 +1414,7 @@ public class GattService extends ProfileService { int authReq, byte[] value, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService writeCharacteristic")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "writeCharacteristic")) { return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; } @@ -1939,8 +1459,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void readDescriptor( int clientIf, String address, int handle, int authReq, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService readDescriptor")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "readDescriptor")) { return; } @@ -1977,8 +1496,7 @@ public class GattService extends ProfileService { int authReq, byte[] value, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService writeDescriptor")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "writeDescriptor")) { return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; } Log.v(TAG, "writeDescriptor() - address=" + toAnonymizedAddress(address)); @@ -2000,8 +1518,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void beginReliableWrite(int clientIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService beginReliableWrite")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "beginReliableWrite")) { return; } @@ -2011,8 +1528,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void endReliableWrite(int clientIf, String address, boolean execute, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService endReliableWrite")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "endReliableWrite")) { return; } @@ -2033,8 +1549,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void registerForNotification( int clientIf, String address, int handle, boolean enable, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService registerForNotification")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "registerForNotification")) { return; } @@ -2072,8 +1587,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void readRemoteRssi(int clientIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService readRemoteRssi")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "readRemoteRssi")) { return; } @@ -2083,8 +1597,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void configureMTU(int clientIf, String address, int mtu, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService configureMTU")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "configureMTU")) { return; } @@ -2102,8 +1615,8 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void connectionParameterUpdate( int clientIf, String address, int connectionPriority, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService connectionParameterUpdate")) { + if (!checkConnectPermissionForDataDelivery( + this, source, TAG, "connectionParameterUpdate")) { return; } @@ -2150,8 +1663,7 @@ public class GattService extends ProfileService { int minConnectionEventLen, int maxConnectionEventLen, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService leConnectionUpdate")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "leConnectionUpdate")) { return; } @@ -2184,7 +1696,7 @@ public class GattService extends ProfileService { maxConnectionEventLen); } - private int subrateModeRequest(int clientIf, BluetoothDevice device, int subrateMode) { + int subrateModeRequest(int clientIf, BluetoothDevice device, int subrateMode) { int subrateMin; int subrateMax; int maxLatency; @@ -2612,8 +2124,7 @@ public class GattService extends ProfileService { IBluetoothGattServerCallback callback, boolean eatt_support, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService registerServer")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "registerServer")) { return; } @@ -2625,8 +2136,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void unregisterServer(int serverIf, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService unregisterServer")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "unregisterServer")) { return; } @@ -2646,8 +2156,7 @@ public class GattService extends ProfileService { boolean isDirect, int transport, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService serverConnect")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "serverConnect")) { return; } @@ -2660,8 +2169,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void serverDisconnect(int serverIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService serverDisconnect")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "serverDisconnect")) { return; } @@ -2684,8 +2192,7 @@ public class GattService extends ProfileService { int rxPhy, int phyOptions, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService serverSetPreferredPhy")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "serverSetPreferredPhy")) { return; } @@ -2708,8 +2215,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void serverReadPhy(int serverIf, String address, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService serverReadPhy")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "serverReadPhy")) { return; } @@ -2727,7 +2233,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void addService(int serverIf, BluetoothGattService service, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery(this, source, "GattService addService")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "addService")) { return; } @@ -2772,8 +2278,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void removeService(int serverIf, int handle, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService removeService")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "removeService")) { return; } @@ -2784,8 +2289,7 @@ public class GattService extends ProfileService { @RequiresPermission(BLUETOOTH_CONNECT) void clearServices(int serverIf, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService clearServices")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "clearServices")) { return; } @@ -2802,8 +2306,7 @@ public class GattService extends ProfileService { int offset, byte[] value, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService sendResponse")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "sendResponse")) { return; } @@ -2852,8 +2355,7 @@ public class GattService extends ProfileService { boolean confirm, byte[] value, AttributionSource source) { - if (!Utils.checkConnectPermissionForDataDelivery( - this, source, "GattService sendNotification")) { + if (!checkConnectPermissionForDataDelivery(this, source, TAG, "sendNotification")) { return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; } diff --git a/android/app/src/com/android/bluetooth/gatt/GattServiceBinder.java b/android/app/src/com/android/bluetooth/gatt/GattServiceBinder.java new file mode 100644 index 0000000000..7be287677c --- /dev/null +++ b/android/app/src/com/android/bluetooth/gatt/GattServiceBinder.java @@ -0,0 +1,499 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bluetooth.gatt; + +import static com.android.bluetooth.Utils.callerIsSystemOrActiveOrManagedUser; +import static com.android.bluetooth.Utils.checkConnectPermissionForDataDelivery; + +import static java.util.Objects.requireNonNull; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothStatusCodes; +import android.bluetooth.IBluetoothGatt; +import android.bluetooth.IBluetoothGattCallback; +import android.bluetooth.IBluetoothGattServerCallback; +import android.content.AttributionSource; +import android.os.ParcelUuid; + +import com.android.bluetooth.Utils; +import com.android.bluetooth.btservice.ProfileService.IProfileServiceBinder; + +import java.util.Collections; +import java.util.List; + +/** Handlers for incoming service calls */ +class GattServiceBinder extends IBluetoothGatt.Stub implements IProfileServiceBinder { + private static final String TAG = + GattServiceConfig.TAG_PREFIX + GattServiceBinder.class.getSimpleName(); + + private GattService mService; + + GattServiceBinder(GattService svc) { + mService = svc; + } + + @Override + public void cleanup() { + mService = null; + } + + private GattService getService() { + GattService service = mService; + + if (!Utils.checkServiceAvailable(service, TAG)) { + return null; + } + + return service; + } + + @Override + public List<BluetoothDevice> getDevicesMatchingConnectionStates( + int[] states, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return Collections.emptyList(); + } + return service.getDevicesMatchingConnectionStates(states, source); + } + + @Override + public void registerClient( + ParcelUuid uuid, + IBluetoothGattCallback callback, + boolean eattSupport, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.registerClient(uuid.getUuid(), callback, eattSupport, source); + } + + @Override + public void unregisterClient(int clientIf, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.unregisterClient( + clientIf, source, ContextMap.RemoveReason.REASON_UNREGISTER_CLIENT); + } + + @Override + public void clientConnect( + int clientIf, + String address, + int addressType, + boolean isDirect, + int transport, + boolean opportunistic, + int phy, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.clientConnect( + clientIf, address, addressType, isDirect, transport, opportunistic, phy, source); + } + + @Override + public void clientDisconnect(int clientIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.clientDisconnect(clientIf, address, source); + } + + @Override + public void clientSetPreferredPhy( + int clientIf, + String address, + int txPhy, + int rxPhy, + int phyOptions, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.clientSetPreferredPhy(clientIf, address, txPhy, rxPhy, phyOptions, source); + } + + @Override + public void clientReadPhy(int clientIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.clientReadPhy(clientIf, address, source); + } + + @Override + public void refreshDevice(int clientIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.refreshDevice(clientIf, address, source); + } + + @Override + public void discoverServices(int clientIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.discoverServices(clientIf, address, source); + } + + @Override + public void discoverServiceByUuid( + int clientIf, String address, ParcelUuid uuid, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.discoverServiceByUuid(clientIf, address, uuid.getUuid(), source); + } + + @Override + public void readCharacteristic( + int clientIf, String address, int handle, int authReq, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.readCharacteristic(clientIf, address, handle, authReq, source); + } + + @Override + public void readUsingCharacteristicUuid( + int clientIf, + String address, + ParcelUuid uuid, + int startHandle, + int endHandle, + int authReq, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.readUsingCharacteristicUuid( + clientIf, address, uuid.getUuid(), startHandle, endHandle, authReq, source); + } + + @Override + public int writeCharacteristic( + int clientIf, + String address, + int handle, + int writeType, + int authReq, + byte[] value, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_PROFILE_SERVICE_NOT_BOUND; + } + return service.writeCharacteristic( + clientIf, address, handle, writeType, authReq, value, source); + } + + @Override + public void readDescriptor( + int clientIf, String address, int handle, int authReq, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.readDescriptor(clientIf, address, handle, authReq, source); + } + + @Override + public int writeDescriptor( + int clientIf, + String address, + int handle, + int authReq, + byte[] value, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_PROFILE_SERVICE_NOT_BOUND; + } + return service.writeDescriptor(clientIf, address, handle, authReq, value, source); + } + + @Override + public void beginReliableWrite(int clientIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.beginReliableWrite(clientIf, address, source); + } + + @Override + public void endReliableWrite( + int clientIf, String address, boolean execute, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.endReliableWrite(clientIf, address, execute, source); + } + + @Override + public void registerForNotification( + int clientIf, String address, int handle, boolean enable, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.registerForNotification(clientIf, address, handle, enable, source); + } + + @Override + public void readRemoteRssi(int clientIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.readRemoteRssi(clientIf, address, source); + } + + @Override + public void configureMTU(int clientIf, String address, int mtu, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.configureMTU(clientIf, address, mtu, source); + } + + @Override + public void connectionParameterUpdate( + int clientIf, String address, int connectionPriority, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.connectionParameterUpdate(clientIf, address, connectionPriority, source); + } + + @Override + public void leConnectionUpdate( + int clientIf, + String address, + int minConnectionInterval, + int maxConnectionInterval, + int peripheralLatency, + int supervisionTimeout, + int minConnectionEventLen, + int maxConnectionEventLen, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.leConnectionUpdate( + clientIf, + address, + minConnectionInterval, + maxConnectionInterval, + peripheralLatency, + supervisionTimeout, + minConnectionEventLen, + maxConnectionEventLen, + source); + } + + @Override + public int subrateModeRequest( + int clientIf, BluetoothDevice device, int subrateMode, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED; + } + if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "subrateModeRequest")) { + return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED; + } + if (!checkConnectPermissionForDataDelivery(service, source, TAG, "subrateModeRequest")) { + return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION; + } + + Utils.enforceCdmAssociationIfNotBluetoothPrivileged( + service, service.getCompanionDeviceManager(), source, device); + + if (subrateMode < BluetoothGatt.SUBRATE_REQUEST_MODE_BALANCED + || subrateMode > BluetoothGatt.SUBRATE_REQUEST_MODE_LOW_POWER) { + throw new IllegalArgumentException("Subrate Mode not within valid range"); + } + + requireNonNull(device); + String address = device.getAddress(); + if (!BluetoothAdapter.checkBluetoothAddress(address)) { + throw new IllegalArgumentException("Invalid device address: " + address); + } + + return service.subrateModeRequest(clientIf, device, subrateMode); + } + + @Override + public void registerServer( + ParcelUuid uuid, + IBluetoothGattServerCallback callback, + boolean eattSupport, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.registerServer(uuid.getUuid(), callback, eattSupport, source); + } + + @Override + public void unregisterServer(int serverIf, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.unregisterServer(serverIf, source); + } + + @Override + public void serverConnect( + int serverIf, + String address, + int addressType, + boolean isDirect, + int transport, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.serverConnect(serverIf, address, addressType, isDirect, transport, source); + } + + @Override + public void serverDisconnect(int serverIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.serverDisconnect(serverIf, address, source); + } + + @Override + public void serverSetPreferredPhy( + int serverIf, + String address, + int txPhy, + int rxPhy, + int phyOptions, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.serverSetPreferredPhy(serverIf, address, txPhy, rxPhy, phyOptions, source); + } + + @Override + public void serverReadPhy(int clientIf, String address, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.serverReadPhy(clientIf, address, source); + } + + @Override + public void addService(int serverIf, BluetoothGattService svc, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.addService(serverIf, svc, source); + } + + @Override + public void removeService(int serverIf, int handle, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.removeService(serverIf, handle, source); + } + + @Override + public void clearServices(int serverIf, AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.clearServices(serverIf, source); + } + + @Override + public void sendResponse( + int serverIf, + String address, + int requestId, + int status, + int offset, + byte[] value, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.sendResponse(serverIf, address, requestId, status, offset, value, source); + } + + @Override + public int sendNotification( + int serverIf, + String address, + int handle, + boolean confirm, + byte[] value, + AttributionSource source) { + GattService service = getService(); + if (service == null) { + return BluetoothStatusCodes.ERROR_PROFILE_SERVICE_NOT_BOUND; + } + return service.sendNotification(serverIf, address, handle, confirm, value, source); + } + + @Override + public void disconnectAll(AttributionSource source) { + GattService service = getService(); + if (service == null) { + return; + } + service.disconnectAll(source); + } +} diff --git a/android/app/src/com/android/bluetooth/hap/HapClientBinder.java b/android/app/src/com/android/bluetooth/hap/HapClientBinder.java index 97bd4e9f9e..eba1d9db4a 100644 --- a/android/app/src/com/android/bluetooth/hap/HapClientBinder.java +++ b/android/app/src/com/android/bluetooth/hap/HapClientBinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hap/HapClientNativeCallback.java b/android/app/src/com/android/bluetooth/hap/HapClientNativeCallback.java index 3fef07078d..5dcc0d7ed0 100644 --- a/android/app/src/com/android/bluetooth/hap/HapClientNativeCallback.java +++ b/android/app/src/com/android/bluetooth/hap/HapClientNativeCallback.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hearingaid/HearingAidNativeInterface.java b/android/app/src/com/android/bluetooth/hearingaid/HearingAidNativeInterface.java index 23ad690a21..31761db66d 100644 --- a/android/app/src/com/android/bluetooth/hearingaid/HearingAidNativeInterface.java +++ b/android/app/src/com/android/bluetooth/hearingaid/HearingAidNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java b/android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java index 0632cf4df9..a884944bac 100644 --- a/android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java +++ b/android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,6 @@ import android.util.Log; import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; -import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.Flags; @@ -1053,7 +1052,8 @@ public class HearingAidService extends ProfileService { if (!Utils.checkServiceAvailable(service, TAG) || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG) - || !Utils.checkScanPermissionForDataDelivery(service, source, TAG)) { + || !Utils.checkScanPermissionForDataDelivery( + service, source, TAG, "getAdvertisementServiceData")) { return null; } diff --git a/android/app/src/com/android/bluetooth/hearingaid/HearingAidStackEvent.java b/android/app/src/com/android/bluetooth/hearingaid/HearingAidStackEvent.java index 522dedc03e..98f822d898 100644 --- a/android/app/src/com/android/bluetooth/hearingaid/HearingAidStackEvent.java +++ b/android/app/src/com/android/bluetooth/hearingaid/HearingAidStackEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hearingaid/HearingAidStateMachine.java b/android/app/src/com/android/bluetooth/hearingaid/HearingAidStateMachine.java index bab78a2c6a..0897cc4887 100644 --- a/android/app/src/com/android/bluetooth/hearingaid/HearingAidStateMachine.java +++ b/android/app/src/com/android/bluetooth/hearingaid/HearingAidStateMachine.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableState.java b/android/app/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableState.java index 27c6343032..1df40d9f02 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableState.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableState.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetCallState.java b/android/app/src/com/android/bluetooth/hfp/HeadsetCallState.java index a0d32c7e30..b88ce47e66 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetCallState.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetCallState.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetClccResponse.java b/android/app/src/com/android/bluetooth/hfp/HeadsetClccResponse.java index bd47273e63..c3e92f6c0f 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetClccResponse.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetClccResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetDeviceState.java b/android/app/src/com/android/bluetooth/hfp/HeadsetDeviceState.java index 8f69c8cf60..395290c104 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetDeviceState.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetDeviceState.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetMessageObject.java b/android/app/src/com/android/bluetooth/hfp/HeadsetMessageObject.java index 3d2701a57c..ec28f5dba9 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetMessageObject.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetMessageObject.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetNativeInterface.java b/android/app/src/com/android/bluetooth/hfp/HeadsetNativeInterface.java index 9958163cdf..5afe78cee5 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetNativeInterface.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -357,10 +357,11 @@ public class HeadsetNativeInterface { * Start voice recognition * * @param device target headset + * @param sendResult whether a BVRA response should be sent * @return True on success, False on failure */ - boolean startVoiceRecognition(BluetoothDevice device) { - return startVoiceRecognitionNative(getByteAddress(device)); + boolean startVoiceRecognition(BluetoothDevice device, boolean sendResult) { + return startVoiceRecognitionNative(getByteAddress(device), sendResult); } /** @@ -561,7 +562,7 @@ public class HeadsetNativeInterface { private native boolean isVoiceRecognitionSupportedNative(byte[] address); - private native boolean startVoiceRecognitionNative(byte[] address); + private native boolean startVoiceRecognitionNative(byte[] address, boolean sendResult); private native boolean stopVoiceRecognitionNative(byte[] address); diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetObjectsFactory.java b/android/app/src/com/android/bluetooth/hfp/HeadsetObjectsFactory.java index 3e2948c382..89e86e7842 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetObjectsFactory.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetObjectsFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetStackEvent.java b/android/app/src/com/android/bluetooth/hfp/HeadsetStackEvent.java index 6e669e576a..e477aa14ef 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetStackEvent.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetStackEvent.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java index 4e8e14a547..6ea741af32 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java @@ -1044,7 +1044,8 @@ class HeadsetStateMachine extends StateMachine { + " is not currentDevice"); break; } - if (!mNativeInterface.startVoiceRecognition(mDevice)) { + if (!mNativeInterface.startVoiceRecognition( + mDevice, /* sendResult */ true)) { stateLogW("Failed to start voice recognition"); break; } @@ -1122,6 +1123,9 @@ class HeadsetStateMachine extends StateMachine { ? HeadsetHalConstants.AT_RESPONSE_OK : HeadsetHalConstants.AT_RESPONSE_ERROR, 0); + if (Utils.isScoManagedByAudioEnabled()) { + mNativeInterface.startVoiceRecognition(mDevice, /* sendResult */ false); + } break; } case DIALING_OUT_RESULT: diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetSystemInterface.java b/android/app/src/com/android/bluetooth/hfp/HeadsetSystemInterface.java index 67967e941b..97525cc913 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetSystemInterface.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetSystemInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package com.android.bluetooth.hfp; - import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; import android.bluetooth.BluetoothSinkAudioPolicy; diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCode.java b/android/app/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCode.java index 4acc211087..1c56188fd5 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCode.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCode.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java b/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java index 603beae96b..ebd021c9ff 100644 --- a/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java +++ b/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hid/HidDeviceNativeInterface.java b/android/app/src/com/android/bluetooth/hid/HidDeviceNativeInterface.java index 81da626bc8..2ca9078103 100644 --- a/android/app/src/com/android/bluetooth/hid/HidDeviceNativeInterface.java +++ b/android/app/src/com/android/bluetooth/hid/HidDeviceNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/hid/HidHostNativeInterface.java b/android/app/src/com/android/bluetooth/hid/HidHostNativeInterface.java index 1d0294cd52..bac98af1cc 100644 --- a/android/app/src/com/android/bluetooth/hid/HidHostNativeInterface.java +++ b/android/app/src/com/android/bluetooth/hid/HidHostNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/le_audio/LeAudioService.java b/android/app/src/com/android/bluetooth/le_audio/LeAudioService.java index cebf4270e5..de152f0ae1 100644 --- a/android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +++ b/android/app/src/com/android/bluetooth/le_audio/LeAudioService.java @@ -27,6 +27,7 @@ import static android.bluetooth.BluetoothProfile.STATE_DISCONNECTED; import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID; import static com.android.bluetooth.bass_client.BassConstants.INVALID_BROADCAST_ID; +import static com.android.bluetooth.flags.Flags.doNotHardcodeTmapRoleMask; import static com.android.bluetooth.flags.Flags.leaudioBigDependsOnAudioState; import static com.android.bluetooth.flags.Flags.leaudioBroadcastApiManagePrimaryGroup; import static com.android.bluetooth.flags.Flags.leaudioMonitorUnicastSourceWhenManagedByBroadcastDelegator; @@ -261,24 +262,49 @@ public class LeAudioService extends ProfileService { mStateMachinesThread.start(); // Initialize Broadcast native interface - if ((mAdapterService.getSupportedProfilesBitMask() - & (1 << BluetoothProfile.LE_AUDIO_BROADCAST)) - != 0) { - Log.i(TAG, "Init Le Audio broadcaster"); - LeAudioBroadcasterNativeInterface broadcastNativeInterface = - requireNonNull(LeAudioBroadcasterNativeInterface.getInstance()); - broadcastNativeInterface.init(); - mLeAudioBroadcasterNativeInterface = Optional.of(broadcastNativeInterface); - mTmapRoleMask = - LeAudioTmapGattServer.TMAP_ROLE_FLAG_CG - | LeAudioTmapGattServer.TMAP_ROLE_FLAG_UMS - | LeAudioTmapGattServer.TMAP_ROLE_FLAG_BMS; + if (doNotHardcodeTmapRoleMask()) { + int mask = 0; + if (isProfileSupported(BluetoothProfile.LE_CALL_CONTROL)) { + // Table 3.5 of TMAP v1.0: CCP Server is mandatory for the TMAP CG role. + mask |= LeAudioTmapGattServer.TMAP_ROLE_FLAG_CG; + } + if (isProfileSupported(BluetoothProfile.MCP_SERVER)) { + // Table 3.5 of TMAP v1.0: MCP Server is mandatory for the TMAP UMS role. + mask |= LeAudioTmapGattServer.TMAP_ROLE_FLAG_UMS; + } + if (isProfileSupported(BluetoothProfile.LE_AUDIO_BROADCAST)) { + Log.i(TAG, "Init Le Audio broadcaster"); + LeAudioBroadcasterNativeInterface broadcastNativeInterface = + requireNonNull(LeAudioBroadcasterNativeInterface.getInstance()); + broadcastNativeInterface.init(); + mLeAudioBroadcasterNativeInterface = Optional.of(broadcastNativeInterface); + + mask |= LeAudioTmapGattServer.TMAP_ROLE_FLAG_BMS; + } else { + mLeAudioBroadcasterNativeInterface = Optional.empty(); + Log.w(TAG, "Le Audio Broadcasts not supported."); + } + mTmapRoleMask = mask; } else { - mTmapRoleMask = - LeAudioTmapGattServer.TMAP_ROLE_FLAG_CG - | LeAudioTmapGattServer.TMAP_ROLE_FLAG_UMS; - mLeAudioBroadcasterNativeInterface = Optional.empty(); - Log.w(TAG, "Le Audio Broadcasts not supported."); + if ((mAdapterService.getSupportedProfilesBitMask() + & (1 << BluetoothProfile.LE_AUDIO_BROADCAST)) + != 0) { + Log.i(TAG, "Init Le Audio broadcaster"); + LeAudioBroadcasterNativeInterface broadcastNativeInterface = + requireNonNull(LeAudioBroadcasterNativeInterface.getInstance()); + broadcastNativeInterface.init(); + mLeAudioBroadcasterNativeInterface = Optional.of(broadcastNativeInterface); + mTmapRoleMask = + LeAudioTmapGattServer.TMAP_ROLE_FLAG_CG + | LeAudioTmapGattServer.TMAP_ROLE_FLAG_UMS + | LeAudioTmapGattServer.TMAP_ROLE_FLAG_BMS; + } else { + mTmapRoleMask = + LeAudioTmapGattServer.TMAP_ROLE_FLAG_CG + | LeAudioTmapGattServer.TMAP_ROLE_FLAG_UMS; + mLeAudioBroadcasterNativeInterface = Optional.empty(); + Log.w(TAG, "Le Audio Broadcasts not supported."); + } } mTmapStarted = registerTmap(); @@ -302,6 +328,15 @@ public class LeAudioService extends ProfileService { } } + private boolean isProfileSupported(int profile) { + return (mAdapterService.getSupportedProfilesBitMask() & (1 << profile)) != 0; + } + + @VisibleForTesting + int getTmapRoleMask() { + return mTmapRoleMask; + } + private class LeAudioGroupDescriptor { LeAudioGroupDescriptor(int groupId, boolean isInbandRingtoneEnabled) { mGroupId = groupId; diff --git a/android/app/src/com/android/bluetooth/le_audio/LeAudioTmapGattServer.java b/android/app/src/com/android/bluetooth/le_audio/LeAudioTmapGattServer.java index 9f932470fb..0d503e85d3 100644 --- a/android/app/src/com/android/bluetooth/le_audio/LeAudioTmapGattServer.java +++ b/android/app/src/com/android/bluetooth/le_audio/LeAudioTmapGattServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/le_scan/AppScanStats.java b/android/app/src/com/android/bluetooth/le_scan/AppScanStats.java index 4bead29e8c..07d7209b40 100644 --- a/android/app/src/com/android/bluetooth/le_scan/AppScanStats.java +++ b/android/app/src/com/android/bluetooth/le_scan/AppScanStats.java @@ -34,7 +34,6 @@ import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils.TimeProvider; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.MetricsLogger; -import com.android.bluetooth.flags.Flags; import com.android.bluetooth.util.WorkSourceUtil; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -72,6 +71,7 @@ class AppScanStats { static boolean sIsRadioStarted = false; static boolean sIsScreenOn = false; static int sRadioScanAppImportance = IMPORTANCE_CACHED; + @Nullable static String sRadioScanAttributionTag; @GuardedBy("sLock") static long sRadioStartTime = 0; @@ -133,6 +133,10 @@ class AppScanStats { this.appImportanceOnStart = appImportanceOnStart; this.filterString = new StringBuilder(); } + + private String getAttributionTag() { + return attributionTag != null ? attributionTag : ""; + } } private final List<LastScan> mLastScans = new ArrayList<>(); @@ -190,6 +194,7 @@ class AppScanStats { mTimeProvider = requireNonNull(timeProvider); } + @Nullable private synchronized LastScan getScanFromScannerId(int scannerId) { return mOngoingScans.get(scannerId); } @@ -389,23 +394,22 @@ class AppScanStats { private void recordScanAppCountMetricsStart(LastScan scan) { MetricsLogger logger = MetricsLogger.getInstance(); logger.cacheCount(BluetoothProtoEnums.LE_SCAN_COUNT_TOTAL_ENABLE, 1); - if (Flags.bleScanAdvMetricsRedesign()) { - logger.logAppScanStateChanged( - mWorkSourceUtil.getUids(), - mWorkSourceUtil.getTags(), - true /* enabled */, - scan.isFilterScan, - scan.isCallbackScan, - convertScanCallbackType(scan.scanCallbackType), - convertScanType(scan), - convertScanMode(scan.scanMode), - scan.reportDelayMillis, - 0 /* app_scan_duration_ms */, - mOngoingScans.size(), - sIsScreenOn, - isAppDead, - mAppImportance); - } + logger.logAppScanStateChanged( + mWorkSourceUtil.getUids(), + mWorkSourceUtil.getTags(), + true /* enabled */, + scan.isFilterScan, + scan.isCallbackScan, + convertScanCallbackType(scan.scanCallbackType), + convertScanType(scan), + convertScanMode(scan.scanMode), + scan.reportDelayMillis, + 0 /* app_scan_duration_ms */, + mOngoingScans.size(), + sIsScreenOn, + isAppDead, + mAppImportance, + scan.getAttributionTag()); if (scan.isAutoBatchScan) { logger.cacheCount(BluetoothProtoEnums.LE_SCAN_COUNT_AUTO_BATCH_ENABLE, 1); } else if (scan.isBatchScan) { @@ -422,23 +426,22 @@ class AppScanStats { private void recordScanAppCountMetricsStop(LastScan scan) { MetricsLogger logger = MetricsLogger.getInstance(); logger.cacheCount(BluetoothProtoEnums.LE_SCAN_COUNT_TOTAL_DISABLE, 1); - if (Flags.bleScanAdvMetricsRedesign()) { - logger.logAppScanStateChanged( - mWorkSourceUtil.getUids(), - mWorkSourceUtil.getTags(), - false /* enabled */, - scan.isFilterScan, - scan.isCallbackScan, - convertScanCallbackType(scan.scanCallbackType), - convertScanType(scan), - convertScanMode(scan.scanMode), - scan.reportDelayMillis, - scan.duration, - mOngoingScans.size(), - sIsScreenOn, - isAppDead, - mAppImportance); - } + logger.logAppScanStateChanged( + mWorkSourceUtil.getUids(), + mWorkSourceUtil.getTags(), + false /* enabled */, + scan.isFilterScan, + scan.isCallbackScan, + convertScanCallbackType(scan.scanCallbackType), + convertScanType(scan), + convertScanMode(scan.scanMode), + scan.reportDelayMillis, + scan.duration, + mOngoingScans.size(), + sIsScreenOn, + isAppDead, + mAppImportance, + scan.getAttributionTag()); if (scan.isAutoBatchScan) { logger.cacheCount(BluetoothProtoEnums.LE_SCAN_COUNT_AUTO_BATCH_DISABLE, 1); } else if (scan.isBatchScan) { @@ -515,46 +518,43 @@ class AppScanStats { } synchronized void recordScanTimeoutCountMetrics(int scannerId, long scanTimeoutMillis) { - if (Flags.bleScanAdvMetricsRedesign()) { - BluetoothStatsLog.write( - BluetoothStatsLog.LE_SCAN_ABUSED, - mWorkSourceUtil.getUids(), - mWorkSourceUtil.getTags(), - convertScanType(getScanFromScannerId(scannerId)), - BluetoothStatsLog.LE_SCAN_ABUSED__LE_SCAN_ABUSE_REASON__REASON_SCAN_TIMEOUT, - scanTimeoutMillis); - } + BluetoothStatsLog.write( + BluetoothStatsLog.LE_SCAN_ABUSED, + mWorkSourceUtil.getUids(), + mWorkSourceUtil.getTags(), + convertScanType(getScanFromScannerId(scannerId)), + BluetoothStatsLog.LE_SCAN_ABUSED__LE_SCAN_ABUSE_REASON__REASON_SCAN_TIMEOUT, + scanTimeoutMillis, + getAttributionTagFromScannerId(scannerId)); MetricsLogger.getInstance() .cacheCount(BluetoothProtoEnums.LE_SCAN_ABUSE_COUNT_SCAN_TIMEOUT, 1); } synchronized void recordHwFilterNotAvailableCountMetrics( int scannerId, long numOfFilterSupported) { - if (Flags.bleScanAdvMetricsRedesign()) { - BluetoothStatsLog.write( - BluetoothStatsLog.LE_SCAN_ABUSED, - mWorkSourceUtil.getUids(), - mWorkSourceUtil.getTags(), - convertScanType(getScanFromScannerId(scannerId)), - BluetoothStatsLog.LE_SCAN_ABUSED__LE_SCAN_ABUSE_REASON__REASON_HW_FILTER_NA, - numOfFilterSupported); - } + BluetoothStatsLog.write( + BluetoothStatsLog.LE_SCAN_ABUSED, + mWorkSourceUtil.getUids(), + mWorkSourceUtil.getTags(), + convertScanType(getScanFromScannerId(scannerId)), + BluetoothStatsLog.LE_SCAN_ABUSED__LE_SCAN_ABUSE_REASON__REASON_HW_FILTER_NA, + numOfFilterSupported, + getAttributionTagFromScannerId(scannerId)); MetricsLogger.getInstance() .cacheCount(BluetoothProtoEnums.LE_SCAN_ABUSE_COUNT_HW_FILTER_NOT_AVAILABLE, 1); } synchronized void recordTrackingHwFilterNotAvailableCountMetrics( int scannerId, long numOfTrackableAdv) { - if (Flags.bleScanAdvMetricsRedesign()) { - BluetoothStatsLog.write( - BluetoothStatsLog.LE_SCAN_ABUSED, - mWorkSourceUtil.getUids(), - mWorkSourceUtil.getTags(), - convertScanType(getScanFromScannerId(scannerId)), - BluetoothStatsLog - .LE_SCAN_ABUSED__LE_SCAN_ABUSE_REASON__REASON_TRACKING_HW_FILTER_NA, - numOfTrackableAdv); - } + BluetoothStatsLog.write( + BluetoothStatsLog.LE_SCAN_ABUSED, + mWorkSourceUtil.getUids(), + mWorkSourceUtil.getTags(), + convertScanType(getScanFromScannerId(scannerId)), + BluetoothStatsLog + .LE_SCAN_ABUSED__LE_SCAN_ABUSE_REASON__REASON_TRACKING_HW_FILTER_NA, + numOfTrackableAdv, + getAttributionTagFromScannerId(scannerId)); MetricsLogger.getInstance() .cacheCount( BluetoothProtoEnums.LE_SCAN_ABUSE_COUNT_TRACKING_HW_FILTER_NOT_AVAILABLE, @@ -586,6 +586,7 @@ class AppScanStats { sRadioScanIntervalMs = scanIntervalMs; sIsRadioStarted = true; sRadioScanAppImportance = stats.mAppImportance; + sRadioScanAttributionTag = stats.getAttributionTagFromScannerId(scannerId); } return true; } @@ -596,10 +597,6 @@ class AppScanStats { return false; } recordScanRadioDurationMetrics(timeProvider); - if (!Flags.bleScanAdvMetricsRedesign()) { - sRadioStartTime = 0; - sIsRadioStarted = false; - } } return true; } @@ -615,20 +612,19 @@ class AppScanStats { double scanWeight = getScanWeight(sRadioScanMode) * 0.01; long weightedDuration = (long) (radioScanDuration * scanWeight); - if (Flags.bleScanAdvMetricsRedesign()) { - logger.logRadioScanStopped( - getRadioScanUids(), - getRadioScanTags(), - sRadioScanType, - convertScanMode(sRadioScanMode), - sRadioScanIntervalMs, - sRadioScanWindowMs, - sIsScreenOn, - radioScanDuration, - sRadioScanAppImportance); - sRadioStartTime = 0; - sIsRadioStarted = false; - } + logger.logRadioScanStopped( + getRadioScanUids(), + getRadioScanTags(), + sRadioScanType, + convertScanMode(sRadioScanMode), + sRadioScanIntervalMs, + sRadioScanWindowMs, + sIsScreenOn, + radioScanDuration, + sRadioScanAppImportance, + getRadioScanAttributionTag()); + sRadioStartTime = 0; + sIsRadioStarted = false; if (weightedDuration > 0) { logger.cacheCount(BluetoothProtoEnums.LE_SCAN_RADIO_DURATION_REGULAR, weightedDuration); if (sIsScreenOn) { @@ -659,6 +655,12 @@ class AppScanStats { } } + private static String getRadioScanAttributionTag() { + synchronized (sLock) { + return sRadioScanAttributionTag != null ? sRadioScanAttributionTag : ""; + } + } + @GuardedBy("sLock") private static void recordScreenOnOffMetrics(boolean isScreenOn) { if (isScreenOn) { @@ -692,15 +694,14 @@ class AppScanStats { if (!sIsRadioStarted) { return; } - if (Flags.bleScanAdvMetricsRedesign()) { - BluetoothStatsLog.write( - BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED, - getRadioScanUids(), - getRadioScanTags(), - 1 /* num_results */, - BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED__LE_SCAN_TYPE__SCAN_TYPE_REGULAR, - sIsScreenOn); - } + BluetoothStatsLog.write( + BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED, + getRadioScanUids(), + getRadioScanTags(), + 1 /* num_results */, + BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED__LE_SCAN_TYPE__SCAN_TYPE_REGULAR, + sIsScreenOn, + getRadioScanAttributionTag()); MetricsLogger logger = MetricsLogger.getInstance(); logger.cacheCount(BluetoothProtoEnums.LE_SCAN_RESULTS_COUNT_REGULAR, 1); if (sIsScreenOn) { @@ -716,15 +717,14 @@ class AppScanStats { synchronized (sLock) { isScreenOn = sIsScreenOn; } - if (Flags.bleScanAdvMetricsRedesign()) { - BluetoothStatsLog.write( - BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED, - getRadioScanUids(), - getRadioScanTags(), - numRecords, - BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED__LE_SCAN_TYPE__SCAN_TYPE_BATCH, - sIsScreenOn); - } + BluetoothStatsLog.write( + BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED, + getRadioScanUids(), + getRadioScanTags(), + numRecords, + BluetoothStatsLog.LE_SCAN_RESULT_RECEIVED__LE_SCAN_TYPE__SCAN_TYPE_BATCH, + sIsScreenOn, + getRadioScanAttributionTag()); MetricsLogger logger = MetricsLogger.getInstance(); logger.cacheCount(BluetoothProtoEnums.LE_SCAN_RESULTS_COUNT_BATCH_BUNDLE, 1); logger.cacheCount(BluetoothProtoEnums.LE_SCAN_RESULTS_COUNT_BATCH, numRecords); @@ -829,6 +829,11 @@ class AppScanStats { < LARGE_SCAN_TIME_GAP_MS); } + private String getAttributionTagFromScannerId(int scannerId) { + LastScan scan = getScanFromScannerId(scannerId); + return scan == null ? "" : scan.getAttributionTag(); + } + private static String filterToStringWithoutNullParam(ScanFilter filter) { StringBuilder filterString = new StringBuilder("BluetoothLeScanFilter ["); if (filter.getDeviceName() != null) { diff --git a/android/app/src/com/android/bluetooth/le_scan/BatchScanThrottler.java b/android/app/src/com/android/bluetooth/le_scan/BatchScanThrottler.java index 3cc06fffe4..3569745bd5 100644 --- a/android/app/src/com/android/bluetooth/le_scan/BatchScanThrottler.java +++ b/android/app/src/com/android/bluetooth/le_scan/BatchScanThrottler.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/le_scan/PeriodicScanNativeInterface.java b/android/app/src/com/android/bluetooth/le_scan/PeriodicScanNativeInterface.java index 0d06dfb0cc..71558cae4c 100644 --- a/android/app/src/com/android/bluetooth/le_scan/PeriodicScanNativeInterface.java +++ b/android/app/src/com/android/bluetooth/le_scan/PeriodicScanNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/le_scan/ScanBinder.java b/android/app/src/com/android/bluetooth/le_scan/ScanBinder.java deleted file mode 100644 index 2e905e087a..0000000000 --- a/android/app/src/com/android/bluetooth/le_scan/ScanBinder.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.bluetooth.le_scan; - -import android.app.PendingIntent; -import android.bluetooth.BluetoothDevice; -import android.bluetooth.IBluetoothScan; -import android.bluetooth.le.IPeriodicAdvertisingCallback; -import android.bluetooth.le.IScannerCallback; -import android.bluetooth.le.ScanFilter; -import android.bluetooth.le.ScanResult; -import android.bluetooth.le.ScanSettings; -import android.content.AttributionSource; -import android.os.WorkSource; -import android.util.Log; - -import java.util.List; - -class ScanBinder extends IBluetoothScan.Stub { - private static final String TAG = ScanBinder.class.getSimpleName(); - - private ScanController mScanController; - - ScanBinder(ScanController scanController) { - mScanController = scanController; - } - - @Override - public void registerScanner( - IScannerCallback callback, WorkSource workSource, AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.registerScanner(callback, workSource, source); - } - - @Override - public void unregisterScanner(int scannerId, AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.unregisterScanner(scannerId, source); - } - - @Override - public void startScan( - int scannerId, - ScanSettings settings, - List<ScanFilter> filters, - AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.startScan(scannerId, settings, filters, source); - } - - @Override - public void startScanForIntent( - PendingIntent intent, - ScanSettings settings, - List<ScanFilter> filters, - AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.registerPiAndStartScan(intent, settings, filters, source); - } - - @Override - public void stopScan(int scannerId, AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.stopScan(scannerId, source); - } - - @Override - public void stopScanForIntent(PendingIntent intent, AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.stopScan(intent, source); - } - - @Override - public void flushPendingBatchResults(int scannerId, AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.flushPendingBatchResults(scannerId, source); - } - - @Override - public void registerSync( - ScanResult scanResult, - int skip, - int timeout, - IPeriodicAdvertisingCallback callback, - AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.registerSync(scanResult, skip, timeout, callback, source); - } - - @Override - public void unregisterSync(IPeriodicAdvertisingCallback callback, AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.unregisterSync(callback, source); - } - - @Override - public void transferSync( - BluetoothDevice bda, int serviceData, int syncHandle, AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.transferSync(bda, serviceData, syncHandle, source); - } - - @Override - public void transferSetInfo( - BluetoothDevice bda, - int serviceData, - int advHandle, - IPeriodicAdvertisingCallback callback, - AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return; - } - scanController.transferSetInfo(bda, serviceData, advHandle, callback, source); - } - - @Override - public int numHwTrackFiltersAvailable(AttributionSource source) { - ScanController scanController = getScanController(); - if (scanController == null) { - return 0; - } - return scanController.numHwTrackFiltersAvailable(source); - } - - void clearScanController() { - mScanController = null; - } - - private ScanController getScanController() { - ScanController controller = mScanController; - if (controller != null && controller.isAvailable()) { - return controller; - } - Log.e(TAG, "getScanController() - ScanController requested, but not available!"); - return null; - } -} diff --git a/android/app/src/com/android/bluetooth/le_scan/ScanBinder.kt b/android/app/src/com/android/bluetooth/le_scan/ScanBinder.kt new file mode 100644 index 0000000000..bd5bd6e111 --- /dev/null +++ b/android/app/src/com/android/bluetooth/le_scan/ScanBinder.kt @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bluetooth.le_scan + +import android.app.PendingIntent +import android.bluetooth.BluetoothDevice +import android.bluetooth.IBluetoothScan +import android.bluetooth.le.IPeriodicAdvertisingCallback +import android.bluetooth.le.IScannerCallback +import android.bluetooth.le.ScanFilter +import android.bluetooth.le.ScanResult +import android.bluetooth.le.ScanSettings +import android.content.AttributionSource +import android.os.WorkSource +import android.util.Log + +class ScanBinder(private val mScanController: ScanController) : IBluetoothScan.Stub() { + + companion object { + private val TAG = ScanBinder::class.java.simpleName + } + + @Volatile private var mIsAvailable = true + + fun cleanup() { + mIsAvailable = false + } + + private fun getScanController(): ScanController? { + if (mIsAvailable) { + return mScanController + } else { + Log.e(TAG, "getScanController() - ScanController requested, but not available!") + return null + } + } + + override fun registerScanner( + callback: IScannerCallback, + workSource: WorkSource?, + source: AttributionSource, + ) { + getScanController()?.let { scanController -> + scanController.registerScanner(callback, workSource, source) + } + } + + override fun unregisterScanner(scannerId: Int, source: AttributionSource) { + getScanController()?.let { scanController -> + scanController.unregisterScanner(scannerId, source) + } + } + + override fun startScan( + scannerId: Int, + settings: ScanSettings?, + filters: List<ScanFilter>?, + source: AttributionSource, + ) { + getScanController()?.let { scanController -> + scanController.startScan(scannerId, settings, filters, source) + } + } + + override fun startScanForIntent( + intent: PendingIntent, + settings: ScanSettings?, + filters: List<ScanFilter>?, + source: AttributionSource, + ) { + getScanController()?.let { scanController -> + scanController.registerPiAndStartScan(intent, settings, filters, source) + } + } + + override fun stopScan(scannerId: Int, source: AttributionSource) { + getScanController()?.let { scanController -> scanController.stopScan(scannerId, source) } + } + + override fun stopScanForIntent(intent: PendingIntent, source: AttributionSource) { + getScanController()?.let { scanController -> scanController.stopScan(intent, source) } + } + + override fun flushPendingBatchResults(scannerId: Int, source: AttributionSource) { + getScanController()?.let { scanController -> + scanController.flushPendingBatchResults(scannerId, source) + } + } + + override fun registerSync( + scanResult: ScanResult, + skip: Int, + timeout: Int, + callback: IPeriodicAdvertisingCallback, + source: AttributionSource, + ) { + getScanController()?.let { scanController -> + scanController.registerSync(scanResult, skip, timeout, callback, source) + } + } + + override fun unregisterSync(callback: IPeriodicAdvertisingCallback, source: AttributionSource) { + getScanController()?.let { scanController -> + scanController.unregisterSync(callback, source) + } + } + + override fun transferSync( + device: BluetoothDevice, + serviceData: Int, + syncHandle: Int, + source: AttributionSource, + ) { + getScanController()?.let { scanController -> + scanController.transferSync(device, serviceData, syncHandle, source) + } + } + + override fun transferSetInfo( + device: BluetoothDevice, + serviceData: Int, + advHandle: Int, + callback: IPeriodicAdvertisingCallback, + source: AttributionSource, + ) { + getScanController()?.let { scanController -> + scanController.transferSetInfo(device, serviceData, advHandle, callback, source) + } + } + + override fun numHwTrackFiltersAvailable(source: AttributionSource): Int { + return getScanController()?.let { scanController -> + scanController.numHwTrackFiltersAvailable(source) + } ?: 0 + } +} diff --git a/android/app/src/com/android/bluetooth/le_scan/ScanController.java b/android/app/src/com/android/bluetooth/le_scan/ScanController.java index 07ff67b65b..2fc20d8314 100644 --- a/android/app/src/com/android/bluetooth/le_scan/ScanController.java +++ b/android/app/src/com/android/bluetooth/le_scan/ScanController.java @@ -22,6 +22,7 @@ import static android.Manifest.permission.UPDATE_DEVICE_STATS; import static android.bluetooth.BluetoothUtils.extractBytes; import static com.android.bluetooth.Utils.checkCallerTargetSdk; +import static com.android.bluetooth.Utils.checkScanPermissionForDataDelivery; import static com.android.bluetooth.flags.Flags.leaudioBassScanWithInternalScanController; import static java.util.Objects.requireNonNull; @@ -72,11 +73,9 @@ import libcore.util.HexEncoding; import com.google.protobuf.ByteString; -import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Deque; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -137,7 +136,6 @@ public class ScanController { private volatile boolean mTestModeEnabled = false; private ScannerMap mScannerMap = new ScannerMap(); - private boolean mIsAvailable; private Handler mTestModeHandler; public ScanController(AdapterService adapterService) { @@ -165,7 +163,6 @@ public class ScanController { }; mMainLooper = adapterService.getMainLooper(); mBinder = new ScanBinder(this); - mIsAvailable = true; mScanThread = new HandlerThread("BluetoothScanManager"); mScanThread.start(); mAppOps = mAdapterService.getSystemService(AppOpsManager.class); @@ -182,18 +179,13 @@ public class ScanController { public void cleanup() { Log.i(TAG, "Cleanup ScanController"); - mIsAvailable = false; - mBinder.clearScanController(); + mBinder.cleanup(); mScanThread.quitSafely(); mScannerMap.clear(); mScanManager.cleanup(); mPeriodicScanManager.cleanup(); } - boolean isAvailable() { - return mIsAvailable; - } - ScannerMap getScannerMap() { return mScannerMap; } @@ -1091,8 +1083,7 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) void registerScanner( IScannerCallback callback, WorkSource workSource, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController registerScanner")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "registerScanner")) { return; } @@ -1125,8 +1116,8 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) void unregisterScanner(int scannerId, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController unregisterScanner")) { + if (!checkScanPermissionForDataDelivery( + mAdapterService, source, TAG, "unregisterScanner")) { return; } @@ -1172,7 +1163,7 @@ public class ScanController { List<ScanFilter> filters, AttributionSource source) { Log.d(TAG, "Start scan with filters"); - if (!Utils.checkScanPermissionForDataDelivery(mAdapterService, source, "Starting scan.")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "startScan")) { return; } @@ -1264,7 +1255,8 @@ public class ScanController { List<ScanFilter> filters, AttributionSource source) { Log.d(TAG, "Start scan with filters, for PendingIntent"); - if (!Utils.checkScanPermissionForDataDelivery(mAdapterService, source, "Starting scan.")) { + if (!checkScanPermissionForDataDelivery( + mAdapterService, source, TAG, "registerPiAndStartScan")) { return; } @@ -1368,8 +1360,8 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) void flushPendingBatchResults(int scannerId, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController flushPendingBatchResults")) { + if (!checkScanPermissionForDataDelivery( + mAdapterService, source, TAG, "flushPendingBatchResults")) { return; } flushPendingBatchResultsInternal(scannerId); @@ -1382,8 +1374,7 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) void stopScan(int scannerId, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController stopScan")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "stopScan")) { return; } stopScanInternal(scannerId); @@ -1405,8 +1396,7 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) void stopScan(PendingIntent intent, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController stopScan")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "stopScan")) { return; } stopScanInternal(intent); @@ -1435,8 +1425,7 @@ public class ScanController { int timeout, IPeriodicAdvertisingCallback callback, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController registerSync")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "registerSync")) { return; } mPeriodicScanManager.startSync(scanResult, skip, timeout, callback); @@ -1444,8 +1433,7 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) void unregisterSync(IPeriodicAdvertisingCallback callback, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController unregisterSync")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "unregisterSync")) { return; } mPeriodicScanManager.stopSync(callback); @@ -1454,8 +1442,7 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) void transferSync( BluetoothDevice bda, int serviceData, int syncHandle, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController transferSync")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "transferSync")) { return; } mPeriodicScanManager.transferSync(bda, serviceData, syncHandle); @@ -1468,8 +1455,7 @@ public class ScanController { int advHandle, IPeriodicAdvertisingCallback callback, AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController transferSetInfo")) { + if (!checkScanPermissionForDataDelivery(mAdapterService, source, TAG, "transferSetInfo")) { return; } mPeriodicScanManager.transferSetInfo(bda, serviceData, advHandle, callback); @@ -1477,8 +1463,8 @@ public class ScanController { @RequiresPermission(BLUETOOTH_SCAN) int numHwTrackFiltersAvailable(AttributionSource source) { - if (!Utils.checkScanPermissionForDataDelivery( - mAdapterService, source, "ScanController numHwTrackFiltersAvailable")) { + if (!checkScanPermissionForDataDelivery( + mAdapterService, source, TAG, "numHwTrackFiltersAvailable")) { return 0; } return (mAdapterService.getTotalNumOfTrackableAdvertisements() diff --git a/android/app/src/com/android/bluetooth/le_scan/ScanManager.java b/android/app/src/com/android/bluetooth/le_scan/ScanManager.java index cf6ef7d928..e31bd36bbb 100644 --- a/android/app/src/com/android/bluetooth/le_scan/ScanManager.java +++ b/android/app/src/com/android/bluetooth/le_scan/ScanManager.java @@ -1292,18 +1292,6 @@ public class ScanManager { && client.mSettings.getScanMode() != ScanSettings.SCAN_MODE_OPPORTUNISTIC) { Log.d(TAG, "start gattClientScanNative from startRegularScan()"); mNativeInterface.gattClientScan(true); - if (!Flags.bleScanAdvMetricsRedesign()) { - if (client.mStats != null - && !AppScanStats.recordScanRadioStart( - client.mSettings.getScanMode(), - client.mScannerId, - client.mStats, - getScanWindowMillis(client.mSettings), - getScanIntervalMillis(client.mSettings), - mTimeProvider)) { - Log.w(TAG, "Scan radio already started"); - } - } } } diff --git a/android/app/src/com/android/bluetooth/le_scan/ScanObjectsFactory.java b/android/app/src/com/android/bluetooth/le_scan/ScanObjectsFactory.java index cca760249f..c7f3605588 100644 --- a/android/app/src/com/android/bluetooth/le_scan/ScanObjectsFactory.java +++ b/android/app/src/com/android/bluetooth/le_scan/ScanObjectsFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/notification/NotificationHelperService.java b/android/app/src/com/android/bluetooth/notification/NotificationHelperService.java index a9a7d9a408..e87bd90ae4 100644 --- a/android/app/src/com/android/bluetooth/notification/NotificationHelperService.java +++ b/android/app/src/com/android/bluetooth/notification/NotificationHelperService.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/pan/PanNativeInterface.java b/android/app/src/com/android/bluetooth/pan/PanNativeInterface.java index 76e91d8477..dc203821b2 100644 --- a/android/app/src/com/android/bluetooth/pan/PanNativeInterface.java +++ b/android/app/src/com/android/bluetooth/pan/PanNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/pbap/HandlerForStringBuffer.java b/android/app/src/com/android/bluetooth/pbap/HandlerForStringBuffer.java index 0d9a45b285..7d6333eea1 100644 --- a/android/app/src/com/android/bluetooth/pbap/HandlerForStringBuffer.java +++ b/android/app/src/com/android/bluetooth/pbap/HandlerForStringBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/pbap/PbapStateMachine.java b/android/app/src/com/android/bluetooth/pbap/PbapStateMachine.java index 41031ed92e..b0c2d11a45 100644 --- a/android/app/src/com/android/bluetooth/pbap/PbapStateMachine.java +++ b/android/app/src/com/android/bluetooth/pbap/PbapStateMachine.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,7 +45,6 @@ import com.android.bluetooth.ObexRejectServer; import com.android.bluetooth.R; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; -import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.content_profiles.ContentProfileErrorReportUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; diff --git a/android/app/src/com/android/bluetooth/sap/SapService.java b/android/app/src/com/android/bluetooth/sap/SapService.java index f2a0b17d52..c8bda8e046 100644 --- a/android/app/src/com/android/bluetooth/sap/SapService.java +++ b/android/app/src/com/android/bluetooth/sap/SapService.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/sdp/SdpManagerNativeInterface.java b/android/app/src/com/android/bluetooth/sdp/SdpManagerNativeInterface.java index f009dd9c0e..e21d1e33e7 100644 --- a/android/app/src/com/android/bluetooth/sdp/SdpManagerNativeInterface.java +++ b/android/app/src/com/android/bluetooth/sdp/SdpManagerNativeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/util/SystemProperties.java b/android/app/src/com/android/bluetooth/util/SystemProperties.java index 29c5a1be7b..b508926daa 100644 --- a/android/app/src/com/android/bluetooth/util/SystemProperties.java +++ b/android/app/src/com/android/bluetooth/util/SystemProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/src/com/android/bluetooth/vc/VolumeControlNativeCallback.java b/android/app/src/com/android/bluetooth/vc/VolumeControlNativeCallback.java index be86010bc2..a7b6234e6b 100644 --- a/android/app/src/com/android/bluetooth/vc/VolumeControlNativeCallback.java +++ b/android/app/src/com/android/bluetooth/vc/VolumeControlNativeCallback.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/Android.bp b/android/app/tests/unit/Android.bp index 01d195cc43..a5b7dc36c8 100644 --- a/android/app/tests/unit/Android.bp +++ b/android/app/tests/unit/Android.bp @@ -35,6 +35,7 @@ android_test { "androidx.room_room-runtime", "androidx.room_room-testing", "androidx.test.espresso.intents", + "androidx.test.ext.junit", "androidx.test.ext.truth", "androidx.test.rules", "androidx.test.uiautomator_uiautomator", @@ -45,6 +46,7 @@ android_test { "gson", "guava-android-testlib", "mmslib", + "mockito-kotlin2", "mockito-target-extended", "modules-utils-handlerexecutor", "platform-parametric-runner-lib", @@ -61,8 +63,11 @@ android_test { jarjar_rules: ":bluetooth-jarjar-rules", asset_dirs: ["src/com/android/bluetooth/btservice/storage/schemas"], - // Include all test java files. - srcs: ["src/**/*.java"], + // Include all test java and kotlin files. + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], jacoco: { include_filter: ["android.bluetooth.*"], exclude_filter: [], diff --git a/android/app/tests/unit/src/com/android/bluetooth/ObexAppParametersTest.java b/android/app/tests/unit/src/com/android/bluetooth/ObexAppParametersTest.java index c7bb30475e..1166a4ae10 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/ObexAppParametersTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/ObexAppParametersTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/SignedLongLongTest.java b/android/app/tests/unit/src/com/android/bluetooth/SignedLongLongTest.java index 8a887b71eb..00b4306532 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/SignedLongLongTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/SignedLongLongTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/TestUtils.java b/android/app/tests/unit/src/com/android/bluetooth/TestUtils.java index cb61bc2853..e3ffd072d3 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/TestUtils.java +++ b/android/app/tests/unit/src/com/android/bluetooth/TestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java b/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java index 4d949cb785..b8e26ed03b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpCodecConfigTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpCodecConfigTest.java index d0c253523a..8f5dd839ae 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpCodecConfigTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpCodecConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceBinderTest.java index eb3def2b89..23e7a5ed1c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceTest.java index 5ab01d1b32..b2fb43b362 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpStateMachineTest.java index d51bae8f63..c44094bd2c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dp/A2dpStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceBinderTest.java index 24ead6e4b8..aad4f1019a 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceTest.java index 5ea9ad1d94..8b108c65e5 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkStateMachineTest.java index 5d13e09c9b..5641fbe7fc 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/StackEventTest.java b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/StackEventTest.java index b4944c2324..5a0b67d77e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/StackEventTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/a2dpsink/StackEventTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowsablePlayerConnectorTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowsablePlayerConnectorTest.java index ab08c8bafc..47109d6b16 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowsablePlayerConnectorTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowsablePlayerConnectorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowserPlayerWrapperTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowserPlayerWrapperTest.java index dfa391c909..7d77021833 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowserPlayerWrapperTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/BrowserPlayerWrapperTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/GPMWrapperTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/GPMWrapperTest.java index f6ae8a4fd3..74d63bddbf 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/GPMWrapperTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/GPMWrapperTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/ImageTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/ImageTest.java index d74b4ecd5b..a74a0e7789 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/ImageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/ImageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerListTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerListTest.java index 29a3fc2be5..c7d5458ca2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerListTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerListTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerWrapperTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerWrapperTest.java index 20784033c2..ca7d227747 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerWrapperTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/MediaPlayerWrapperTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/MetadataTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/MetadataTest.java index df6efa4a56..b0ac35637d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/MetadataTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/MetadataTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/audio_util/UtilTest.java b/android/app/tests/unit/src/com/android/bluetooth/audio_util/UtilTest.java index bac99cd389..ff1b79e9a5 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/audio_util/UtilTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/audio_util/UtilTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpBipObexServerTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpBipObexServerTest.java index 73978edd1e..d67e19ee60 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpBipObexServerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpBipObexServerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorageTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorageTest.java index 4b0a53be21..46e24db940 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpCoverArtStorageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpTargetServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpTargetServiceTest.java index 611a04eac6..1111e05af7 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpTargetServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpTargetServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,8 @@ import static com.android.bluetooth.TestUtils.mockGetSystemService; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpVolumeManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpVolumeManagerTest.java index f1e54d5cd2..4ce83f3a56 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpVolumeManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcp/AvrcpVolumeManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcp/CoverArtTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcp/CoverArtTest.java index bcf90f4066..1312a589aa 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcp/CoverArtTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcp/CoverArtTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpBipClientTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpBipClientTest.java index d88f8122be..16360b5cce 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpBipClientTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpBipClientTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterfaceTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterfaceTest.java index 38938e8472..6364c499a4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterfaceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerNativeInterfaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceBinderTest.java index dd12985a44..2cbd8f356a 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceTest.java index 8c745987be..ee46a1accd 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachineTest.java index ee30dfa8d1..43688601fe 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtProviderTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtProviderTest.java index 02b563adbf..b2fbbe132f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtProviderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtStorageTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtStorageTest.java index 98d00ebe5d..33aa418fda 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtStorageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpCoverArtStorageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpItemTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpItemTest.java index dbadfc526a..40c03dd0ae 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpItemTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpItemTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayerTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayerTest.java index c1b0f52616..95d12cb2a1 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseNodeTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseNodeTest.java index dab7613a9a..aa06d75c77 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseNodeTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseNodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseTreeTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseTreeTest.java index 680f74b0c7..5d359d1ef4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseTreeTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/BrowseTreeTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/PlayerApplicationSettingsTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/PlayerApplicationSettingsTest.java index 782621d77a..a106f6e97f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/PlayerApplicationSettingsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/PlayerApplicationSettingsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/StackEventTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/StackEventTest.java index 82fe7c6162..ded802cbb7 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/StackEventTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/StackEventTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipAttachmentFormatTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipAttachmentFormatTest.java index 03afb2826a..68b06e5c95 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipAttachmentFormatTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipAttachmentFormatTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipDatetimeTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipDatetimeTest.java index 5d93884efb..abdee02e65 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipDatetimeTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipDatetimeTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipEncodingTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipEncodingTest.java index 712c304c33..dd6c498679 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipEncodingTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipEncodingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageDescriptorTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageDescriptorTest.java index 8d0415dcaa..0d87190643 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageDescriptorTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageDescriptorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageFormatTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageFormatTest.java index 75d04f6c8b..2ee0bda8bb 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageFormatTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageFormatTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImagePropertiesTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImagePropertiesTest.java index 8f11f9218f..a1c9829273 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImagePropertiesTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImagePropertiesTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageTest.java index 4a8f103ad1..ca98f02d21 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipImageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipPixelTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipPixelTest.java index 8d2146218a..1f47f0c606 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipPixelTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipPixelTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipTransformationTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipTransformationTest.java index 031a71c81e..7d5eb5a986 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipTransformationTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/BipTransformationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImagePropertiesTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImagePropertiesTest.java index fb833c757b..9633aa4f95 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImagePropertiesTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImagePropertiesTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImageTest.java b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImageTest.java index d68854b91e..4d5ca54dfb 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/avrcpcontroller/bip/RequestGetImageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryServiceTest.java index 3e0212223d..84c9640524 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryStateMachineTest.java index cf24333f8f..5e439f826b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/bas/BatteryStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/bass_client/BaseDataTest.java b/android/app/tests/unit/src/com/android/bluetooth/bass_client/BaseDataTest.java index 2b993cc4aa..c8305744e2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/bass_client/BaseDataTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/bass_client/BaseDataTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientStateMachineTest.java index a9cc51b405..6915785794 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/bass_client/BleBroadcastAssistantBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/bass_client/BleBroadcastAssistantBinderTest.java index d51e857efe..ae402d7d0f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/bass_client/BleBroadcastAssistantBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/bass_client/BleBroadcastAssistantBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResultTest.java b/android/app/tests/unit/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResultTest.java index e86952a165..d7d0605fb5 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResultTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/bass_client/PeriodicAdvertisementResultTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/bass_client/PublicBroadcastDataTest.java b/android/app/tests/unit/src/com/android/bluetooth/bass_client/PublicBroadcastDataTest.java index f8d3db6482..48c2b7935c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/bass_client/PublicBroadcastDataTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/bass_client/PublicBroadcastDataTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/ActiveDeviceManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/ActiveDeviceManagerTest.java index 13f38272e6..2af03df4ae 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/ActiveDeviceManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/ActiveDeviceManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterPropertiesTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterPropertiesTest.java index 3e6180f336..db3a61cb3a 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterPropertiesTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterPropertiesTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceBinderTest.java index 8c666babfd..955f579ce4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.bluetooth.BluetoothAdapter; import android.bluetooth.IBluetoothOobDataCallback; @@ -37,28 +38,29 @@ import org.mockito.Mockito; import java.io.FileDescriptor; +/** Test cases for {@link AdapterServiceBinder}. */ public class AdapterServiceBinderTest { @Rule public final MockitoRule mMockitoRule = new MockitoRule(); @Mock private AdapterService mService; @Mock private AdapterProperties mAdapterProperties; - private AdapterService.AdapterServiceBinder mBinder; + private AdapterServiceBinder mBinder; private AttributionSource mAttributionSource; @Before public void setUp() { - mService.mAdapterProperties = mAdapterProperties; + when(mService.getAdapterProperties()).thenReturn(mAdapterProperties); doReturn(true).when(mService).isAvailable(); doNothing().when(mService).enforceCallingOrSelfPermission(any(), any()); - mBinder = new AdapterService.AdapterServiceBinder(mService); + mBinder = new AdapterServiceBinder(mService); mAttributionSource = new AttributionSource.Builder(0).build(); } @Test public void getAddress() { mBinder.getAddress(mAttributionSource); - verify(mService.mAdapterProperties).getAddress(); + verify(mAdapterProperties).getAddress(); } @Test @@ -116,7 +118,7 @@ public class AdapterServiceBinderTest { @Test public void isActivityAndEnergyReportingSupported() { mBinder.isActivityAndEnergyReportingSupported(); - verify(mService.mAdapterProperties).isActivityAndEnergyReportingSupported(); + verify(mAdapterProperties).isActivityAndEnergyReportingSupported(); } @Test diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceTest.java index 4e510e75a0..a9e01b3086 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -113,6 +113,7 @@ import java.util.Map; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; +/** Test cases for {@link AdapterService}. */ @MediumTest @RunWith(ParameterizedAndroidJunit4.class) public class AdapterServiceTest { diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterSuspendTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterSuspendTest.java index c175cfaa02..bc86ce8ee1 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterSuspendTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterSuspendTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/BondStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/BondStateMachineTest.java index 044ededd4a..f420ffb43f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/BondStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/BondStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/CompanionManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/CompanionManagerTest.java index 2b3d692035..bea6e8ea6d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/CompanionManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/CompanionManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/ConfigTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/ConfigTest.java index de1c706db2..704234cf1e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/ConfigTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/ConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java index a7a25a372e..1b057b3a7e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,6 @@ import org.mockito.Mock; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.HashMap; -import java.util.List; import java.util.Map; /** Unit tests for {@link MetricsLogger} */ diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/ProfileServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/ProfileServiceTest.java index dd7d46d661..960374ddae 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/ProfileServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/ProfileServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java index 75e3eac68e..8cbf61d8d8 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreServiceTest.java index e44682c266..0b3cc08343 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/AudioPolicyEntityTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/AudioPolicyEntityTest.java index 38dd6d6807..317153b64b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/AudioPolicyEntityTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/AudioPolicyEntityTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/DatabaseManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/DatabaseManagerTest.java index b020dbf6d8..21449beaf5 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/DatabaseManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/storage/DatabaseManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtilsTest.java b/android/app/tests/unit/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtilsTest.java index dc4e6dc5e8..e682e9af17 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtilsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/content_profiles/ContentProfileErrorReportUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/csip/BluetoothCsisBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/csip/BluetoothCsisBinderTest.java index 69e8546ac3..9233602c47 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/csip/BluetoothCsisBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/csip/BluetoothCsisBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseBinderTest.java deleted file mode 100644 index f90223cd24..0000000000 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseBinderTest.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.bluetooth.gatt; - -import static com.android.bluetooth.TestUtils.MockitoRule; - -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import android.bluetooth.BluetoothManager; -import android.bluetooth.le.AdvertiseData; -import android.bluetooth.le.AdvertisingSetParameters; -import android.bluetooth.le.IAdvertisingSetCallback; -import android.bluetooth.le.PeriodicAdvertisingParameters; -import android.content.AttributionSource; - -import androidx.test.filters.SmallTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; - -import com.android.bluetooth.btservice.AdapterService; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; - -/** Test cases for {@link AdvertiseBinder}. */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class AdvertiseBinderTest { - @Rule public final MockitoRule mMockitoRule = new MockitoRule(); - - @Mock private AdapterService mAdapterService; - @Mock private AdvertiseManager mAdvertiseManager; - - private final AttributionSource mAttributionSource = - InstrumentationRegistry.getInstrumentation() - .getTargetContext() - .getSystemService(BluetoothManager.class) - .getAdapter() - .getAttributionSource(); - private AdvertiseBinder mBinder; - - @Before - public void setUp() { - doAnswer( - invocation -> { - ((Runnable) invocation.getArgument(0)).run(); - return null; - }) - .when(mAdvertiseManager) - .doOnAdvertiseThread(any()); - mBinder = new AdvertiseBinder(mAdapterService, mAdvertiseManager); - } - - @Test - public void startAdvertisingSet() { - AdvertisingSetParameters parameters = new AdvertisingSetParameters.Builder().build(); - AdvertiseData advertiseData = new AdvertiseData.Builder().build(); - AdvertiseData scanResponse = new AdvertiseData.Builder().build(); - PeriodicAdvertisingParameters periodicParameters = - new PeriodicAdvertisingParameters.Builder().build(); - AdvertiseData periodicData = new AdvertiseData.Builder().build(); - int duration = 1; - int maxExtAdvEvents = 2; - int serverIf = 3; - IAdvertisingSetCallback callback = mock(IAdvertisingSetCallback.class); - - mBinder.startAdvertisingSet( - parameters, - advertiseData, - scanResponse, - periodicParameters, - periodicData, - duration, - maxExtAdvEvents, - serverIf, - callback, - mAttributionSource); - - verify(mAdvertiseManager) - .startAdvertisingSet( - parameters, - advertiseData, - scanResponse, - periodicParameters, - periodicData, - duration, - maxExtAdvEvents, - serverIf, - callback, - mAttributionSource); - } - - @Test - public void stopAdvertisingSet() { - IAdvertisingSetCallback callback = mock(IAdvertisingSetCallback.class); - - mBinder.stopAdvertisingSet(callback, mAttributionSource); - - verify(mAdvertiseManager).stopAdvertisingSet(callback); - } - - @Test - public void setAdvertisingData() { - int advertiserId = 1; - AdvertiseData data = new AdvertiseData.Builder().build(); - - mBinder.setAdvertisingData(advertiserId, data, mAttributionSource); - verify(mAdvertiseManager).setAdvertisingData(advertiserId, data); - } - - @Test - public void setAdvertisingParameters() { - int advertiserId = 1; - AdvertisingSetParameters parameters = new AdvertisingSetParameters.Builder().build(); - - mBinder.setAdvertisingParameters(advertiserId, parameters, mAttributionSource); - verify(mAdvertiseManager).setAdvertisingParameters(advertiserId, parameters); - } - - @Test - public void setPeriodicAdvertisingData() { - int advertiserId = 1; - AdvertiseData data = new AdvertiseData.Builder().build(); - - mBinder.setPeriodicAdvertisingData(advertiserId, data, mAttributionSource); - verify(mAdvertiseManager).setPeriodicAdvertisingData(advertiserId, data); - } - - @Test - public void setPeriodicAdvertisingEnable() { - int advertiserId = 1; - boolean enable = true; - - mBinder.setPeriodicAdvertisingEnable(advertiserId, enable, mAttributionSource); - verify(mAdvertiseManager).setPeriodicAdvertisingEnable(advertiserId, enable); - } - - @Test - public void setPeriodicAdvertisingParameters() { - int advertiserId = 1; - PeriodicAdvertisingParameters parameters = - new PeriodicAdvertisingParameters.Builder().build(); - - mBinder.setPeriodicAdvertisingParameters(advertiserId, parameters, mAttributionSource); - verify(mAdvertiseManager).setPeriodicAdvertisingParameters(advertiserId, parameters); - } - - @Test - public void setScanResponseData() { - int advertiserId = 1; - AdvertiseData data = new AdvertiseData.Builder().build(); - - mBinder.setScanResponseData(advertiserId, data, mAttributionSource); - verify(mAdvertiseManager).setScanResponseData(advertiserId, data); - } - - @Test - public void getOwnAddress() { - int advertiserId = 1; - - mBinder.getOwnAddress(advertiserId, mAttributionSource); - verify(mAdvertiseManager).getOwnAddress(advertiserId); - } - - @Test - public void enableAdvertisingSet() { - int advertiserId = 1; - boolean enable = true; - int duration = 3; - int maxExtAdvEvents = 4; - - mBinder.enableAdvertisingSet( - advertiserId, enable, duration, maxExtAdvEvents, mAttributionSource); - verify(mAdvertiseManager) - .enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents); - } - - @Test - public void cleanUp_doesNotCrash() { - mBinder.cleanup(); - } -} diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseBinderTest.kt b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseBinderTest.kt new file mode 100644 index 0000000000..6b038678f0 --- /dev/null +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseBinderTest.kt @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bluetooth.gatt + +import android.bluetooth.BluetoothManager +import android.bluetooth.le.AdvertiseData +import android.bluetooth.le.AdvertisingSetParameters +import android.bluetooth.le.IAdvertisingSetCallback +import android.bluetooth.le.PeriodicAdvertisingParameters +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry +import com.android.bluetooth.TestUtils.MockitoRule +import com.android.bluetooth.btservice.AdapterService +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.any +import org.mockito.Mockito.doAnswer +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever + +/** Test cases for [AdvertiseBinder] */ +@SmallTest +@RunWith(AndroidJUnit4::class) +class AdvertiseBinderTest { + + @get:Rule val mockitoRule = MockitoRule() + + @Mock private lateinit var adapterService: AdapterService + @Mock private lateinit var advertiseManager: AdvertiseManager + + private val attributionSource = + InstrumentationRegistry.getInstrumentation() + .targetContext + .getSystemService(BluetoothManager::class.java) + .adapter + .attributionSource + + private lateinit var binder: AdvertiseBinder + + @Before + fun setUp() { + doAnswer { invocation -> + (invocation.getArgument(0) as Runnable).run() + null + } + .whenever(advertiseManager) + .doOnAdvertiseThread(any()) + binder = AdvertiseBinder(adapterService, advertiseManager) + } + + @Test + fun startAdvertisingSet() { + val parameters = AdvertisingSetParameters.Builder().build() + val advertiseData = AdvertiseData.Builder().build() + val scanResponse = AdvertiseData.Builder().build() + val periodicParameters = PeriodicAdvertisingParameters.Builder().build() + val periodicData = AdvertiseData.Builder().build() + val duration = 1 + val maxExtAdvEvents = 2 + val serverIf = 3 + val callback = mock(IAdvertisingSetCallback::class.java) + + binder.startAdvertisingSet( + parameters, + advertiseData, + scanResponse, + periodicParameters, + periodicData, + duration, + maxExtAdvEvents, + serverIf, + callback, + attributionSource, + ) + verify(advertiseManager) + .startAdvertisingSet( + parameters, + advertiseData, + scanResponse, + periodicParameters, + periodicData, + duration, + maxExtAdvEvents, + serverIf, + callback, + attributionSource, + ) + } + + @Test + fun stopAdvertisingSet() { + val callback = mock(IAdvertisingSetCallback::class.java) + + binder.stopAdvertisingSet(callback, attributionSource) + verify(advertiseManager).stopAdvertisingSet(callback) + } + + @Test + fun setAdvertisingData() { + val advertiserId = 1 + val data = AdvertiseData.Builder().build() + + binder.setAdvertisingData(advertiserId, data, attributionSource) + verify(advertiseManager).setAdvertisingData(advertiserId, data) + } + + @Test + fun setAdvertisingParameters() { + val advertiserId = 1 + val parameters = AdvertisingSetParameters.Builder().build() + + binder.setAdvertisingParameters(advertiserId, parameters, attributionSource) + verify(advertiseManager).setAdvertisingParameters(advertiserId, parameters) + } + + @Test + fun setPeriodicAdvertisingData() { + val advertiserId = 1 + val data = AdvertiseData.Builder().build() + + binder.setPeriodicAdvertisingData(advertiserId, data, attributionSource) + verify(advertiseManager).setPeriodicAdvertisingData(advertiserId, data) + } + + @Test + fun setPeriodicAdvertisingEnable() { + val advertiserId = 1 + val enable = true + + binder.setPeriodicAdvertisingEnable(advertiserId, enable, attributionSource) + verify(advertiseManager).setPeriodicAdvertisingEnable(advertiserId, enable) + } + + @Test + fun setPeriodicAdvertisingParameters() { + val advertiserId = 1 + val parameters = PeriodicAdvertisingParameters.Builder().build() + + binder.setPeriodicAdvertisingParameters(advertiserId, parameters, attributionSource) + verify(advertiseManager).setPeriodicAdvertisingParameters(advertiserId, parameters) + } + + @Test + fun setScanResponseData() { + val advertiserId = 1 + val data = AdvertiseData.Builder().build() + + binder.setScanResponseData(advertiserId, data, attributionSource) + verify(advertiseManager).setScanResponseData(advertiserId, data) + } + + @Test + fun getOwnAddress() { + val advertiserId = 1 + + binder.getOwnAddress(advertiserId, attributionSource) + verify(advertiseManager).getOwnAddress(advertiserId) + } + + @Test + fun enableAdvertisingSet() { + val advertiserId = 1 + val enable = true + val duration = 3 + val maxExtAdvEvents = 4 + + binder.enableAdvertisingSet( + advertiserId, + enable, + duration, + maxExtAdvEvents, + attributionSource, + ) + verify(advertiseManager) + .enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents) + } + + @Test + fun cleanup_doesNotCrash() { + binder.cleanup() + } +} diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseHelperTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseHelperTest.java index bf05afed39..6b461556fe 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseHelperTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseHelperTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseManagerTest.java index 8537795af5..5aab3db081 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiserMapTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiserMapTest.java index df0d609e89..35d222f739 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiserMapTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiserMapTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/AppAdvertiseStatsTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/AppAdvertiseStatsTest.java index 42934127d5..e2bcfb75e2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/AppAdvertiseStatsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/AppAdvertiseStatsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -305,7 +305,6 @@ public class AppAdvertiseStatsTest { } @Test - @EnableFlags(Flags.FLAG_BLE_SCAN_ADV_METRICS_REDESIGN) public void testAdvertiseCounterMetrics() { int appUid = 0; int id = 1; @@ -356,7 +355,8 @@ public class AppAdvertiseStatsTest { true, instanceCount, 0, - IMPORTANCE_FOREGROUND_SERVICE); + IMPORTANCE_FOREGROUND_SERVICE, + ""); Mockito.clearInvocations(mMetricsLogger); // Wait for adv test duration @@ -390,7 +390,8 @@ public class AppAdvertiseStatsTest { eq(true), eq(instanceCount), mAdvDurationCaptor.capture(), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); long capturedAppScanDuration = mAdvDurationCaptor.getValue(); Log.d(TAG, "capturedDuration: " + capturedAppScanDuration); assertThat(capturedAppScanDuration).isAtLeast(advTestDuration); diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/ContextMapTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/ContextMapTest.java index dac06a7086..6df604077d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/ContextMapTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/ContextMapTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/DistanceMeasurementBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/DistanceMeasurementBinderTest.java deleted file mode 100644 index 9db59f4fb1..0000000000 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/DistanceMeasurementBinderTest.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.bluetooth.gatt; - -import static com.android.bluetooth.TestUtils.MockitoRule; -import static com.android.bluetooth.TestUtils.getTestDevice; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothManager; -import android.bluetooth.le.DistanceMeasurementMethod; -import android.bluetooth.le.DistanceMeasurementParams; -import android.bluetooth.le.IDistanceMeasurementCallback; -import android.content.AttributionSource; -import android.os.ParcelUuid; - -import androidx.test.filters.SmallTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; - -import com.android.bluetooth.btservice.AdapterService; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; - -import java.util.Collections; -import java.util.UUID; - -/** Test cases for {@link DistanceMeasurementBinder}. */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class DistanceMeasurementBinderTest { - @Rule public final MockitoRule mMockitoRule = new MockitoRule(); - - @Mock private DistanceMeasurementManager mDistanceMeasurementManager; - @Mock private AdapterService mAdapterService; - - private final AttributionSource mAttributionSource = - InstrumentationRegistry.getInstrumentation() - .getTargetContext() - .getSystemService(BluetoothManager.class) - .getAdapter() - .getAttributionSource(); - - private DistanceMeasurementBinder mBinder; - - @Before - public void setUp() throws Throwable { - mBinder = new DistanceMeasurementBinder(mAdapterService, mDistanceMeasurementManager); - when(mDistanceMeasurementManager.getSupportedDistanceMeasurementMethods()) - .thenReturn(Collections.emptyList()); - when(mDistanceMeasurementManager.runOnDistanceMeasurementThreadAndWaitForResult(any())) - .thenAnswer( - invocationOnMock -> { - DistanceMeasurementManager.GetResultTask task = - invocationOnMock.getArgument(0); - return task.getResult(); - }); - doAnswer( - invocation -> { - ((Runnable) (invocation.getArgument(0))).run(); - return null; - }) - .when(mDistanceMeasurementManager) - .postOnDistanceMeasurementThread(any()); - } - - @Test - public void getSupportedDistanceMeasurementMethods() { - mBinder.getSupportedDistanceMeasurementMethods(mAttributionSource); - verify(mDistanceMeasurementManager).getSupportedDistanceMeasurementMethods(); - } - - @Test - public void startDistanceMeasurement() { - UUID uuid = UUID.randomUUID(); - BluetoothDevice device = getTestDevice(3); - DistanceMeasurementParams params = - new DistanceMeasurementParams.Builder(device) - .setDurationSeconds(123) - .setFrequency(DistanceMeasurementParams.REPORT_FREQUENCY_LOW) - .build(); - IDistanceMeasurementCallback callback = mock(IDistanceMeasurementCallback.class); - mBinder.startDistanceMeasurement( - new ParcelUuid(uuid), params, callback, mAttributionSource); - verify(mDistanceMeasurementManager).startDistanceMeasurement(uuid, params, callback); - } - - @Test - public void stopDistanceMeasurement() { - UUID uuid = UUID.randomUUID(); - BluetoothDevice device = getTestDevice(3); - int method = DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_RSSI; - mBinder.stopDistanceMeasurement(new ParcelUuid(uuid), device, method, mAttributionSource); - verify(mDistanceMeasurementManager).stopDistanceMeasurement(uuid, device, method, false); - } -} diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/DistanceMeasurementBinderTest.kt b/android/app/tests/unit/src/com/android/bluetooth/gatt/DistanceMeasurementBinderTest.kt new file mode 100644 index 0000000000..b20eda9a17 --- /dev/null +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/DistanceMeasurementBinderTest.kt @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bluetooth.gatt + +import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothManager +import android.bluetooth.le.DistanceMeasurementMethod +import android.bluetooth.le.DistanceMeasurementParams +import android.bluetooth.le.IDistanceMeasurementCallback +import android.os.ParcelUuid +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry +import com.android.bluetooth.TestUtils.MockitoRule +import com.android.bluetooth.TestUtils.getTestDevice +import com.android.bluetooth.btservice.AdapterService +import com.android.bluetooth.gatt.DistanceMeasurementManager.GetResultTask +import java.util.UUID +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.any +import org.mockito.Mockito.doAnswer +import org.mockito.Mockito.doReturn +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever + +/** Test cases for [DistanceMeasurementBinder] */ +@SmallTest +@RunWith(AndroidJUnit4::class) +class DistanceMeasurementBinderTest { + + @get:Rule val mockitoRule = MockitoRule() + + @Mock private lateinit var distanceMeasurementManager: DistanceMeasurementManager + @Mock private lateinit var adapterService: AdapterService + + private val attributionSource = + InstrumentationRegistry.getInstrumentation() + .targetContext + .getSystemService(BluetoothManager::class.java) + .adapter + .attributionSource + + private lateinit var binder: DistanceMeasurementBinder + + @Before + fun setUp() { + binder = DistanceMeasurementBinder(adapterService, distanceMeasurementManager) + doReturn(emptyList<DistanceMeasurementMethod>()) + .whenever(distanceMeasurementManager) + .getSupportedDistanceMeasurementMethods() + doAnswer { invocationOnMock -> + val task = invocationOnMock.getArgument<GetResultTask<*>>(0) + task.result + } + .whenever(distanceMeasurementManager) + .runOnDistanceMeasurementThreadAndWaitForResult(any<GetResultTask<*>>()) + doAnswer { invocation -> + (invocation.getArgument(0) as Runnable).run() + null + } + .whenever(distanceMeasurementManager) + .postOnDistanceMeasurementThread(any()) + } + + @Test + fun getSupportedDistanceMeasurementMethods() { + binder.getSupportedDistanceMeasurementMethods(attributionSource) + verify(distanceMeasurementManager).supportedDistanceMeasurementMethods + } + + @Test + fun startDistanceMeasurement() { + val uuid = UUID.randomUUID() + val device: BluetoothDevice = getTestDevice(3) + val params = + DistanceMeasurementParams.Builder(device) + .setDurationSeconds(123) + .setFrequency(DistanceMeasurementParams.REPORT_FREQUENCY_LOW) + .build() + val callback = mock(IDistanceMeasurementCallback::class.java) + binder.startDistanceMeasurement(ParcelUuid(uuid), params, callback, attributionSource) + verify(distanceMeasurementManager).startDistanceMeasurement(uuid, params, callback) + } + + @Test + fun stopDistanceMeasurement() { + val uuid = UUID.randomUUID() + val device: BluetoothDevice = getTestDevice(3) + val method = DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_RSSI + binder.stopDistanceMeasurement(ParcelUuid(uuid), device, method, attributionSource) + verify(distanceMeasurementManager).stopDistanceMeasurement(uuid, device, method, false) + } +} diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/GattDebugUtilsTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/GattDebugUtilsTest.java index 4237759122..8b4760c42f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/GattDebugUtilsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/GattDebugUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceBinderTest.java index a246d76b8f..1a340840bc 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,13 +53,12 @@ public class GattServiceBinderTest { @Mock private GattService mService; private AttributionSource mAttributionSource; - - private GattService.BluetoothGattBinder mBinder; + private GattServiceBinder mBinder; @Before public void setUp() throws Exception { when(mService.isAvailable()).thenReturn(true); - mBinder = new GattService.BluetoothGattBinder(mService); + mBinder = new GattServiceBinder(mService); mAttributionSource = new AttributionSource.Builder(1).build(); } @@ -68,7 +67,6 @@ public class GattServiceBinderTest { int[] states = new int[] {STATE_CONNECTED}; mBinder.getDevicesMatchingConnectionStates(states, mAttributionSource); - verify(mService).getDevicesMatchingConnectionStates(states, mAttributionSource); } @@ -79,7 +77,6 @@ public class GattServiceBinderTest { boolean eattSupport = true; mBinder.registerClient(new ParcelUuid(uuid), callback, eattSupport, mAttributionSource); - verify(mService).registerClient(uuid, callback, eattSupport, mAttributionSource); } @@ -88,7 +85,6 @@ public class GattServiceBinderTest { int clientIf = 3; mBinder.unregisterClient(clientIf, mAttributionSource); - verify(mService) .unregisterClient( clientIf, @@ -115,7 +111,6 @@ public class GattServiceBinderTest { opportunistic, phy, mAttributionSource); - verify(mService) .clientConnect( clientIf, @@ -134,7 +129,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.clientDisconnect(clientIf, address, mAttributionSource); - verify(mService).clientDisconnect(clientIf, address, mAttributionSource); } @@ -148,7 +142,6 @@ public class GattServiceBinderTest { mBinder.clientSetPreferredPhy( clientIf, address, txPhy, rxPhy, phyOptions, mAttributionSource); - verify(mService) .clientSetPreferredPhy( clientIf, address, txPhy, rxPhy, phyOptions, mAttributionSource); @@ -160,7 +153,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.clientReadPhy(clientIf, address, mAttributionSource); - verify(mService).clientReadPhy(clientIf, address, mAttributionSource); } @@ -170,7 +162,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.refreshDevice(clientIf, address, mAttributionSource); - verify(mService).refreshDevice(clientIf, address, mAttributionSource); } @@ -180,7 +171,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.discoverServices(clientIf, address, mAttributionSource); - verify(mService).discoverServices(clientIf, address, mAttributionSource); } @@ -191,7 +181,6 @@ public class GattServiceBinderTest { UUID uuid = UUID.randomUUID(); mBinder.discoverServiceByUuid(clientIf, address, new ParcelUuid(uuid), mAttributionSource); - verify(mService).discoverServiceByUuid(clientIf, address, uuid, mAttributionSource); } @@ -203,7 +192,6 @@ public class GattServiceBinderTest { int authReq = 3; mBinder.readCharacteristic(clientIf, address, handle, authReq, mAttributionSource); - verify(mService).readCharacteristic(clientIf, address, handle, authReq, mAttributionSource); } @@ -224,7 +212,6 @@ public class GattServiceBinderTest { endHandle, authReq, mAttributionSource); - verify(mService) .readUsingCharacteristicUuid( clientIf, @@ -247,7 +234,6 @@ public class GattServiceBinderTest { mBinder.writeCharacteristic( clientIf, address, handle, writeType, authReq, value, mAttributionSource); - verify(mService) .writeCharacteristic( clientIf, address, handle, writeType, authReq, value, mAttributionSource); @@ -261,7 +247,6 @@ public class GattServiceBinderTest { int authReq = 3; mBinder.readDescriptor(clientIf, address, handle, authReq, mAttributionSource); - verify(mService).readDescriptor(clientIf, address, handle, authReq, mAttributionSource); } @@ -274,7 +259,6 @@ public class GattServiceBinderTest { byte[] value = new byte[] {4, 5}; mBinder.writeDescriptor(clientIf, address, handle, authReq, value, mAttributionSource); - verify(mService) .writeDescriptor(clientIf, address, handle, authReq, value, mAttributionSource); } @@ -285,7 +269,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.beginReliableWrite(clientIf, address, mAttributionSource); - verify(mService).beginReliableWrite(clientIf, address, mAttributionSource); } @@ -296,7 +279,6 @@ public class GattServiceBinderTest { boolean execute = true; mBinder.endReliableWrite(clientIf, address, execute, mAttributionSource); - verify(mService).endReliableWrite(clientIf, address, execute, mAttributionSource); } @@ -308,7 +290,6 @@ public class GattServiceBinderTest { boolean enable = true; mBinder.registerForNotification(clientIf, address, handle, enable, mAttributionSource); - verify(mService) .registerForNotification(clientIf, address, handle, enable, mAttributionSource); } @@ -319,7 +300,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.readRemoteRssi(clientIf, address, mAttributionSource); - verify(mService).readRemoteRssi(clientIf, address, mAttributionSource); } @@ -330,7 +310,6 @@ public class GattServiceBinderTest { int mtu = 2; mBinder.configureMTU(clientIf, address, mtu, mAttributionSource); - verify(mService).configureMTU(clientIf, address, mtu, mAttributionSource); } @@ -342,7 +321,6 @@ public class GattServiceBinderTest { mBinder.connectionParameterUpdate( clientIf, address, connectionPriority, mAttributionSource); - verify(mService) .connectionParameterUpdate( clientIf, address, connectionPriority, mAttributionSource); @@ -369,7 +347,6 @@ public class GattServiceBinderTest { minConnectionEventLen, maxConnectionEventLen, mAttributionSource); - verify(mService) .leConnectionUpdate( clientIf, @@ -390,7 +367,6 @@ public class GattServiceBinderTest { boolean eattSupport = true; mBinder.registerServer(new ParcelUuid(uuid), callback, eattSupport, mAttributionSource); - verify(mService).registerServer(uuid, callback, eattSupport, mAttributionSource); } @@ -399,7 +375,6 @@ public class GattServiceBinderTest { int serverIf = 3; mBinder.unregisterServer(serverIf, mAttributionSource); - verify(mService).unregisterServer(serverIf, mAttributionSource); } @@ -413,7 +388,6 @@ public class GattServiceBinderTest { mBinder.serverConnect( serverIf, address, addressType, isDirect, transport, mAttributionSource); - verify(mService) .serverConnect( serverIf, address, addressType, isDirect, transport, mAttributionSource); @@ -425,7 +399,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.serverDisconnect(serverIf, address, mAttributionSource); - verify(mService).serverDisconnect(serverIf, address, mAttributionSource); } @@ -439,7 +412,6 @@ public class GattServiceBinderTest { mBinder.serverSetPreferredPhy( serverIf, address, txPhy, rxPhy, phyOptions, mAttributionSource); - verify(mService) .serverSetPreferredPhy( serverIf, address, txPhy, rxPhy, phyOptions, mAttributionSource); @@ -451,7 +423,6 @@ public class GattServiceBinderTest { String address = REMOTE_DEVICE_ADDRESS; mBinder.serverReadPhy(serverIf, address, mAttributionSource); - verify(mService).serverReadPhy(serverIf, address, mAttributionSource); } @@ -461,7 +432,6 @@ public class GattServiceBinderTest { BluetoothGattService svc = mock(BluetoothGattService.class); mBinder.addService(serverIf, svc, mAttributionSource); - verify(mService).addService(serverIf, svc, mAttributionSource); } @@ -471,7 +441,6 @@ public class GattServiceBinderTest { int handle = 2; mBinder.removeService(serverIf, handle, mAttributionSource); - verify(mService).removeService(serverIf, handle, mAttributionSource); } @@ -480,7 +449,6 @@ public class GattServiceBinderTest { int serverIf = 1; mBinder.clearServices(serverIf, mAttributionSource); - verify(mService).clearServices(serverIf, mAttributionSource); } @@ -495,7 +463,6 @@ public class GattServiceBinderTest { mBinder.sendResponse( serverIf, address, requestId, status, offset, value, mAttributionSource); - verify(mService) .sendResponse( serverIf, address, requestId, status, offset, value, mAttributionSource); @@ -510,7 +477,6 @@ public class GattServiceBinderTest { byte[] value = new byte[] {5, 6}; mBinder.sendNotification(serverIf, address, handle, confirm, value, mAttributionSource); - verify(mService) .sendNotification(serverIf, address, handle, confirm, value, mAttributionSource); } @@ -518,12 +484,11 @@ public class GattServiceBinderTest { @Test public void disconnectAll() throws Exception { mBinder.disconnectAll(mAttributionSource); - verify(mService).disconnectAll(mAttributionSource); } @Test - public void cleanUp_doesNotCrash() { + public void cleanup_doesNotCrash() { mBinder.cleanup(); } } diff --git a/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceTest.java index f52702a24b..76d6dd53ff 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/gatt/GattServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientBinderTest.java index 7f079c79b7..dd5ede57b2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientNativeCallbackTest.java b/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientNativeCallbackTest.java index a67995ffae..5e1218b202 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientNativeCallbackTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientNativeCallbackTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientStackEventTest.java b/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientStackEventTest.java index 249914b644..01a12b7a9b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientStackEventTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hap/HapClientStackEventTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidNativeInterfaceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidNativeInterfaceTest.java index ac7c90a213..6b32743a7b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidNativeInterfaceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidNativeInterfaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidServiceTest.java index 69bcca1087..757a6488be 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidStateMachineTest.java index 20feec9b8a..07cd5703ff 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/AtPhonebookTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/AtPhonebookTest.java index 123b34c178..b54da60e79 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/AtPhonebookTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/AtPhonebookTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/BluetoothHeadsetBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/BluetoothHeadsetBinderTest.java index 398ba1c6cd..d125fbee4c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/BluetoothHeadsetBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/BluetoothHeadsetBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableStateTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableStateTest.java index f034bf44cf..8fa050b679 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableStateTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetAgIndicatorEnableStateTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetClccResponseTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetClccResponseTest.java index 3f6603ff3a..63e0f2632d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetClccResponseTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetClccResponseTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetPhoneStateTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetPhoneStateTest.java index cdd59bfce3..edcf484239 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetPhoneStateTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetPhoneStateTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java index d4b2b39825..835f03aaa2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -172,7 +172,9 @@ public class HeadsetServiceAndStateMachineTest { doReturn(true).when(mNativeInterface).disconnectAudio(any(BluetoothDevice.class)); doReturn(true).when(mNativeInterface).setActiveDevice(any(BluetoothDevice.class)); doReturn(true).when(mNativeInterface).sendBsir(any(BluetoothDevice.class), anyBoolean()); - doReturn(true).when(mNativeInterface).startVoiceRecognition(any(BluetoothDevice.class)); + doReturn(true) + .when(mNativeInterface) + .startVoiceRecognition(any(BluetoothDevice.class), anyBoolean()); doReturn(true).when(mNativeInterface).stopVoiceRecognition(any(BluetoothDevice.class)); doReturn(true) .when(mNativeInterface) @@ -1138,7 +1140,7 @@ public class HeadsetServiceAndStateMachineTest { mTestLooper.dispatchAll(); verify(mNativeInterface).setActiveDevice(deviceA); assertThat(mHeadsetService.getActiveDevice()).isEqualTo(deviceA); - verify(mNativeInterface).startVoiceRecognition(deviceA); + verify(mNativeInterface).startVoiceRecognition(deviceA, true); verify(mAudioManager).setA2dpSuspended(true); verify(mAudioManager).setLeAudioSuspended(true); verify(mNativeInterface).connectAudio(deviceA); @@ -1685,6 +1687,7 @@ public class HeadsetServiceAndStateMachineTest { // has not add verification AudioDeviceInfo because it is final, unless add a wrapper mHeadsetService.startVoiceRecognition(device); mTestLooper.dispatchAll(); + verify(mNativeInterface).startVoiceRecognition(device, false); verify(mAudioManager, times(0)).setA2dpSuspended(true); verify(mAudioManager, times(0)).setLeAudioSuspended(true); verify(mNativeInterface, times(0)).connectAudio(device); @@ -1695,7 +1698,7 @@ public class HeadsetServiceAndStateMachineTest { assertThat(device).isNotNull(); assertThat(mHeadsetService.startVoiceRecognition(device)).isTrue(); mTestLooper.dispatchAll(); - verify(mNativeInterface).startVoiceRecognition(device); + verify(mNativeInterface).startVoiceRecognition(device, true); verify(mAudioManager).setA2dpSuspended(true); verify(mAudioManager).setLeAudioSuspended(true); verify(mNativeInterface).connectAudio(device); @@ -1727,7 +1730,7 @@ public class HeadsetServiceAndStateMachineTest { mHeadsetService.startVoiceRecognition(device); mTestLooper.dispatchAll(); // has not add verification AudioDeviceInfo because it is final, unless add a wrapper - verify(mNativeInterface).startVoiceRecognition(device); + verify(mNativeInterface).startVoiceRecognition(device, true); verify(mAudioManager, times(0)).setA2dpSuspended(true); verify(mAudioManager, times(0)).setLeAudioSuspended(true); verify(mNativeInterface, times(0)).connectAudio(device); diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java index 18a53db436..b16578c823 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStackEventTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStackEventTest.java index bf90084521..d5f66da856 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStackEventTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStackEventTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java index c824c3be86..68c17a10f8 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetTestUtils.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetTestUtils.java index 4b2d0b291c..b504414050 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetTestUtils.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetTestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCodeTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCodeTest.java index 7b2b72923e..cfb1dea03c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCodeTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetVendorSpecificResultCodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceBinderTest.java index e96fc3a9a6..b3171bc191 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceTest.java index d4cb896827..a8a81b0440 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java index e3f54ca620..7e47efeb4a 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HfpNativeInterfaceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HfpNativeInterfaceTest.java index d47e70da86..bd480693e8 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HfpNativeInterfaceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HfpNativeInterfaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/StackEventTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/StackEventTest.java index 7aaba84f59..cb397e29ec 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/StackEventTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/StackEventTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessorTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessorTest.java index 17af0e42bc..0c9522b05b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessorTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hid/BluetoothHidDeviceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/hid/BluetoothHidDeviceBinderTest.java index 4b11bc7b2a..8a03fe7186 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hid/BluetoothHidDeviceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hid/BluetoothHidDeviceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceNativeInterfaceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceNativeInterfaceTest.java index 787eaacb86..d393b8dc65 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceNativeInterfaceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceNativeInterfaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceTest.java index de64564c77..5ddb36e4c6 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hid/HidDeviceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceBinderTest.java index 946d9a7c93..02bee889e8 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceTest.java index 341cd54333..a41f93d5d6 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hid/HidHostServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBinderTest.java index e0093fc003..15b3563df1 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcasterNativeInterfaceTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcasterNativeInterfaceTest.java index d74b6caf53..f9c57e1494 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcasterNativeInterfaceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcasterNativeInterfaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioNativeInterfaceTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioNativeInterfaceTest.java index 03d85dfc4d..369304c608 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioNativeInterfaceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioNativeInterfaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java index f0f2037358..cf836ddc3c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java @@ -76,12 +76,12 @@ import android.os.ParcelUuid; import android.os.RemoteException; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.FlagsParameterization; import android.platform.test.flag.junit.SetFlagsRule; import android.sysprop.BluetoothProperties; import androidx.test.filters.MediumTest; import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; import com.android.bluetooth.TestUtils; import com.android.bluetooth.bass_client.BassClientService; @@ -113,15 +113,20 @@ import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.hamcrest.MockitoHamcrest; +import platform.test.runner.parameterized.ParameterizedAndroidJunit4; +import platform.test.runner.parameterized.Parameters; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; @MediumTest -@RunWith(AndroidJUnit4.class) +@RunWith(ParameterizedAndroidJunit4.class) public class LeAudioServiceTest { - @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + @Rule public final SetFlagsRule mSetFlagsRule; @Rule public final MockitoRule mMockitoRule = new MockitoRule(); @Mock private AdapterService mAdapterService; @@ -201,6 +206,20 @@ public class LeAudioServiceTest { private InOrder mInOrder; + @Parameters(name = "{0}") + public static List<FlagsParameterization> getParams() { + return FlagsParameterization.progressionOf( + Flags.FLAG_LEAUDIO_BROADCAST_PRIMARY_GROUP_SELECTION, + Flags.FLAG_LEAUDIO_CODEC_CONFIG_CALLBACK_ORDER_FIX, + Flags.FLAG_LEAUDIO_UNICAST_NO_AVAILABLE_CONTEXTS, + Flags.FLAG_LEAUDIO_BROADCAST_API_MANAGE_PRIMARY_GROUP, + Flags.FLAG_DO_NOT_HARDCODE_TMAP_ROLE_MASK); + } + + public LeAudioServiceTest(FlagsParameterization flags) { + mSetFlagsRule = new SetFlagsRule(flags); + } + @Before public void setUp() throws Exception { mInOrder = inOrder(mAdapterService); @@ -211,11 +230,9 @@ public class LeAudioServiceTest { doReturn(mTargetContext.getContentResolver()).when(mAdapterService).getContentResolver(); doReturn(MAX_LE_AUDIO_CONNECTIONS).when(mAdapterService).getMaxConnectedAudioDevices(); - doReturn( - (long) (1 << BluetoothProfile.LE_AUDIO_BROADCAST) - | (1 << BluetoothProfile.LE_AUDIO)) - .when(mAdapterService) - .getSupportedProfilesBitMask(); + injectSupportedProfilesBitMask( + Set.of(BluetoothProfile.LE_AUDIO_BROADCAST, BluetoothProfile.LE_AUDIO)); + doReturn(new ParcelUuid[] {BluetoothUuid.LE_AUDIO}) .when(mAdapterService) .getRemoteUuids(any(BluetoothDevice.class)); @@ -280,6 +297,43 @@ public class LeAudioServiceTest { assertThat(LeAudioService.getLeAudioService()).isNull(); } + @Test + @EnableFlags(Flags.FLAG_DO_NOT_HARDCODE_TMAP_ROLE_MASK) + public void testTmapRoleMask() { + List<Set<Integer>> powerSet = + List.of( + Set.of(BluetoothProfile.LE_CALL_CONTROL), + Set.of(BluetoothProfile.MCP_SERVER), + Set.of(BluetoothProfile.LE_CALL_CONTROL, BluetoothProfile.MCP_SERVER), + Set.of(BluetoothProfile.LE_AUDIO_BROADCAST), + Set.of( + BluetoothProfile.LE_AUDIO_BROADCAST, + BluetoothProfile.LE_CALL_CONTROL), + Set.of(BluetoothProfile.LE_AUDIO_BROADCAST, BluetoothProfile.MCP_SERVER), + Set.of( + BluetoothProfile.LE_AUDIO_BROADCAST, + BluetoothProfile.LE_CALL_CONTROL, + BluetoothProfile.MCP_SERVER)); + + List<Integer> tmapMasks = + powerSet.stream() + .map( + set -> { + injectSupportedProfilesBitMask(set); + LeAudioService service = + new LeAudioService(mAdapterService, mNativeInterface); + return service.getTmapRoleMask(); + }) + .collect(Collectors.toList()); + + List<Integer> expectedMasks = + powerSet.stream() + .map(LeAudioServiceTest::constructTmapRoleMask) + .collect(Collectors.toList()); + + assertThat(tmapMasks).containsExactly(expectedMasks.toArray()).inOrder(); + } + /** Test getting LeAudio Service: getLeAudioService() */ @Test public void testGetLeAudioService() { @@ -1788,8 +1842,8 @@ public class LeAudioServiceTest { /** Test native interface group status message handling */ @Test + @EnableFlags(Flags.FLAG_LEAUDIO_CODEC_CONFIG_CALLBACK_ORDER_FIX) public void testMessageFromNativeGroupCodecConfigChangedNonActiveDevice() { - mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_CODEC_CONFIG_CALLBACK_ORDER_FIX); onGroupCodecConfChangedCallbackCalled = false; injectLocalCodecConfigCapaChanged(INPUT_CAPABILITIES_CONFIG, OUTPUT_CAPABILITIES_CONFIG); @@ -1874,8 +1928,8 @@ public class LeAudioServiceTest { /** Test native interface group status message handling */ @Test + @EnableFlags(Flags.FLAG_LEAUDIO_CODEC_CONFIG_CALLBACK_ORDER_FIX) public void testMessageFromNativeGroupCodecConfigChangedActiveDevice_DifferentConfiguration() { - mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_CODEC_CONFIG_CALLBACK_ORDER_FIX); onGroupCodecConfChangedCallbackCalled = false; injectLocalCodecConfigCapaChanged(INPUT_CAPABILITIES_CONFIG, OUTPUT_CAPABILITIES_CONFIG); @@ -3216,4 +3270,30 @@ public class LeAudioServiceTest { .sendBroadcastAsUser( MockitoHamcrest.argThat(AllOf.allOf(matchers)), any(), any(), any()); } + + private void injectSupportedProfilesBitMask(Set<Integer> profiles) { + long mask = 0; + for (int profile : profiles) { + mask |= (long) (1 << profile); + } + doReturn(mask).when(mAdapterService).getSupportedProfilesBitMask(); + } + + private static int constructTmapRoleMask(Set<Integer> profiles) { + int mask = 0; + for (int profile : profiles) { + switch (profile) { + case BluetoothProfile.LE_CALL_CONTROL: + mask |= LeAudioTmapGattServer.TMAP_ROLE_FLAG_CG; + break; + case BluetoothProfile.MCP_SERVER: + mask |= LeAudioTmapGattServer.TMAP_ROLE_FLAG_UMS; + break; + case BluetoothProfile.LE_AUDIO_BROADCAST: + mask |= LeAudioTmapGattServer.TMAP_ROLE_FLAG_BMS; + break; + } + } + return mask; + } } diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/AdvtFilterOnFoundOnLostInfoTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_scan/AdvtFilterOnFoundOnLostInfoTest.java index aec90ecf29..80e050d866 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_scan/AdvtFilterOnFoundOnLostInfoTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_scan/AdvtFilterOnFoundOnLostInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/AppScanStatsTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_scan/AppScanStatsTest.java index dc823ca412..9a37679916 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_scan/AppScanStatsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_scan/AppScanStatsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanBinderTest.java deleted file mode 100644 index 7687fb381d..0000000000 --- a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanBinderTest.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (C) 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.bluetooth.le_scan; - -import static com.android.bluetooth.TestUtils.MockitoRule; -import static com.android.bluetooth.TestUtils.getTestDevice; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.PendingIntent; -import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothManager; -import android.bluetooth.le.IPeriodicAdvertisingCallback; -import android.bluetooth.le.IScannerCallback; -import android.bluetooth.le.ScanFilter; -import android.bluetooth.le.ScanResult; -import android.bluetooth.le.ScanSettings; -import android.content.AttributionSource; -import android.content.Intent; -import android.os.WorkSource; - -import androidx.test.filters.SmallTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; - -import java.util.ArrayList; -import java.util.List; - -/** Test cases for {@link ScanBinder}. */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class ScanBinderTest { - @Rule public final MockitoRule mMockitoRule = new MockitoRule(); - - @Mock private ScanController mScanController; - - private final AttributionSource mAttributionSource = - InstrumentationRegistry.getInstrumentation() - .getTargetContext() - .getSystemService(BluetoothManager.class) - .getAdapter() - .getAttributionSource(); - private final BluetoothDevice mDevice = getTestDevice(89); - private ScanBinder mBinder; - - @Before - public void setUp() { - when(mScanController.isAvailable()).thenReturn(true); - mBinder = new ScanBinder(mScanController); - } - - @Test - public void registerScanner() { - IScannerCallback callback = mock(IScannerCallback.class); - WorkSource workSource = mock(WorkSource.class); - - mBinder.registerScanner(callback, workSource, mAttributionSource); - verify(mScanController).registerScanner(callback, workSource, mAttributionSource); - } - - @Test - public void unregisterScanner() { - int scannerId = 1; - - mBinder.unregisterScanner(scannerId, mAttributionSource); - verify(mScanController).unregisterScanner(scannerId, mAttributionSource); - } - - @Test - public void startScan() { - int scannerId = 1; - ScanSettings settings = new ScanSettings.Builder().build(); - List<ScanFilter> filters = new ArrayList<>(); - - mBinder.startScan(scannerId, settings, filters, mAttributionSource); - verify(mScanController).startScan(scannerId, settings, filters, mAttributionSource); - } - - @Test - public void startScanForIntent() { - PendingIntent intent = - PendingIntent.getBroadcast( - InstrumentationRegistry.getInstrumentation().getTargetContext(), - 0, - new Intent(), - PendingIntent.FLAG_IMMUTABLE); - ScanSettings settings = new ScanSettings.Builder().build(); - List<ScanFilter> filters = new ArrayList<>(); - - mBinder.startScanForIntent(intent, settings, filters, mAttributionSource); - verify(mScanController) - .registerPiAndStartScan(intent, settings, filters, mAttributionSource); - } - - @Test - public void stopScan_withScannerId() { - int scannerId = 1; - - mBinder.stopScan(scannerId, mAttributionSource); - verify(mScanController).stopScan(scannerId, mAttributionSource); - } - - @Test - public void stopScan_withIntent() { - PendingIntent intent = - PendingIntent.getBroadcast( - InstrumentationRegistry.getInstrumentation().getTargetContext(), - 0, - new Intent(), - PendingIntent.FLAG_IMMUTABLE); - - mBinder.stopScanForIntent(intent, mAttributionSource); - verify(mScanController).stopScan(intent, mAttributionSource); - } - - @Test - public void flushPendingBatchResults() { - int scannerId = 1; - - mBinder.flushPendingBatchResults(scannerId, mAttributionSource); - verify(mScanController).flushPendingBatchResults(scannerId, mAttributionSource); - } - - @Test - public void registerSync() { - ScanResult scanResult = new ScanResult(mDevice, null, 0, 0); - int skip = 1; - int timeout = 2; - IPeriodicAdvertisingCallback callback = mock(IPeriodicAdvertisingCallback.class); - - mBinder.registerSync(scanResult, skip, timeout, callback, mAttributionSource); - verify(mScanController) - .registerSync(scanResult, skip, timeout, callback, mAttributionSource); - } - - @Test - public void unregisterSync() { - IPeriodicAdvertisingCallback callback = mock(IPeriodicAdvertisingCallback.class); - - mBinder.unregisterSync(callback, mAttributionSource); - verify(mScanController).unregisterSync(callback, mAttributionSource); - } - - @Test - public void transferSync() { - int serviceData = 1; - int syncHandle = 2; - - mBinder.transferSync(mDevice, serviceData, syncHandle, mAttributionSource); - verify(mScanController).transferSync(mDevice, serviceData, syncHandle, mAttributionSource); - } - - @Test - public void transferSetInfo() { - int serviceData = 1; - int advHandle = 2; - IPeriodicAdvertisingCallback callback = mock(IPeriodicAdvertisingCallback.class); - - mBinder.transferSetInfo(mDevice, serviceData, advHandle, callback, mAttributionSource); - verify(mScanController) - .transferSetInfo(mDevice, serviceData, advHandle, callback, mAttributionSource); - } - - @Test - public void numHwTrackFiltersAvailable() { - mBinder.numHwTrackFiltersAvailable(mAttributionSource); - verify(mScanController).numHwTrackFiltersAvailable(mAttributionSource); - } -} diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanBinderTest.kt b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanBinderTest.kt new file mode 100644 index 0000000000..3424c48a54 --- /dev/null +++ b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanBinderTest.kt @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bluetooth.le_scan + +import android.app.PendingIntent +import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothManager +import android.bluetooth.le.IPeriodicAdvertisingCallback +import android.bluetooth.le.IScannerCallback +import android.bluetooth.le.ScanFilter +import android.bluetooth.le.ScanResult +import android.bluetooth.le.ScanSettings +import android.content.Intent +import android.os.WorkSource +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry +import com.android.bluetooth.TestUtils.MockitoRule +import com.android.bluetooth.TestUtils.getTestDevice +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify + +/** Test cases for [ScanBinder] */ +@SmallTest +@RunWith(AndroidJUnit4::class) +class ScanBinderTest { + + @get:Rule val mockitoRule = MockitoRule() + + @Mock private lateinit var scanController: ScanController + + private val attributionSource = + InstrumentationRegistry.getInstrumentation() + .targetContext + .getSystemService(BluetoothManager::class.java) + .adapter + .attributionSource + private val device: BluetoothDevice = getTestDevice(89) + private lateinit var binder: ScanBinder + + @Before + fun setUp() { + binder = ScanBinder(scanController) + } + + @Test + fun registerScanner() { + val callback = mock(IScannerCallback::class.java) + val workSource = mock(WorkSource::class.java) + + binder.registerScanner(callback, workSource, attributionSource) + verify(scanController).registerScanner(callback, workSource, attributionSource) + } + + @Test + fun unregisterScanner() { + val scannerId = 1 + + binder.unregisterScanner(scannerId, attributionSource) + verify(scanController).unregisterScanner(scannerId, attributionSource) + } + + @Test + fun startScan() { + val scannerId = 1 + val settings = ScanSettings.Builder().build() + val filters = listOf<ScanFilter>() + + binder.startScan(scannerId, settings, filters, attributionSource) + verify(scanController).startScan(scannerId, settings, filters, attributionSource) + } + + @Test + fun startScanForIntent() { + val intent = + PendingIntent.getBroadcast( + InstrumentationRegistry.getInstrumentation().targetContext, + 0, + Intent(), + PendingIntent.FLAG_IMMUTABLE, + ) + val settings = ScanSettings.Builder().build() + val filters = listOf<ScanFilter>() + + binder.startScanForIntent(intent, settings, filters, attributionSource) + verify(scanController).registerPiAndStartScan(intent, settings, filters, attributionSource) + } + + @Test + fun stopScan_withScannerId() { + val scannerId = 1 + + binder.stopScan(scannerId, attributionSource) + verify(scanController).stopScan(scannerId, attributionSource) + } + + @Test + fun stopScan_withIntent() { + val intent = + PendingIntent.getBroadcast( + InstrumentationRegistry.getInstrumentation().targetContext, + 0, + Intent(), + PendingIntent.FLAG_IMMUTABLE, + ) + + binder.stopScanForIntent(intent, attributionSource) + verify(scanController).stopScan(intent, attributionSource) + } + + @Test + fun flushPendingBatchResults() { + val scannerId = 1 + + binder.flushPendingBatchResults(scannerId, attributionSource) + verify(scanController).flushPendingBatchResults(scannerId, attributionSource) + } + + @Test + fun registerSync() { + val scanResult = mock(ScanResult::class.java) + val skip = 1 + val timeout = 2 + val callback = mock(IPeriodicAdvertisingCallback::class.java) + + binder.registerSync(scanResult, skip, timeout, callback, attributionSource) + verify(scanController).registerSync(scanResult, skip, timeout, callback, attributionSource) + } + + @Test + fun unregisterSync() { + val callback = mock(IPeriodicAdvertisingCallback::class.java) + + binder.unregisterSync(callback, attributionSource) + verify(scanController).unregisterSync(callback, attributionSource) + } + + @Test + fun transferSync() { + val serviceData = 1 + val syncHandle = 2 + + binder.transferSync(device, serviceData, syncHandle, attributionSource) + verify(scanController).transferSync(device, serviceData, syncHandle, attributionSource) + } + + @Test + fun transferSetInfo() { + val serviceData = 1 + val advHandle = 2 + val callback = mock(IPeriodicAdvertisingCallback::class.java) + + binder.transferSetInfo(device, serviceData, advHandle, callback, attributionSource) + verify(scanController) + .transferSetInfo(device, serviceData, advHandle, callback, attributionSource) + } + + @Test + fun numHwTrackFiltersAvailable() { + binder.numHwTrackFiltersAvailable(attributionSource) + verify(scanController).numHwTrackFiltersAvailable(attributionSource) + } + + @Test + fun cleanup_doesNotCrash() { + binder.cleanup() + } +} diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanControllerTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanControllerTest.java index 8f2b58cdd8..f1d428906b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanControllerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanControllerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanFilterQueueTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanFilterQueueTest.java index 15dc16bbf3..da5a9d8974 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanFilterQueueTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanFilterQueueTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanManagerTest.java index 22d8fed0ac..54a3679ee6 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanManagerTest.java @@ -1227,7 +1227,6 @@ public class ScanManagerTest { } @Test - @EnableFlags(Flags.FLAG_BLE_SCAN_ADV_METRICS_REDESIGN) public void testMetricsAppScanScreenOn() { // Set filtered scan flag final boolean isFiltered = true; @@ -1292,7 +1291,8 @@ public class ScanManagerTest { 0, true, false, - IMPORTANCE_FOREGROUND_SERVICE); + IMPORTANCE_FOREGROUND_SERVICE, + ""); advanceTime(scanTestDuration); // Record scan stop @@ -1317,12 +1317,12 @@ public class ScanManagerTest { eq(0), eq(true), eq(false), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); } } @Test - @EnableFlags(Flags.FLAG_BLE_SCAN_ADV_METRICS_REDESIGN) public void testMetricsRadioScanScreenOnOffMultiScan() { // Set filtered scan flag final boolean isFiltered = true; @@ -1390,7 +1390,8 @@ public class ScanManagerTest { eq((long) ScanManager.SCAN_MODE_LOW_POWER_WINDOW_MS), eq(true), eq(scanTestDuration), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); advanceTime(scanTestDuration); // Create workSource for the third app @@ -1430,7 +1431,8 @@ public class ScanManagerTest { eq((long) ScanManager.SCAN_MODE_BALANCED_WINDOW_MS), eq(true), eq(scanTestDuration), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); advanceTime(scanTestDuration); // Create workSource for the fourth app @@ -1467,7 +1469,8 @@ public class ScanManagerTest { anyLong(), anyBoolean(), anyLong(), - anyInt()); + anyInt(), + eq("")); advanceTime(scanTestDuration); // Set as background app @@ -1492,7 +1495,8 @@ public class ScanManagerTest { eq((long) ScanManager.SCAN_MODE_LOW_LATENCY_WINDOW_MS), eq(true), eq(scanTestDuration * 2), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); advanceTime(scanTestDuration); // Get the most aggressive scan client when screen is off @@ -1521,7 +1525,8 @@ public class ScanManagerTest { eq((long) SCAN_MODE_SCREEN_OFF_LOW_POWER_WINDOW_MS), eq(false), eq(scanTestDuration), - eq(IMPORTANCE_FOREGROUND_SERVICE + 1)); + eq(IMPORTANCE_FOREGROUND_SERVICE + 1), + eq("")); advanceTime(scanTestDuration); // Stop scan for the fourth app @@ -1538,7 +1543,8 @@ public class ScanManagerTest { anyLong(), anyBoolean(), anyLong(), - anyInt()); + anyInt(), + eq("")); advanceTime(scanTestDuration); // Stop scan for the third app @@ -1558,7 +1564,8 @@ public class ScanManagerTest { eq((long) ScanManager.SCAN_MODE_LOW_LATENCY_WINDOW_MS), eq(true), eq(scanTestDuration * 2), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); advanceTime(scanTestDuration); // Stop scan for the second app @@ -1578,7 +1585,8 @@ public class ScanManagerTest { eq((long) ScanManager.SCAN_MODE_BALANCED_WINDOW_MS), eq(true), eq(scanTestDuration), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); advanceTime(scanTestDuration); // Stop scan for the first app @@ -1598,7 +1606,8 @@ public class ScanManagerTest { eq((long) ScanManager.SCAN_MODE_LOW_POWER_WINDOW_MS), eq(true), eq(scanTestDuration), - eq(IMPORTANCE_FOREGROUND_SERVICE)); + eq(IMPORTANCE_FOREGROUND_SERVICE), + eq("")); } @Test diff --git a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScannerMapTest.java b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScannerMapTest.java index e8d31e0552..ea5b2f564f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScannerMapTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/le_scan/ScannerMapTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAccountItemTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAccountItemTest.java index 8e1be7da7f..6e493ee6d5 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAccountItemTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAccountItemTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAppParamsTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAppParamsTest.java index fde49df622..c0defe0c21 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAppParamsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapAppParamsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentObserverTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentObserverTest.java index a336954afe..b131039e99 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentObserverTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentObserverTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentTest.java index 5014c1fecd..b149953287 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoContactElementTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoContactElementTest.java index aa203dcdec..6e8f60f5ce 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoContactElementTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoContactElementTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingElementTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingElementTest.java index f319894d39..da6e865ab3 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingElementTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingElementTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingTest.java index 97ec95ea25..e333d7b4bb 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapConvoListingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMasInstanceTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMasInstanceTest.java index b0239dfd02..87c33d6588 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMasInstanceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMasInstanceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingElementTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingElementTest.java index 81fa5b5122..bf58abaebc 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingElementTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingElementTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingTest.java index ccc9170eee..d78405aff4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapMessageListingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapObexServerTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapObexServerTest.java index 4d53d787b6..a5c4b8425e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapObexServerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapObexServerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceBinderTest.java index 6410ebf3f0..fa0c3d3f35 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceTest.java index 2f6604a486..f2c455bbc1 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapSmsPduTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapSmsPduTest.java index 285d056242..2f96c2ead9 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapSmsPduTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapSmsPduTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapUtilsTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapUtilsTest.java index 7bc752db8a..57467027e1 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapUtilsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageEmailTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageEmailTest.java index 2dab97af35..b3094670e2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageEmailTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageEmailTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageSmsTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageSmsTest.java index 9ef731fd90..9cec017f97 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageSmsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageSmsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageTest.java index 1344d9b0f6..d778b412a6 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageVCardTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageVCardTest.java index a44bd9cfda..69a57b83b2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageVCardTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapbMessageVCardTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/ConvoContactInfoTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/ConvoContactInfoTest.java index 170c9e762f..fc99e7134e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/ConvoContactInfoTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/ConvoContactInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/EventTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/EventTest.java index d1962fc37b..edd0863d4b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/EventTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/EventTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/FilterInfoTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/FilterInfoTest.java index 09183cab1f..7042e34980 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/FilterInfoTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/FilterInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/MapContactTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/MapContactTest.java index ea0490b173..93babf8f81 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/MapContactTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/MapContactTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/MsgTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/MsgTest.java index f9f0b50fa1..4a0963cd78 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/MsgTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/MsgTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/map/SmsMmsContactsTest.java b/android/app/tests/unit/src/com/android/bluetooth/map/SmsMmsContactsTest.java index 1397f06280..fdf2ee67e1 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/map/SmsMmsContactsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/map/SmsMmsContactsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapContractTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapContractTest.java index 8462d664f6..021c1ae82f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapContractTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapContractTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapEmailProviderTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapEmailProviderTest.java index 46c9d8a9cc..1dadfd906d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapEmailProviderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapEmailProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapIMProviderTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapIMProviderTest.java index 26913ee0a2..2fccf754e5 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapIMProviderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapapi/BluetoothMapIMProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/EventReportTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/EventReportTest.java index 3c355e1ad1..05facb51cc 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/EventReportTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/EventReportTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceBinderTest.java index d3e98577a6..0830f8b9f9 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceTest.java index c75333efcf..66f04951ee 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessageTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessageTest.java index 2f95d563a4..967e5b209d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesFilterTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesFilterTest.java index 12bcf80f3c..5433d67897 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesFilterTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesFilterTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesListingTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesListingTest.java index 48ece843fe..ab6e7a46a4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesListingTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MessagesListingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MnsObexServerTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MnsObexServerTest.java index 3979e3cc60..2abea296e7 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/MnsObexServerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/MnsObexServerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/mapclient/RequestGetMessagesListingForOwnNumberTest.java b/android/app/tests/unit/src/com/android/bluetooth/mapclient/RequestGetMessagesListingForOwnNumberTest.java index 9ca5a6e3b4..bd8bb8574c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/mapclient/RequestGetMessagesListingForOwnNumberTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/mapclient/RequestGetMessagesListingForOwnNumberTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppBatchTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppBatchTest.java index 4990c5315b..e3f764d2bc 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppBatchTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppBatchTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppHandoverReceiverTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppHandoverReceiverTest.java index 59227bae0b..daa65ebba6 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppHandoverReceiverTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppHandoverReceiverTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppManagerTest.java index 6b757ad437..b20858b647 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppNotificationTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppNotificationTest.java index 5e56af0711..5e5d11ce4d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppNotificationTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppNotificationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexClientSessionTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexClientSessionTest.java index 2481534d3c..b216680836 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexClientSessionTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexClientSessionTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexServerSessionTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexServerSessionTest.java index 5378dc6f41..1e850d057b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexServerSessionTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppObexServerSessionTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppPreferenceTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppPreferenceTest.java index 58eca97965..91b1b0b65d 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppPreferenceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppPreferenceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiveFileInfoTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiveFileInfoTest.java index 07cea67691..3f74ac90d1 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiveFileInfoTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiveFileInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiverTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiverTest.java index 28ece7fcb3..0a144d7b35 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiverTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppReceiverTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppSendFileInfoTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppSendFileInfoTest.java index 4d991b5610..d76517320e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppSendFileInfoTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppSendFileInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppServiceTest.java index 8055882546..a065757c01 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppShareInfoTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppShareInfoTest.java index 26b987bb0b..212f1ffef7 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppShareInfoTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppShareInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTestUtils.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTestUtils.java index 3345530765..e1ca5e7e7e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTestUtils.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferActivityTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferActivityTest.java index 5a268d1614..ece55f357e 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferActivityTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferActivityTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferTest.java index c122b44579..f6c393909c 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppTransferTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppUtilityTest.java b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppUtilityTest.java index 43fbc685ca..cadff94862 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppUtilityTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/opp/BluetoothOppUtilityTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactoryTest.java b/android/app/tests/unit/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactoryTest.java index ddabada6bc..04843899fb 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactoryTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceBinderTest.java index 15763b79c3..d798666437 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceTest.java index f8e22122d6..1621909b73 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pan/PanServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapCallLogComposerTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapCallLogComposerTest.java index c781ca82ac..73aa0f015f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapCallLogComposerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapCallLogComposerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapConfigTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapConfigTest.java index f57cbc2758..a95fbcc461 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapConfigTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapObexServerTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapObexServerTest.java index ed78e3239c..a833c6134b 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapObexServerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapObexServerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceBinderTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceBinderTest.java index becc52e836..95b2bb25ef 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceBinderTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceBinderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceTest.java index d3a4de5fed..e19ca130bf 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManagerTest.java index a2252796e3..4afce15b68 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapUtilsTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapUtilsTest.java index 2f4760f451..df448082c2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapUtilsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerNestedClassesTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerNestedClassesTest.java index b696cef960..e95e90088a 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerNestedClassesTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerNestedClassesTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerTest.java index 308a40b282..3b6034cd33 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/BluetoothPbapVcardManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/HandlerForStringBufferTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/HandlerForStringBufferTest.java index 7245788429..9382902122 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/HandlerForStringBufferTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/HandlerForStringBufferTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbap/PbapStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbap/PbapStateMachineTest.java index 607bf253d4..c46ea24702 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbap/PbapStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbap/PbapStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/CallLogPullRequestTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/CallLogPullRequestTest.java index b3669a14f6..376dcd9adf 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/CallLogPullRequestTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/CallLogPullRequestTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/FakeContactsProvider.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/FakeContactsProvider.java index 356c26d2d0..36408dc7df 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/FakeContactsProvider.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/FakeContactsProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapApplicationParametersTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapApplicationParametersTest.java index 81c90a9ab3..8f8c076648 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapApplicationParametersTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapApplicationParametersTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorServiceTest.java index e25c542889..dfc7c322a5 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorTest.java index 237b3215cb..fce20be7ad 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountAuthenticatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountManagerTest.java index a2b773fc03..e3ed3884a4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountManagerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientAccountManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandlerTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandlerTest.java index d3ebddfa18..eef3517311 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandlerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandlerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientContactsStorageTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientContactsStorageTest.java index ea515ec840..afd2c2a085 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientContactsStorageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientContactsStorageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexAuthenticatorTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexAuthenticatorTest.java index 74265a31ae..45476f1b73 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexAuthenticatorTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexAuthenticatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexClientTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexClientTest.java index 39a0e229fe..ef315042d2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexClientTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexClientTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexTransportTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexTransportTest.java index 29fc05c955..dfcc542467 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexTransportTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientObexTransportTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientServiceTest.java index 35196f14f2..bf3014a7ac 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientSocketTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientSocketTest.java index a3380b177b..64f1979437 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientSocketTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientSocketTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineOldTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineOldTest.java index 3518b2d418..73c1722e75 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineOldTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineOldTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineTest.java index 0f1550d868..d9b8bef9d4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapClientStateMachineTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookMetadataTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookMetadataTest.java index cdd57f8a9c..2abafedf77 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookMetadataTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookMetadataTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookTest.java index 994dccf85a..5c24a9f794 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapPhonebookTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapSdpRecordTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapSdpRecordTest.java index 7b3189db16..3248d6e9db 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapSdpRecordTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PbapSdpRecordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PhonebookPullRequestTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PhonebookPullRequestTest.java index d0e462ca66..10526bac41 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PhonebookPullRequestTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/PhonebookPullRequestTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookMetadataTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookMetadataTest.java index bdad362075..2e404f9614 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookMetadataTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookMetadataTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookTest.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookTest.java index 55eb76ab67..551d3e3d2f 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/RequestPullPhonebookTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/Utils.java b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/Utils.java index 39bbd25746..d390746a02 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/pbapclient/Utils.java +++ b/android/app/tests/unit/src/com/android/bluetooth/pbapclient/Utils.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/sap/SapMessageTest.java b/android/app/tests/unit/src/com/android/bluetooth/sap/SapMessageTest.java index eab7b0f84a..174e71a954 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/sap/SapMessageTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/sap/SapMessageTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverHidlTest.java b/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverHidlTest.java index 04d4238131..5d30fa6e93 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverHidlTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverHidlTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverTest.java b/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverTest.java index d2e6ea5d03..80983b2eef 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/sap/SapRilReceiverTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/sap/SapServerTest.java b/android/app/tests/unit/src/com/android/bluetooth/sap/SapServerTest.java index 3bed89bda3..69d6434ff2 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/sap/SapServerTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/sap/SapServerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/sap/SapServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/sap/SapServiceTest.java index d6336bcb34..06d41b2db8 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/sap/SapServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/sap/SapServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/sdp/DipTest.java b/android/app/tests/unit/src/com/android/bluetooth/sdp/DipTest.java index c9c3c238e2..4e5042bad6 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/sdp/DipTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/sdp/DipTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/telephony/BluetoothCallTest.java b/android/app/tests/unit/src/com/android/bluetooth/telephony/BluetoothCallTest.java index 884b914a4f..441ac2b603 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/telephony/BluetoothCallTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/telephony/BluetoothCallTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/app/tests/unit/src/com/android/bluetooth/vc/VolumeControlNativeCallbackTest.java b/android/app/tests/unit/src/com/android/bluetooth/vc/VolumeControlNativeCallbackTest.java index 4045cb9bfb..e474775f88 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/vc/VolumeControlNativeCallbackTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/vc/VolumeControlNativeCallbackTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/android/pandora/test/main.py b/android/pandora/test/main.py index d5c5da0bad..7e49321932 100644 --- a/android/pandora/test/main.py +++ b/android/pandora/test/main.py @@ -25,6 +25,7 @@ import avatar.cases.security_test import gatt_test import hap_test import hfpclient_test +import rfcomm_test import sdp_test from pairing import _test_class_list as _pairing_test_class_list @@ -81,6 +82,7 @@ _TEST_CLASSES_LIST = [ hap_test.HapTest, asha_test.AshaTest, hfpclient_test.HfpClientTest, + rfcomm_test.RfcommTest, ] + _pairing_test_class_list diff --git a/android/pandora/test/rfcomm_test.py b/android/pandora/test/rfcomm_test.py new file mode 100644 index 0000000000..4409b02e25 --- /dev/null +++ b/android/pandora/test/rfcomm_test.py @@ -0,0 +1,110 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import avatar +import grpc +import logging + +from avatar import PandoraDevices +from avatar.aio import asynchronous +from avatar.pandora_client import BumblePandoraClient, PandoraClient +from bumble.rfcomm import Server +from bumble_experimental.rfcomm import RFCOMMService +from mobly import base_test, test_runner +from mobly.asserts import assert_equal # type: ignore +from mobly.asserts import assert_in # type: ignore +from mobly.asserts import assert_is_not_none # type: ignore +from mobly.asserts import fail # type: ignore +from pandora_experimental.rfcomm_grpc_aio import RFCOMM +from pandora_experimental.rfcomm_pb2 import ( + AcceptConnectionRequest, + RxRequest, + StartServerRequest, + StopServerRequest, + TxRequest, +) +from typing import Optional, Tuple + +SERIAL_PORT_UUID = "00001101-0000-1000-8000-00805F9B34FB" +TEST_SERVER_NAME = "RFCOMM-Server" + + +class RfcommTest(base_test.BaseTestClass): + devices: Optional[PandoraDevices] = None + dut: PandoraClient + ref: BumblePandoraClient + + def setup_class(self) -> None: + self.devices = PandoraDevices(self) + self.dut, ref, *_ = self.devices + assert isinstance(ref, BumblePandoraClient) + self.ref = ref + # Enable BR/EDR mode and SSP for Bumble devices. + self.ref.config.setdefault('classic_enabled', True) + self.ref.config.setdefault('classic_ssp_enabled', True) + self.ref.config.setdefault( + 'server', + { + 'io_capability': 'no_output_no_input', + }, + ) + + def teardown_class(self) -> None: + if self.devices: + self.devices.stop_all() + + @avatar.asynchronous + async def setup_test(self) -> None: + await asyncio.gather(self.dut.reset(), self.ref.reset()) + + ref_server = Server(self.ref.device) + self.ref.rfcomm = RFCOMMService(self.ref.device, ref_server) + self.dut.rfcomm = RFCOMM(channel=self.dut.aio.channel) + + @avatar.asynchronous + async def test_client_connect_and_exchange_data(self) -> None: + # dut is client, ref is server + context = grpc.ServicerContext + server = await self.ref.rfcomm.StartServer(StartServerRequest(name=TEST_SERVER_NAME, uuid=SERIAL_PORT_UUID), + context=context) + # Convert StartServerResponse to its server + server = server.server + rfc_dut_ref, rfc_ref_dut = await asyncio.gather( + self.dut.rfcomm.ConnectToServer(address=self.ref.address, uuid=SERIAL_PORT_UUID), + self.ref.rfcomm.AcceptConnection(request=AcceptConnectionRequest(server=server), context=context)) + # Convert Responses to their corresponding RfcommConnection + rfc_dut_ref = rfc_dut_ref.connection + rfc_ref_dut = rfc_ref_dut.connection + + # Transmit data + tx_data = b'Data from dut to ref' + await self.dut.rfcomm.Send(data=tx_data, connection=rfc_dut_ref) + ref_receive = await self.ref.rfcomm.Receive(request=RxRequest(connection=rfc_ref_dut), context=context) + assert_equal(ref_receive.data, tx_data) + + # Receive data + rx_data = b'Data from ref to dut' + await self.ref.rfcomm.Send(request=TxRequest(connection=rfc_ref_dut, data=rx_data), context=context) + dut_receive = await self.dut.rfcomm.Receive(connection=rfc_dut_ref) + assert_equal(dut_receive.data.rstrip(b'\x00'), rx_data) + + # Disconnect (from dut) + await self.dut.rfcomm.Disconnect(connection=rfc_dut_ref) + await self.ref.rfcomm.StopServer(request=StopServerRequest(server=server), context=context) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + test_runner.main() # type: ignore diff --git a/apex/Android.bp b/apex/Android.bp index c2aabcf0b8..bf75163768 100644 --- a/apex/Android.bp +++ b/apex/Android.bp @@ -84,7 +84,6 @@ apex { ], key: "com.android.bt.key", certificate: ":com.android.bt.certificate", - updatable: true, compressible: false, visibility: ["//packages/modules/common/build"], } diff --git a/flags/gap.aconfig b/flags/gap.aconfig index d12e294ec7..4a03337332 100644 --- a/flags/gap.aconfig +++ b/flags/gap.aconfig @@ -30,13 +30,6 @@ flag { } flag { - name: "ble_scan_adv_metrics_redesign" - namespace: "bluetooth" - description: "Reimplement BLE scan and advertisement metrics logging." - bug: "328303508" -} - -flag { name: "msft_addr_tracking_quirk" namespace: "bluetooth" description: "Scanning with MSFT paddress tracking for Realtek BT controllers" diff --git a/flags/hci.aconfig b/flags/hci.aconfig index cdd5ca3ab6..6f6b1e70df 100644 --- a/flags/hci.aconfig +++ b/flags/hci.aconfig @@ -2,13 +2,6 @@ package: "com.android.bluetooth.flags" container: "com.android.bt" flag { - name: "encryption_change_v2" - namespace: "bluetooth" - description: "Enable encryption change V2 event" - bug: "366018699" -} - -flag { name: "dont_send_hci_disconnect_repeatedly" namespace: "bluetooth" description: "Prevent BT from sending repeated HCI disconnect command" diff --git a/flags/l2cap.aconfig b/flags/l2cap.aconfig index fec2edd6d5..f82b596674 100644 --- a/flags/l2cap.aconfig +++ b/flags/l2cap.aconfig @@ -9,16 +9,6 @@ flag { } flag { - name: "l2cap_le_do_not_adjust_min_interval" - namespace: "bluetooth" - description: "Do not adjust min_interval in connection update request" - bug: "346960036" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "l2cap_fcs_option_fix" namespace: "bluetooth" description: "Use fcs_option for non BASIC mode " diff --git a/flags/pairing.aconfig b/flags/pairing.aconfig index bc57bafe9e..f30410db17 100644 --- a/flags/pairing.aconfig +++ b/flags/pairing.aconfig @@ -102,16 +102,6 @@ flag { } flag { - name: "smp_state_machine_stuck_after_disconnection_fix" - namespace: "bluetooth" - description: "Fix state machine stuck after pairing device disconnection" - bug: "376306092" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "prevent_service_connections_on_remove_bond" namespace: "bluetooth" description: "Disable service connections on remove bond" @@ -260,3 +250,23 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + name: "le_peripheral_enc_failure" + namespace: "bluetooth" + description: "Don't remove bond on LE encryption failure in peripheral role with bonded device, instead just disconnect the link" + bug: "403313352" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + name: "immediate_encryption_after_pairing" + namespace: "bluetooth" + description: "Encrypt BR/EDR link immediately after pairing" + bug: "402510244" + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/flags/security.aconfig b/flags/security.aconfig index c83dc02b24..8d5a8c1f31 100644 --- a/flags/security.aconfig +++ b/flags/security.aconfig @@ -2,13 +2,6 @@ package: "com.android.bluetooth.flags" container: "com.android.bt" flag { - name: "key_missing_classic_device" - namespace: "bluetooth" - description: "Key missing broadcast for Classic devices" - bug: "333634398" -} - -flag { name: "key_missing_ble_peripheral" namespace: "bluetooth" description: "Key missing broadcast for LE devices in peripheral role" @@ -66,16 +59,6 @@ flag { } flag { - name: "sec_disconnect_on_le_key_missing" - namespace: "bluetooth" - description: "Disconnect LE link when keys are missing during encryption" - bug: "376680866" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "guard_bonded_device_properties" namespace: "bluetooth" description: "Don't update device properties for bonded devices from the device discovery results" diff --git a/flags/sockets.aconfig b/flags/sockets.aconfig index 2eb23b1fcb..6b31e06705 100644 --- a/flags/sockets.aconfig +++ b/flags/sockets.aconfig @@ -92,3 +92,13 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + name: "fix_lecoc_socket_available" + namespace: "bluetooth" + description: "Fix Bluetooth Socket available API for LECOC socket" + bug: "402536099" + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/flags/system_service.aconfig b/flags/system_service.aconfig index ea40eb33de..c1cf4f6bd8 100644 --- a/flags/system_service.aconfig +++ b/flags/system_service.aconfig @@ -2,6 +2,16 @@ package: "com.android.bluetooth.flags" container: "com.android.bt" flag { + name: "enable_ble_while_disabling_airplane" + namespace: "bluetooth" + description: "Fix a race between enabling and handling airplane event" + bug: "402563502" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "kill_instead_of_exit" namespace: "bluetooth" description: "There is no value in pretending we are exiting properly. This is a kill and we should express it this way when finishing the process" diff --git a/framework/api/system-current.txt b/framework/api/system-current.txt index 578966462a..ef922c92e1 100644 --- a/framework/api/system-current.txt +++ b/framework/api/system-current.txt @@ -247,7 +247,7 @@ package android.bluetooth { method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean cancelBondProcess(); method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE}) public int connect(); method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public boolean createBond(int); - method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public boolean createBondOutOfBand(int, @Nullable android.bluetooth.OobData, @Nullable android.bluetooth.OobData); + method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean createBondOutOfBand(int, @Nullable android.bluetooth.OobData, @Nullable android.bluetooth.OobData); method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int disconnect(); method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}, conditional=true) public boolean fetchUuidsWithSdp(int); method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getActiveAudioDevicePolicy(); diff --git a/framework/java/android/bluetooth/BluetoothAdapter.java b/framework/java/android/bluetooth/BluetoothAdapter.java index 40d1153581..1b37497323 100644 --- a/framework/java/android/bluetooth/BluetoothAdapter.java +++ b/framework/java/android/bluetooth/BluetoothAdapter.java @@ -3686,6 +3686,9 @@ public final class BluetoothAdapter { if (mBluetoothLeScanner != null) { mBluetoothLeScanner.cleanup(); } + if (mDistanceMeasurementManager != null) { + mDistanceMeasurementManager.cleanup(); + } } } finally { mServiceLock.writeLock().unlock(); diff --git a/framework/java/android/bluetooth/BluetoothDevice.java b/framework/java/android/bluetooth/BluetoothDevice.java index c7f3b8a052..d5ec86546c 100644 --- a/framework/java/android/bluetooth/BluetoothDevice.java +++ b/framework/java/android/bluetooth/BluetoothDevice.java @@ -1950,7 +1950,21 @@ public final class BluetoothDevice implements Parcelable, Attributable { @RequiresBluetoothConnectPermission @RequiresPermission(BLUETOOTH_CONNECT) public boolean createBond(int transport) { - return createBondInternal(transport, null, null); + if (DBG) log("createBond()"); + final IBluetooth service = getService(); + if (service == null || !isBluetoothEnabled()) { + Log.w(TAG, "BT not enabled, createBond failed"); + if (DBG) log(Log.getStackTraceString(new Throwable())); + } else if (NULL_MAC_ADDRESS.equals(mAddress)) { + Log.e(TAG, "Unable to create bond, invalid address " + mAddress); + } else { + try { + return service.createBond(this, transport, mAttributionSource); + } catch (RemoteException e) { + Log.e(TAG, e.toString() + "\n" + Log.getStackTraceString(new Throwable())); + } + } + return false; } /** @@ -1974,30 +1988,25 @@ public final class BluetoothDevice implements Parcelable, Attributable { * @hide */ @SystemApi - @RequiresPermission(BLUETOOTH_CONNECT) + @RequiresPermission(allOf = {BLUETOOTH_CONNECT, BLUETOOTH_PRIVILEGED}) public boolean createBondOutOfBand( int transport, @Nullable OobData remoteP192Data, @Nullable OobData remoteP256Data) { + if (DBG) log("createBondOutOfBand()"); + final IBluetooth service = getService(); + if (remoteP192Data == null && remoteP256Data == null) { throw new IllegalArgumentException( "One or both arguments for the OOB data types are required to not be null. " + " Please use createBond() instead if you do not have OOB data to pass."); } - return createBondInternal(transport, remoteP192Data, remoteP256Data); - } - - @RequiresPermission(BLUETOOTH_CONNECT) - private boolean createBondInternal( - int transport, @Nullable OobData remoteP192Data, @Nullable OobData remoteP256Data) { - if (DBG) log("createBondInternal()"); - final IBluetooth service = getService(); if (service == null || !isBluetoothEnabled()) { - Log.w(TAG, "BT not enabled, createBondInternal failed"); + Log.w(TAG, "BT not enabled, createBondOutOfBand failed"); if (DBG) log(Log.getStackTraceString(new Throwable())); } else if (NULL_MAC_ADDRESS.equals(mAddress)) { - Log.e(TAG, "Unable to create bond, invalid address " + mAddress); + Log.e(TAG, "Unable to create bond Out of Band, invalid address " + mAddress); } else { try { - return service.createBond( + return service.createBondOutOfBand( this, transport, remoteP192Data, remoteP256Data, mAttributionSource); } catch (RemoteException e) { Log.e(TAG, e.toString() + "\n" + Log.getStackTraceString(new Throwable())); diff --git a/framework/java/android/bluetooth/BluetoothHearingAid.java b/framework/java/android/bluetooth/BluetoothHearingAid.java index 7e14057546..991efc3dc6 100644 --- a/framework/java/android/bluetooth/BluetoothHearingAid.java +++ b/framework/java/android/bluetooth/BluetoothHearingAid.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcast.java b/framework/java/android/bluetooth/BluetoothLeBroadcast.java index 192b95231d..75aec6f996 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcast.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcast.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastAssistant.java b/framework/java/android/bluetooth/BluetoothLeBroadcastAssistant.java index d72fc1a50f..3c6cbed382 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcastAssistant.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastAssistant.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java b/framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java index 5149b19211..873edac288 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastMetadata.java b/framework/java/android/bluetooth/BluetoothLeBroadcastMetadata.java index 562e0b7835..f40f4d7397 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcastMetadata.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastReceiveState.java b/framework/java/android/bluetooth/BluetoothLeBroadcastReceiveState.java index 3fa4dcc7a3..a0ae67799c 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcastReceiveState.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastReceiveState.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastSettings.java b/framework/java/android/bluetooth/BluetoothLeBroadcastSettings.java index 48d53c4cb3..182780e6b9 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcastSettings.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroup.java b/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroup.java index 5d150ed78c..cc87421e50 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroup.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroup.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroupSettings.java b/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroupSettings.java index d903435974..b355f43473 100644 --- a/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroupSettings.java +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastSubgroupSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java b/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java index 5a11a7fbe5..5ebffbd430 100644 --- a/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java +++ b/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/BluetoothSocketSettings.java b/framework/java/android/bluetooth/BluetoothSocketSettings.java index 3f222d4717..04151ef3e6 100644 --- a/framework/java/android/bluetooth/BluetoothSocketSettings.java +++ b/framework/java/android/bluetooth/BluetoothSocketSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/le/ChannelSoundingParams.java b/framework/java/android/bluetooth/le/ChannelSoundingParams.java index cbaa01d0fb..aa0202a3be 100644 --- a/framework/java/android/bluetooth/le/ChannelSoundingParams.java +++ b/framework/java/android/bluetooth/le/ChannelSoundingParams.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/le/DistanceMeasurementManager.java b/framework/java/android/bluetooth/le/DistanceMeasurementManager.java index 6209e31946..94715301f0 100644 --- a/framework/java/android/bluetooth/le/DistanceMeasurementManager.java +++ b/framework/java/android/bluetooth/le/DistanceMeasurementManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import static java.util.Objects.requireNonNull; import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresNoPermission; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; @@ -271,6 +272,16 @@ public final class DistanceMeasurementManager { return Collections.emptySet(); } + /** + * Clear session map. Should be called when bluetooth is down. + * + * @hide + */ + @RequiresNoPermission + public void cleanup() { + mSessionMap.clear(); + } + @SuppressLint("AndroidFrameworkBluetoothPermission") private final IDistanceMeasurementCallback mCallbackWrapper = new IDistanceMeasurementCallback.Stub() { diff --git a/framework/java/android/bluetooth/le/DistanceMeasurementMethod.java b/framework/java/android/bluetooth/le/DistanceMeasurementMethod.java index 0d9f187889..a677f0e810 100644 --- a/framework/java/android/bluetooth/le/DistanceMeasurementMethod.java +++ b/framework/java/android/bluetooth/le/DistanceMeasurementMethod.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/le/DistanceMeasurementParams.java b/framework/java/android/bluetooth/le/DistanceMeasurementParams.java index 51a4a595a9..eadcd3078c 100644 --- a/framework/java/android/bluetooth/le/DistanceMeasurementParams.java +++ b/framework/java/android/bluetooth/le/DistanceMeasurementParams.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/le/DistanceMeasurementResult.java b/framework/java/android/bluetooth/le/DistanceMeasurementResult.java index 2292371e56..c757daa710 100644 --- a/framework/java/android/bluetooth/le/DistanceMeasurementResult.java +++ b/framework/java/android/bluetooth/le/DistanceMeasurementResult.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/le/DistanceMeasurementSession.java b/framework/java/android/bluetooth/le/DistanceMeasurementSession.java index 3241e68b59..e2dd181810 100644 --- a/framework/java/android/bluetooth/le/DistanceMeasurementSession.java +++ b/framework/java/android/bluetooth/le/DistanceMeasurementSession.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/java/android/bluetooth/le/TransportBlockFilter.java b/framework/java/android/bluetooth/le/TransportBlockFilter.java index 5da9bf658f..1a8418c691 100644 --- a/framework/java/android/bluetooth/le/TransportBlockFilter.java +++ b/framework/java/android/bluetooth/le/TransportBlockFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/bumble/src/android/bluetooth/pairing/OobPairingTest.java b/framework/tests/bumble/src/android/bluetooth/pairing/OobPairingTest.java index bdfa42dd65..0b0da56f7b 100644 --- a/framework/tests/bumble/src/android/bluetooth/pairing/OobPairingTest.java +++ b/framework/tests/bumble/src/android/bluetooth/pairing/OobPairingTest.java @@ -19,6 +19,8 @@ package android.bluetooth.pairing; import static androidx.test.espresso.intent.matcher.IntentMatchers.hasAction; import static androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra; +import static com.google.common.truth.Truth.assertThat; + import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter.OobDataCallback; import android.bluetooth.BluetoothDevice; @@ -340,11 +342,14 @@ public class OobPairingTest { while (true) { if (scanningResponseIterator.hasNext()) { ScanningResponse scanningResponse = scanningResponseIterator.next(); - // select first available device + // select first available device with Random address type deviceAddr = scanningResponse.getRandom(); - break; + if (deviceAddr != null) { + break; + } } } + assertThat(deviceAddr).isNotNull(); ConnectLEResponse leConn = mBumble.hostBlocking() diff --git a/framework/tests/unit/src/android/bluetooth/BluetoothActivityEnergyInfoTest.java b/framework/tests/unit/src/android/bluetooth/BluetoothActivityEnergyInfoTest.java index eb8e074953..fdb8bd9f25 100644 --- a/framework/tests/unit/src/android/bluetooth/BluetoothActivityEnergyInfoTest.java +++ b/framework/tests/unit/src/android/bluetooth/BluetoothActivityEnergyInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/BluetoothAudioConfigTest.java b/framework/tests/unit/src/android/bluetooth/BluetoothAudioConfigTest.java index 2360dcad14..49f0f745b6 100644 --- a/framework/tests/unit/src/android/bluetooth/BluetoothAudioConfigTest.java +++ b/framework/tests/unit/src/android/bluetooth/BluetoothAudioConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/BluetoothCodecConfigTest.java b/framework/tests/unit/src/android/bluetooth/BluetoothCodecConfigTest.java index 316ef1f109..d2ca867f01 100644 --- a/framework/tests/unit/src/android/bluetooth/BluetoothCodecConfigTest.java +++ b/framework/tests/unit/src/android/bluetooth/BluetoothCodecConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/BluetoothCodecStatusTest.java b/framework/tests/unit/src/android/bluetooth/BluetoothCodecStatusTest.java index 85422f568a..25b1812bf5 100644 --- a/framework/tests/unit/src/android/bluetooth/BluetoothCodecStatusTest.java +++ b/framework/tests/unit/src/android/bluetooth/BluetoothCodecStatusTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/BluetoothDeviceTest.java b/framework/tests/unit/src/android/bluetooth/BluetoothDeviceTest.java index 55263c4400..d173645914 100644 --- a/framework/tests/unit/src/android/bluetooth/BluetoothDeviceTest.java +++ b/framework/tests/unit/src/android/bluetooth/BluetoothDeviceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/CallbackWrapperTest.java b/framework/tests/unit/src/android/bluetooth/CallbackWrapperTest.java index 0721ead366..15dad9ca3b 100644 --- a/framework/tests/unit/src/android/bluetooth/CallbackWrapperTest.java +++ b/framework/tests/unit/src/android/bluetooth/CallbackWrapperTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/SdpDipRecordTest.java b/framework/tests/unit/src/android/bluetooth/SdpDipRecordTest.java index b8a0d48f66..380ef9d34f 100644 --- a/framework/tests/unit/src/android/bluetooth/SdpDipRecordTest.java +++ b/framework/tests/unit/src/android/bluetooth/SdpDipRecordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/SdpMnsRecordTest.java b/framework/tests/unit/src/android/bluetooth/SdpMnsRecordTest.java index 5e686d1bfc..d314a959c3 100644 --- a/framework/tests/unit/src/android/bluetooth/SdpMnsRecordTest.java +++ b/framework/tests/unit/src/android/bluetooth/SdpMnsRecordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/SdpOppOpsRecordTest.java b/framework/tests/unit/src/android/bluetooth/SdpOppOpsRecordTest.java index dcff94073d..8ab38cbb19 100644 --- a/framework/tests/unit/src/android/bluetooth/SdpOppOpsRecordTest.java +++ b/framework/tests/unit/src/android/bluetooth/SdpOppOpsRecordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/SdpPseRecordTest.java b/framework/tests/unit/src/android/bluetooth/SdpPseRecordTest.java index c9eeaa2940..1f1ce64540 100644 --- a/framework/tests/unit/src/android/bluetooth/SdpPseRecordTest.java +++ b/framework/tests/unit/src/android/bluetooth/SdpPseRecordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/SdpRecordTest.java b/framework/tests/unit/src/android/bluetooth/SdpRecordTest.java index f7afe42688..74fc82bef4 100644 --- a/framework/tests/unit/src/android/bluetooth/SdpRecordTest.java +++ b/framework/tests/unit/src/android/bluetooth/SdpRecordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/framework/tests/unit/src/android/bluetooth/SdpSapsRecordTest.java b/framework/tests/unit/src/android/bluetooth/SdpSapsRecordTest.java index eedfb9ac64..5316bc915f 100644 --- a/framework/tests/unit/src/android/bluetooth/SdpSapsRecordTest.java +++ b/framework/tests/unit/src/android/bluetooth/SdpSapsRecordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/offload/leaudio/hci/proxy.rs b/offload/leaudio/hci/proxy.rs index 933389d315..adc2dbd34d 100644 --- a/offload/leaudio/hci/proxy.rs +++ b/offload/leaudio/hci/proxy.rs @@ -195,10 +195,16 @@ impl Module for LeAudioModule { ); } - Ok(Command::LeSetupIsoDataPath(ref c)) if c.data_path_id == DATA_PATH_ID_SOFTWARE => { + Ok(Command::LeSetupIsoDataPath(ref c)) if c.data_path_id == DATA_PATH_ID_SOFTWARE => 'command: { assert_eq!(c.data_path_direction, hci::LeDataPathDirection::Input); let mut state = self.state.lock().unwrap(); - let stream = state.stream.get_mut(&c.connection_handle).unwrap(); + let Some(stream) = state.stream.get_mut(&c.connection_handle) else { + log::warn!( + "Setup ISO Data Path on non existing BIS/CIS handle: 0x{:03x}", + c.connection_handle + ); + break 'command; + }; stream.state = StreamState::Enabling; // Phase 1 limitation: The controller does not implement HCI Link Feedback event, @@ -209,6 +215,16 @@ impl Module for LeAudioModule { return; } + Ok(Command::LeRemoveIsoDataPath(ref c)) => { + let mut state = self.state.lock().unwrap(); + if state.stream.get_mut(&c.connection_handle).is_none() { + log::warn!( + "Remove ISO Data Path on non existing BIS/CIS handle: 0x{:03x}", + c.connection_handle + ); + } + } + _ => (), } @@ -250,7 +266,9 @@ impl Module for LeAudioModule { ReturnParameters::LeSetupIsoDataPath(ref ret) => 'event: { let mut state = self.state.lock().unwrap(); - let stream = state.stream.get_mut(&ret.connection_handle).unwrap(); + let Some(stream) = state.stream.get_mut(&ret.connection_handle) else { + break 'event; + }; stream.state = if stream.state == StreamState::Enabling && ret.status == Status::Success { StreamState::Enabled @@ -278,9 +296,11 @@ impl Module for LeAudioModule { ); } - ReturnParameters::LeRemoveIsoDataPath(ref ret) if ret.status == Status::Success => { + ReturnParameters::LeRemoveIsoDataPath(ref ret) if ret.status == Status::Success => 'event: { let mut state = self.state.lock().unwrap(); - let stream = state.stream.get_mut(&ret.connection_handle).unwrap(); + let Some(stream) = state.stream.get_mut(&ret.connection_handle) else { + break 'event; + }; if stream.state == StreamState::Enabled { Service::stop_stream(ret.connection_handle); } diff --git a/service/src/com/android/server/bluetooth/BluetoothManagerService.java b/service/src/com/android/server/bluetooth/BluetoothManagerService.java index 08a949d81a..5f13b6266a 100644 --- a/service/src/com/android/server/bluetooth/BluetoothManagerService.java +++ b/service/src/com/android/server/bluetooth/BluetoothManagerService.java @@ -78,7 +78,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.sysprop.BluetoothProperties; -import android.util.proto.ProtoOutputStream; import androidx.annotation.RequiresApi; @@ -95,7 +94,6 @@ import kotlin.Unit; import kotlin.time.TimeSource; import java.io.FileDescriptor; -import java.io.FileOutputStream; import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -140,10 +138,17 @@ class BluetoothManagerService { // Delay for retrying enable and disable in msec @VisibleForTesting static final int ENABLE_DISABLE_DELAY_MS = 300 * HW_MULTIPLIER; + // TODO: b/402209603 remove along with system_server_remove_extra_thread_jump @VisibleForTesting static final int MESSAGE_ENABLE = 1; + // TODO: b/402209603 remove along with system_server_remove_extra_thread_jump @VisibleForTesting static final int MESSAGE_DISABLE = 2; + + // TODO: b/402209603 remove along with system_server_remove_extra_thread_jump @VisibleForTesting static final int MESSAGE_HANDLE_ENABLE_DELAYED = 3; + + // TODO: b/402209603 remove along with system_server_remove_extra_thread_jump @VisibleForTesting static final int MESSAGE_HANDLE_DISABLE_DELAYED = 4; + @VisibleForTesting static final int MESSAGE_BLUETOOTH_SERVICE_CONNECTED = 40; @VisibleForTesting static final int MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED = 41; @VisibleForTesting static final int MESSAGE_RESTART_BLUETOOTH_SERVICE = 42; @@ -327,8 +332,9 @@ class BluetoothManagerService { } else if (state != STATE_ON && state != STATE_OFF && state != STATE_BLE_ON) { // Bluetooth is turning state return ADD_PROXY_DELAY_MS; - } else if (mHandler.hasMessages(MESSAGE_ENABLE) - || mHandler.hasMessages(MESSAGE_DISABLE) + } else if ((!Flags.systemServerRemoveExtraThreadJump() + && (mHandler.hasMessages(MESSAGE_ENABLE) + || mHandler.hasMessages(MESSAGE_DISABLE))) || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED) || mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) || mHandler.hasMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE) @@ -1038,6 +1044,42 @@ class BluetoothManagerService { return true; } + private static CompletableFuture<Void> createDeathNotifier(IBinder binder) { + CompletableFuture<Void> deathNotifier = new CompletableFuture<>(); + try { + binder.linkToDeath( + () -> { + Log.i(TAG, "Successfully received Bluetooth death"); + deathNotifier.complete(null); + }, + 0); + } catch (RemoteException e) { + Log.e(TAG, "listenBinderDeath(): Failed to linkToDeath", e); + deathNotifier.complete(null); + } + return deathNotifier; + } + + private static void killBluetoothProcess( + AdapterBinder adapter, CompletableFuture<Void> deathNotifier) { + try { + // Force kill Bluetooth to make sure its process is not reused. + // Note: In a perfect world, we should be able to re-init the same process. + // Unfortunately, this requires an heavy rework of the Bluetooth app + // TODO: b/339501753 - Properly stop Bluetooth without killing it + adapter.killBluetoothProcess(); + + deathNotifier.get(2_000, TimeUnit.MILLISECONDS); + } catch (android.os.DeadObjectException e) { + // Reduce exception to info and skip waiting (Bluetooth is dead as wanted) + Log.i(TAG, "killBluetoothProcess(): Bluetooth already dead 💀"); + } catch (RemoteException e) { + Log.e(TAG, "killBluetoothProcess(): Unable to call killBluetoothProcess", e); + } catch (TimeoutException | InterruptedException | ExecutionException e) { + Log.e(TAG, "killBluetoothProcess(): Bluetooth death not received after > 2000ms", e); + } + } + void unbindAndFinish() { Log.d(TAG, "unbindAndFinish(): mAdapter=" + mAdapter + " isBinding=" + isBinding()); @@ -1054,40 +1096,13 @@ class BluetoothManagerService { Log.e(TAG, "unbindAndFinish(): Unable to unregister BluetoothCallback", e); } - CompletableFuture<Void> binderDead = new CompletableFuture<>(); - try { - mAdapter.getAdapterBinder() - .asBinder() - .linkToDeath( - () -> { - Log.i(TAG, "Successfully received Bluetooth death"); - binderDead.complete(null); - }, - 0); - } catch (RemoteException e) { - Log.e(TAG, "unbindAndFinish(): Failed to linkToDeath", e); - binderDead.complete(null); - } + CompletableFuture<Void> deathNotifier = + createDeathNotifier(mAdapter.getAdapterBinder().asBinder()); // Unbind first to avoid receiving unwanted "onServiceDisconnected" mContext.unbindService(mConnection); - try { - // Force kill Bluetooth to make sure its process is not reused. - // Note: In a perfect world, we should be able to re-init the same process. - // Unfortunately, this requires an heavy rework of the Bluetooth app - // TODO: b/339501753 - Properly stop Bluetooth without killing it - mAdapter.killBluetoothProcess(); - - binderDead.get(2_000, TimeUnit.MILLISECONDS); - } catch (android.os.DeadObjectException e) { - // Reduce exception to info and skip waiting (Bluetooth is dead as wanted) - Log.i(TAG, "unbindAndFinish(): Bluetooth already dead 💀"); - } catch (RemoteException e) { - Log.e(TAG, "unbindAndFinish(): Unable to call killBluetoothProcess", e); - } catch (TimeoutException | InterruptedException | ExecutionException e) { - Log.e(TAG, "unbindAndFinish(): Bluetooth death not received after > 2000ms", e); - } + killBluetoothProcess(mAdapter, deathNotifier); long timeSpentForShutdown = System.currentTimeMillis() - currentTimeMs; mShutdownLatencyHistogram.logSample((float) timeSpentForShutdown); @@ -1228,10 +1243,10 @@ class BluetoothManagerService { } if (Flags.setComponentAvailableFix()) { - mHandler - .obtainMessage(MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED, - componentName.getPackageName()) - .sendToTarget(); + mHandler.obtainMessage( + MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED, + componentName.getPackageName()) + .sendToTarget(); } else { mHandler.sendEmptyMessage(MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED); } @@ -1252,8 +1267,12 @@ class BluetoothManagerService { public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_ENABLE: - int quietEnable = msg.arg1; - int isBle = msg.arg2; + if (Flags.systemServerRemoveExtraThreadJump()) { + break; + } + + boolean quietEnable = msg.arg1 != 0; + boolean isBle = msg.arg2 != 0; Log.d( TAG, @@ -1265,6 +1284,10 @@ class BluetoothManagerService { break; case MESSAGE_DISABLE: + if (Flags.systemServerRemoveExtraThreadJump()) { + break; + } + Log.d(TAG, "MESSAGE_DISABLE: mAdapter=" + mAdapter); handleDisableMessage(); @@ -1311,6 +1334,15 @@ class BluetoothManagerService { case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: IBinder service = (IBinder) msg.obj; + + // Handle case where disable was called before binding complete. + if (Flags.systemServerRemoveExtraThreadJump() && !isBinding() && !mEnable) { + Log.d(TAG, "MESSAGE_BLUETOOTH_SERVICE_CONNECTED: after cancelling binding"); + AdapterBinder adapter = + BluetoothServerProxy.getInstance().createAdapterBinder(service); + killBluetoothProcess(adapter, createDeathNotifier(service)); + break; + } Log.d(TAG, "MESSAGE_BLUETOOTH_SERVICE_CONNECTED: service=" + service); // Remove timeout @@ -1330,7 +1362,7 @@ class BluetoothManagerService { offToBleOn(); sendBluetoothServiceUpCallback(); - if (!mEnable) { + if (!Flags.systemServerRemoveExtraThreadJump() && !mEnable) { waitForState(STATE_ON); onToBleOn(); } @@ -1363,7 +1395,9 @@ class BluetoothManagerService { if (prevState == STATE_BLE_TURNING_OFF && newState == STATE_OFF) { if (mEnable) { Log.d(TAG, "Entering STATE_OFF but mEnabled is true; restarting."); - waitForState(STATE_OFF); + if (!Flags.systemServerRemoveExtraThreadJump()) { + waitForState(STATE_OFF); + } mHandler.sendEmptyMessageDelayed( MESSAGE_RESTART_BLUETOOTH_SERVICE, getServiceRestartMs()); } @@ -1524,17 +1558,19 @@ class BluetoothManagerService { return mHandler.hasMessages(MESSAGE_TIMEOUT_BIND); } - private void handleEnableMessage(int quietEnable, int isBle) { + private void handleEnableMessage(boolean quietEnable, boolean isBle) { + String logHeader = "handleEnableMessage(" + quietEnable + ", " + isBle + "): "; if (mShutdownInProgress) { - Log.d(TAG, "Skip Bluetooth Enable in device shutdown process"); + Log.d(TAG, logHeader + "Skip Bluetooth Enable in device shutdown process"); return; } - if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) - || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) { + if (!Flags.systemServerRemoveExtraThreadJump() + && (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) + || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED))) { // We are handling enable or disable right now, wait for it. mHandler.sendMessageDelayed( - mHandler.obtainMessage(MESSAGE_ENABLE, quietEnable, isBle), + mHandler.obtainMessage(MESSAGE_ENABLE, quietEnable ? 1 : 0, isBle ? 1 : 0), ENABLE_DISABLE_DELAY_MS); return; } @@ -1542,27 +1578,27 @@ class BluetoothManagerService { mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE); mEnable = true; - if (isBle == 0) { + if (!isBle) { setBluetoothPersistedState(BLUETOOTH_ON_BLUETOOTH); } if (mState.oneOf(STATE_BLE_TURNING_ON, STATE_TURNING_ON, STATE_ON)) { - Log.i(TAG, "MESSAGE_ENABLE: already enabled. Current state=" + mState); + Log.i(TAG, logHeader + "Already enabled. Current state=" + mState); return; } - if (mState.oneOf(STATE_BLE_ON) && isBle == 1) { - Log.i(TAG, "MESSAGE_ENABLE: Already in BLE_ON while being requested to go to BLE_ON"); + if (mState.oneOf(STATE_BLE_ON) && isBle) { + Log.i(TAG, logHeader + "Already in BLE_ON while being requested to go to BLE_ON"); return; } if (mState.oneOf(STATE_BLE_ON)) { - Log.i(TAG, "MESSAGE_ENABLE: Bluetooth transition from STATE_BLE_ON to STATE_ON"); + Log.i(TAG, logHeader + "Bluetooth transition from STATE_BLE_ON to STATE_ON"); bleOnToOn(); return; } - if (mAdapter != null) { + if (!Flags.systemServerRemoveExtraThreadJump() && mAdapter != null) { // TODO: b/339548431 - Adapt this after removal of Flags.explicitKillFromSystemServer // // We need to wait until transitioned to STATE_OFF and the previous Bluetooth process @@ -1581,14 +1617,15 @@ class BluetoothManagerService { return; } - mQuietEnable = (quietEnable == 1); + mQuietEnable = quietEnable; handleEnable(); } private void handleDisableMessage() { - if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) - || isBinding() - || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) { + if (!Flags.systemServerRemoveExtraThreadJump() + && (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED) + || isBinding() + || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED))) { // We are handling enable or disable right now, wait for it. mHandler.sendEmptyMessageDelayed(MESSAGE_DISABLE, ENABLE_DISABLE_DELAY_MS); return; @@ -1596,10 +1633,25 @@ class BluetoothManagerService { mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE); - if (mEnable && mAdapter != null) { + if (Flags.systemServerRemoveExtraThreadJump() && isBinding()) { + Log.d(TAG, "Disable while binding"); + mEnable = false; + mContext.unbindService(mConnection); + mHandler.removeMessages(MESSAGE_TIMEOUT_BIND); + mHandler.removeMessages(MESSAGE_BLUETOOTH_SERVICE_CONNECTED); + } else if (Flags.systemServerRemoveExtraThreadJump() + && mState.oneOf(STATE_BLE_TURNING_ON)) { + Log.d(TAG, "Disable while BLE_TURNING_ON"); + mEnable = false; + bluetoothStateChangeHandler(STATE_BLE_TURNING_ON, STATE_OFF); + } else if (mEnable && mAdapter != null) { mWaitForDisableRetry = 0; - mHandler.sendEmptyMessageDelayed( - MESSAGE_HANDLE_DISABLE_DELAYED, ENABLE_DISABLE_DELAY_MS); + if (Flags.systemServerRemoveExtraThreadJump()) { + handleDisableDelayed(false); + } else { + mHandler.sendEmptyMessageDelayed( + MESSAGE_HANDLE_DISABLE_DELAYED, ENABLE_DISABLE_DELAY_MS); + } } else { mEnable = false; onToBleOn(); @@ -1648,6 +1700,10 @@ class BluetoothManagerService { Log.e(TAG, "Wait for STATE_OFF timeout"); } } + if (Flags.systemServerRemoveExtraThreadJump()) { + handleEnable(); + return; + } // Either state is changed to STATE_OFF or reaches the maximum retry, we // should move forward to the next step. mWaitForEnableRetry = 0; @@ -1656,6 +1712,9 @@ class BluetoothManagerService { } private void handleDisableDelayed(boolean disabling) { + if (Flags.systemServerRemoveExtraThreadJump() && disabling) { + return; + } if (!disabling) { // The Bluetooth is turning on, wait for STATE_ON if (!mState.oneOf(STATE_ON)) { @@ -1673,10 +1732,12 @@ class BluetoothManagerService { mWaitForDisableRetry = 0; mEnable = false; onToBleOn(); - // Wait for state exiting STATE_ON - Message disableDelayedMsg = - mHandler.obtainMessage(MESSAGE_HANDLE_DISABLE_DELAYED, 1, 0); - mHandler.sendMessageDelayed(disableDelayedMsg, ENABLE_DISABLE_DELAY_MS); + if (!Flags.systemServerRemoveExtraThreadJump()) { + // Wait for state exiting STATE_ON + Message disableDelayedMsg = + mHandler.obtainMessage(MESSAGE_HANDLE_DISABLE_DELAYED, 1, 0); + mHandler.sendMessageDelayed(disableDelayedMsg, ENABLE_DISABLE_DELAY_MS); + } } else { // The Bluetooth is turning off, wait for exiting STATE_ON if (mState.oneOf(STATE_ON)) { @@ -1837,8 +1898,13 @@ class BluetoothManagerService { } private void sendDisableMsg(int reason, String packageName) { - mHandler.sendEmptyMessage(MESSAGE_DISABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + mHandler.sendEmptyMessage(MESSAGE_DISABLE); + } ActiveLogs.add(reason, false, packageName, false); + if (Flags.systemServerRemoveExtraThreadJump()) { + handleDisableMessage(); + } } private void sendEnableMsg(boolean quietMode, int reason) { @@ -1850,9 +1916,14 @@ class BluetoothManagerService { } private void sendEnableMsg(boolean quietMode, int reason, String packageName, boolean isBle) { - mHandler.obtainMessage(MESSAGE_ENABLE, quietMode ? 1 : 0, isBle ? 1 : 0).sendToTarget(); + if (!Flags.systemServerRemoveExtraThreadJump()) { + mHandler.obtainMessage(MESSAGE_ENABLE, quietMode ? 1 : 0, isBle ? 1 : 0).sendToTarget(); + } ActiveLogs.add(reason, true, packageName, isBle); mLastEnabledTime = SystemClock.elapsedRealtime(); + if (Flags.systemServerRemoveExtraThreadJump()) { + handleEnableMessage(quietMode, isBle); + } } private void addCrashLog() { @@ -2254,33 +2325,34 @@ class BluetoothManagerService { } /** - * In case of a Bluetooth crash, mark it's enabled components as non longer available to - * trigger the PACKAGE_CHANGED intent. This should not be needed in a normal shutdown as the - * Bluetooth clean its components on its own + * In case of a Bluetooth crash, mark it's enabled components as non longer available to trigger + * the PACKAGE_CHANGED intent. This should not be needed in a normal shutdown as the Bluetooth + * clean its components on its own */ private void disableBluetoothComponents(String packageName) { PackageManager pm = mContext.getPackageManager(); PackageInfo packageInfo = null; try { - packageInfo = pm.getPackageInfo( - packageName, - PackageManager.GET_SERVICES | - PackageManager.GET_ACTIVITIES | - PackageManager.GET_RECEIVERS | - PackageManager.GET_PROVIDERS); + packageInfo = + pm.getPackageInfo( + packageName, + PackageManager.GET_SERVICES + | PackageManager.GET_ACTIVITIES + | PackageManager.GET_RECEIVERS + | PackageManager.GET_PROVIDERS); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "Package not found: " + packageName, e); return; } // Refer to updateOppLauncherComponentState() - List<String> baseBluetoothOppActivities = List.of( - "com.android.bluetooth.opp.BluetoothOppLauncherActivity", - "com.android.bluetooth.opp.BluetoothOppBtEnableActivity", - "com.android.bluetooth.opp.BluetoothOppBtEnablingActivity", - "com.android.bluetooth.opp.BluetoothOppBtErrorActivity" - ); + List<String> baseBluetoothOppActivities = + List.of( + "com.android.bluetooth.opp.BluetoothOppLauncherActivity", + "com.android.bluetooth.opp.BluetoothOppBtEnableActivity", + "com.android.bluetooth.opp.BluetoothOppBtEnablingActivity", + "com.android.bluetooth.opp.BluetoothOppBtErrorActivity"); disableComponents(pm, packageInfo.activities, packageName, baseBluetoothOppActivities); disableComponents(pm, packageInfo.services, packageName, null); @@ -2295,17 +2367,20 @@ class BluetoothManagerService { } Arrays.stream(components) - .filter(componentInfo -> !componentInfo.enabled) - .map(componentInfo -> new ComponentName(packageName, componentInfo.name)) - .filter(componentName -> - (componentsToKeep == null || - !componentsToKeep.contains(componentName.getClassName()))) - .forEach(componentName -> { - pm.setComponentEnabledSetting( - componentName, - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, - PackageManager.DONT_KILL_APP); - Log.i(TAG, "Disabled component: " + componentName.flattenToString()); - }); + .filter(componentInfo -> !componentInfo.enabled) + .map(componentInfo -> new ComponentName(packageName, componentInfo.name)) + .filter( + componentName -> + (componentsToKeep == null + || !componentsToKeep.contains( + componentName.getClassName()))) + .forEach( + componentName -> { + pm.setComponentEnabledSetting( + componentName, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP); + Log.i(TAG, "Disabled component: " + componentName.flattenToString()); + }); } } diff --git a/service/tests/Android.bp b/service/tests/Android.bp index 217bd36f70..8bdefcc8ac 100644 --- a/service/tests/Android.bp +++ b/service/tests/Android.bp @@ -26,6 +26,7 @@ android_test { ], static_libs: [ + "androidx.test.espresso.intents", "androidx.test.rules", "flag-junit", "frameworks-base-testutils", diff --git a/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java b/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java index 480af98329..5e2b66ac06 100644 --- a/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java +++ b/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java @@ -22,6 +22,9 @@ import static android.bluetooth.BluetoothAdapter.STATE_ON; import static android.bluetooth.BluetoothAdapter.STATE_TURNING_OFF; import static android.bluetooth.BluetoothAdapter.STATE_TURNING_ON; +import static androidx.test.espresso.intent.matcher.IntentMatchers.hasAction; +import static androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra; + import static com.android.server.bluetooth.BluetoothManagerService.MESSAGE_BLUETOOTH_SERVICE_CONNECTED; import static com.android.server.bluetooth.BluetoothManagerService.MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED; import static com.android.server.bluetooth.BluetoothManagerService.MESSAGE_BLUETOOTH_STATE_CHANGE; @@ -33,6 +36,7 @@ import static com.android.server.bluetooth.BluetoothManagerService.MESSAGE_RESTO import static com.android.server.bluetooth.BluetoothManagerService.MESSAGE_TIMEOUT_BIND; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; @@ -41,13 +45,16 @@ import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.validateMockitoUsage; import static org.mockito.Mockito.verify; import android.annotation.SuppressLint; +import android.app.AppOpsManager; import android.app.PropertyInvalidatedCache; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.IBluetooth; import android.bluetooth.IBluetoothCallback; import android.bluetooth.IBluetoothManager; @@ -55,7 +62,6 @@ import android.bluetooth.IBluetoothManagerCallback; import android.bluetooth.IBluetoothStateChangeCallback; import android.content.ComponentName; import android.content.Context; -import android.content.ContextWrapper; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; @@ -63,21 +69,29 @@ import android.os.Message; import android.os.UserHandle; import android.os.UserManager; import android.os.test.TestLooper; +import android.permission.PermissionManager; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.FlagsParameterization; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import androidx.test.platform.app.InstrumentationRegistry; +import com.android.bluetooth.flags.Flags; + +import org.hamcrest.Matcher; +import org.hamcrest.core.AllOf; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.Spy; +import org.mockito.hamcrest.MockitoHamcrest; import platform.test.runner.parameterized.ParameterizedAndroidJunit4; import platform.test.runner.parameterized.Parameters; @@ -93,7 +107,8 @@ public class BluetoothManagerServiceTest { @Parameters(name = "{0}") public static List<FlagsParameterization> getParams() { - return FlagsParameterization.allCombinationsOf(); + return FlagsParameterization.allCombinationsOf( + Flags.FLAG_SYSTEM_SERVER_REMOVE_EXTRA_THREAD_JUMP); } public BluetoothManagerServiceTest(FlagsParameterization flags) { @@ -103,24 +118,26 @@ public class BluetoothManagerServiceTest { private static final int STATE_BLE_TURNING_ON = 14; // can't find the symbol because hidden api private static final int STATE_BLE_TURNING_OFF = 16; // can't find the symbol because hidden api - BluetoothManagerService mManagerService; - - @Spy - private final Context mContext = - new ContextWrapper(InstrumentationRegistry.getInstrumentation().getTargetContext()); + private final Context mTargetContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); - @Spy BluetoothServerProxy mBluetoothServerProxy; + @Mock BluetoothServerProxy mBluetoothServerProxy; + @Mock Context mContext; @Mock UserManager mUserManager; @Mock UserHandle mUserHandle; - @Mock IBinder mBinder; @Mock IBluetoothManagerCallback mManagerCallback; @Mock IBluetoothStateChangeCallback mStateChangeCallback; - @Mock IBluetooth mAdapterService; @Mock AdapterBinder mAdapterBinder; + @Mock AppOpsManager mAppOpsManager; + @Mock PermissionManager mPermissionManager; + + private int mPersistedState = BluetoothManagerService.BLUETOOTH_OFF; - TestLooper mLooper; + private InOrder mInOrder; + private TestLooper mLooper; + private BluetoothManagerService mManagerService; private static class ServerQuery extends PropertyInvalidatedCache.QueryHandler<IBluetoothManager, Integer> { @@ -146,6 +163,7 @@ public class BluetoothManagerServiceTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); + mInOrder = inOrder(mContext, mManagerCallback, mAdapterBinder); PropertyInvalidatedCache<IBluetoothManager, Integer> testCache = new PropertyInvalidatedCache<>( @@ -163,24 +181,37 @@ public class BluetoothManagerServiceTest { doReturn("00:11:22:33:44:55") .when(mBluetoothServerProxy) .settingsSecureGetString(any(), eq(Settings.Secure.BLUETOOTH_ADDRESS)); - // Set persisted state to BLUETOOTH_OFF to not generate unwanted behavior when starting test - doReturn(BluetoothManagerService.BLUETOOTH_OFF) + doAnswer( + inv -> { + return mPersistedState; + }) .when(mBluetoothServerProxy) .getBluetoothPersistedState(any(), anyInt()); doAnswer( inv -> { - doReturn(inv.getArguments()[1]) - .when(mBluetoothServerProxy) - .getBluetoothPersistedState(any(), anyInt()); + mPersistedState = inv.getArgument(1); return null; }) .when(mBluetoothServerProxy) .setBluetoothPersistedState(any(), anyInt()); - // Test is not allowed to send broadcast as Bluetooth. doNothing Prevent SecurityException - doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any(), any()); + doAnswer( + inv -> { + IBinder.DeathRecipient recipient = inv.getArgument(0); + recipient.binderDied(); + return null; + }) + .when(mBinder) + .linkToDeath(any(), anyInt()); + + doReturn(BluetoothManagerServiceTest.class.getSimpleName()).when(mContext).getPackageName(); + doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt()); + doReturn(mTargetContext.getContentResolver()).when(mContext).getContentResolver(); + doReturn(mTargetContext.getPackageManager()).when(mContext).getPackageManager(); doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); + doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class); + doReturn(mPermissionManager).when(mContext).getSystemService(PermissionManager.class); doReturn(mBinder).when(mManagerCallback).asBinder(); @@ -233,9 +264,13 @@ public class BluetoothManagerServiceTest { IntStream.of(what) .forEach( w -> { + String log = "Expecting message " + w + ": "; + Message msg = mLooper.nextMessage(); - assertThat(msg).isNotNull(); - assertThat(msg.what).isEqualTo(w); + assertWithMessage(log + "but got null").that(msg).isNotNull(); + assertWithMessage(log + "but got " + msg.what) + .that(msg.what) + .isEqualTo(w); msg.getTarget().dispatchMessage(msg); }); } @@ -270,7 +305,9 @@ public class BluetoothManagerServiceTest { // called from SYSTEM user, should try to toggle Bluetooth off mManagerService.onUserRestrictionsChanged(UserHandle.SYSTEM); - syncHandler(MESSAGE_DISABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_DISABLE); + } } @Test @@ -283,8 +320,11 @@ public class BluetoothManagerServiceTest { anyInt(), any(UserHandle.class)); mManagerService.enableBle("enable_bindFailure_removesTimeout", mBinder); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } verify(mContext).unbindService(any()); + mInOrder.verify(mContext).unbindService(any()); // TODO(b/280518177): Failed to start should be noted / reported in metrics // Maybe show a popup or a crash notification @@ -294,7 +334,9 @@ public class BluetoothManagerServiceTest { @Test public void enable_bindTimeout() throws Exception { mManagerService.enableBle("enable_bindTimeout", mBinder); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } mLooper.moveTimeForward(120_000); // 120 seconds syncHandler(MESSAGE_TIMEOUT_BIND); @@ -312,7 +354,7 @@ public class BluetoothManagerServiceTest { ArgumentCaptor<BluetoothManagerService.BluetoothServiceConnection> captor = ArgumentCaptor.forClass(BluetoothManagerService.BluetoothServiceConnection.class); - verify(mContext) + mInOrder.verify(mContext) .bindServiceAsUser( any(Intent.class), captor.capture(), anyInt(), any(UserHandle.class)); assertThat(captor.getAllValues()).hasSize(1); @@ -324,11 +366,10 @@ public class BluetoothManagerServiceTest { return serviceConnection; } - private static IBluetoothCallback captureBluetoothCallback(AdapterBinder adapterBinder) - throws Exception { + private IBluetoothCallback captureBluetoothCallback() throws Exception { ArgumentCaptor<IBluetoothCallback> captor = ArgumentCaptor.forClass(IBluetoothCallback.class); - verify(adapterBinder).registerCallback(captor.capture(), any()); + mInOrder.verify(mAdapterBinder).registerCallback(captor.capture(), any()); assertThat(captor.getAllValues()).hasSize(1); return captor.getValue(); } @@ -337,11 +378,10 @@ public class BluetoothManagerServiceTest { // Binding of IBluetooth acceptBluetoothBinding(); - // TODO(b/280518177): This callback is too early, bt is not ON nor BLE_ON - verify(mManagerCallback).onBluetoothServiceUp(any()); - - IBluetoothCallback btCallback = captureBluetoothCallback(mAdapterBinder); - verify(mAdapterBinder).offToBleOn(anyBoolean(), any()); + IBluetoothCallback btCallback = captureBluetoothCallback(); + mInOrder.verify(mAdapterBinder).offToBleOn(anyBoolean(), any()); + verifyBleStateIntentSent(STATE_OFF, STATE_BLE_TURNING_ON); + mInOrder.verify(mManagerCallback).onBluetoothServiceUp(any()); assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_TURNING_ON); @@ -349,30 +389,30 @@ public class BluetoothManagerServiceTest { // trigger the stateChangeCallback from native btCallback.onBluetoothStateChange(STATE_BLE_TURNING_ON, STATE_BLE_ON); syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); + verifyBleStateIntentSent(STATE_BLE_TURNING_ON, STATE_BLE_ON); return btCallback; } private IBluetoothCallback transition_offToOn() throws Exception { IBluetoothCallback btCallback = transition_offToBleOn(); - verify(mAdapterBinder).bleOnToOn(any()); + mInOrder.verify(mAdapterBinder).bleOnToOn(any()); // AdapterService go to turning_on and start all profile on its own btCallback.onBluetoothStateChange(STATE_BLE_ON, STATE_TURNING_ON); syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); + verifyBleStateIntentSent(STATE_BLE_ON, STATE_TURNING_ON); + verifyStateIntentSent(STATE_OFF, STATE_TURNING_ON); // When all the profile are started, adapterService consider it is ON btCallback.onBluetoothStateChange(STATE_TURNING_ON, STATE_ON); syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); - - // Check that we sent 6 intent, 4 for BLE: BLE_TURNING_ON + BLE_ON + TURNING_ON + ON - // and 2 for classic: TURNING_ON + ON - // TODO(b/280518177): assert the intent are the correct one - verify(mContext, times(6)).sendBroadcastAsUser(any(), any(), any(), any()); + verifyBleStateIntentSent(STATE_TURNING_ON, STATE_ON); + verifyStateIntentSent(STATE_TURNING_ON, STATE_ON); return btCallback; } private void transition_onToBleOn(IBluetoothCallback btCallback) throws Exception { - verify(mAdapterBinder).onToBleOn(any()); + mInOrder.verify(mAdapterBinder).onToBleOn(any()); btCallback.onBluetoothStateChange(STATE_TURNING_OFF, STATE_BLE_ON); syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); @@ -380,7 +420,7 @@ public class BluetoothManagerServiceTest { private void transition_onToOff(IBluetoothCallback btCallback) throws Exception { transition_onToBleOn(btCallback); - verify(mAdapterBinder).bleOnToOff(any()); + mInOrder.verify(mAdapterBinder).bleOnToOff(any()); // When all the profile are started, adapterService consider it is ON btCallback.onBluetoothStateChange(STATE_BLE_TURNING_OFF, STATE_OFF); @@ -390,62 +430,70 @@ public class BluetoothManagerServiceTest { @Test public void enable_whileTurningToBleOn_shouldEnable() throws Exception { mManagerService.enableBle("enable_whileTurningToBleOn_shouldEnable", mBinder); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } acceptBluetoothBinding(); - IBluetoothCallback btCallback = captureBluetoothCallback(mAdapterBinder); + IBluetoothCallback btCallback = captureBluetoothCallback(); assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_TURNING_ON); // receive enable when Bluetooth is in BLE_TURNING_ON mManagerService.enable("enable_whileTurningToBleOn_shouldEnable"); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } btCallback.onBluetoothStateChange(STATE_BLE_TURNING_ON, STATE_BLE_ON); syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); - verify(mAdapterBinder).bleOnToOn(any()); + mInOrder.verify(mAdapterBinder).bleOnToOn(any()); } @Test public void enable_whileNotYetBoundToBle_shouldEnable() throws Exception { mManagerService.enableBle("enable_whileTurningToBleOn_shouldEnable", mBinder); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } assertThat(mManagerService.getState()).isEqualTo(STATE_OFF); // receive enable when Bluetooth is OFF and not yet binded mManagerService.enable("enable_whileTurningToBleOn_shouldEnable"); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } acceptBluetoothBinding(); - IBluetoothCallback btCallback = captureBluetoothCallback(mAdapterBinder); + IBluetoothCallback btCallback = captureBluetoothCallback(); assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_TURNING_ON); btCallback.onBluetoothStateChange(STATE_BLE_TURNING_ON, STATE_BLE_ON); syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); - verify(mAdapterBinder).bleOnToOn(any()); + mInOrder.verify(mAdapterBinder).bleOnToOn(any()); } @Test public void offToBleOn() throws Exception { mManagerService.enableBle("test_offToBleOn", mBinder); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } transition_offToBleOn(); - // Check that we sent 2 intent, one for BLE_TURNING_ON, one for BLE_ON - // TODO(b/280518177): assert the intent are the correct one - verify(mContext, times(2)).sendBroadcastAsUser(any(), any(), any(), any()); - // Check that there was no transition to STATE_ON - verify(mAdapterBinder, times(0)).bleOnToOn(any()); + mInOrder.verify(mAdapterBinder, never()).bleOnToOn(any()); assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_ON); } @Test public void offToOn() throws Exception { mManagerService.enable("test_offToOn"); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } transition_offToOn(); @@ -455,13 +503,15 @@ public class BluetoothManagerServiceTest { @Test public void crash_whileTransitionState_canRecover() throws Exception { mManagerService.enableBle("crash_whileTransitionState_canRecover", mBinder); - syncHandler(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } BluetoothManagerService.BluetoothServiceConnection serviceConnection = acceptBluetoothBinding(); - IBluetoothCallback btCallback = captureBluetoothCallback(mAdapterBinder); - verify(mAdapterBinder).offToBleOn(anyBoolean(), any()); + IBluetoothCallback btCallback = captureBluetoothCallback(); + mInOrder.verify(mAdapterBinder).offToBleOn(anyBoolean(), any()); btCallback.onBluetoothStateChange(STATE_OFF, STATE_BLE_TURNING_ON); syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_TURNING_ON); @@ -484,42 +534,107 @@ public class BluetoothManagerServiceTest { @Test public void disableAirplane_whenNothing_startBluetooth() throws Exception { - doReturn(BluetoothManagerService.BLUETOOTH_ON_BLUETOOTH) - .when(mBluetoothServerProxy) - .getBluetoothPersistedState(any(), anyInt()); + if (!Flags.systemServerRemoveExtraThreadJump()) { + mPersistedState = BluetoothManagerService.BLUETOOTH_ON_BLUETOOTH; + } mManagerService.enable("disableAirplane_whenNothing_startBluetooth"); - discardMessage(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + discardMessage(MESSAGE_ENABLE); + } else { + transition_offToOn(); + } + + assertThat(mLooper.nextMessage()).isNull(); mManagerService.onAirplaneModeChanged(false); - discardMessage(MESSAGE_ENABLE); + if (!Flags.systemServerRemoveExtraThreadJump()) { + discardMessage(MESSAGE_ENABLE); + } } @Test - public void disableAirplane_whenFactoryReset_doesNotStartBluetooth() throws Exception { - doAnswer( - invocation -> { - IBinder.DeathRecipient recipient = invocation.getArgument(0); - recipient.binderDied(); - return null; - }) - .when(mBinder) - .linkToDeath(any(), anyInt()); + @EnableFlags(Flags.FLAG_SYSTEM_SERVER_REMOVE_EXTRA_THREAD_JUMP) + public void disable_whenBinding_bluetoothShouldStop_new() throws Exception { + mManagerService.enable("disable_whenBinding_bluetoothShouldStop_new"); + mInOrder.verify(mContext).bindServiceAsUser(any(), any(), anyInt(), any()); + mManagerService.disable("disable_whenBinding_bluetoothShouldStop_new", true); + mInOrder.verify(mContext).unbindService(any()); + assertThat(mManagerService.getState()).isEqualTo(STATE_OFF); + } - mManagerService.enable("test_offToOn"); + @Test + @EnableFlags(Flags.FLAG_SYSTEM_SERVER_REMOVE_EXTRA_THREAD_JUMP) + public void disable_whenTurningBleOn_bluetoothShouldStop() throws Exception { + mManagerService.enable("disable_whenBinding_bluetoothShouldStop_new"); + acceptBluetoothBinding(); + assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_TURNING_ON); + mManagerService.disable("disable_whenBinding_bluetoothShouldStop_new", true); + mInOrder.verify(mContext).unbindService(any()); + assertThat(mManagerService.getState()).isEqualTo(STATE_OFF); + } + + @Test + @DisableFlags(Flags.FLAG_SYSTEM_SERVER_REMOVE_EXTRA_THREAD_JUMP) + public void disable_whenBinding_bluetoothShouldStop_old() throws Exception { + mManagerService.enable("disable_whenBinding_bluetoothShouldStop_old"); syncHandler(MESSAGE_ENABLE); + mManagerService.disable("disable_whenBinding_bluetoothShouldStop_old", true); + syncHandler(MESSAGE_DISABLE); + + IBluetoothCallback btCallback = transition_offToBleOn(); + assertThat(mManagerService.getState()).isEqualTo(STATE_BLE_TURNING_OFF); + + btCallback.onBluetoothStateChange(STATE_BLE_TURNING_OFF, STATE_OFF); + syncHandler(MESSAGE_BLUETOOTH_STATE_CHANGE); + + mLooper.moveTimeForward(BluetoothManagerService.ENABLE_DISABLE_DELAY_MS); + syncHandler(MESSAGE_DISABLE); + + assertThat(mManagerService.getState()).isEqualTo(STATE_OFF); + } + + @Test + public void disableAirplane_whenFactoryReset_doesNotStartBluetooth() throws Exception { + mManagerService.enable("disableAirplane_whenFactoryReset_doesNotStartBluetooth"); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_ENABLE); + } IBluetoothCallback btCallback = transition_offToOn(); assertThat(mManagerService.getState()).isEqualTo(STATE_ON); mManagerService.mHandler.sendEmptyMessage(MESSAGE_RESTORE_USER_SETTING_OFF); syncHandler(MESSAGE_RESTORE_USER_SETTING_OFF); - syncHandler(MESSAGE_DISABLE); - mLooper.moveTimeForward(BluetoothManagerService.ENABLE_DISABLE_DELAY_MS); - syncHandler(MESSAGE_HANDLE_DISABLE_DELAYED); - mLooper.moveTimeForward(BluetoothManagerService.ENABLE_DISABLE_DELAY_MS); - syncHandler(MESSAGE_HANDLE_DISABLE_DELAYED); + if (!Flags.systemServerRemoveExtraThreadJump()) { + syncHandler(MESSAGE_DISABLE); + mLooper.moveTimeForward(BluetoothManagerService.ENABLE_DISABLE_DELAY_MS); + syncHandler(MESSAGE_HANDLE_DISABLE_DELAYED); + mLooper.moveTimeForward(BluetoothManagerService.ENABLE_DISABLE_DELAY_MS); + syncHandler(MESSAGE_HANDLE_DISABLE_DELAYED); + } transition_onToOff(btCallback); mManagerService.onAirplaneModeChanged(false); assertThat(mLooper.nextMessage()).isNull(); // Must not create a MESSAGE_ENABLE } + + @SafeVarargs + private void verifyIntentSent(Matcher<Intent>... matchers) { + mInOrder.verify(mContext) + .sendBroadcastAsUser( + MockitoHamcrest.argThat(AllOf.allOf(matchers)), any(), any(), any()); + } + + private void verifyBleStateIntentSent(int from, int to) { + verifyIntentSent( + hasAction(BluetoothAdapter.ACTION_BLE_STATE_CHANGED), + hasExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, from), + hasExtra(BluetoothAdapter.EXTRA_STATE, to)); + } + + private void verifyStateIntentSent(int from, int to) { + verifyIntentSent( + hasAction(BluetoothAdapter.ACTION_STATE_CHANGED), + hasExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, from), + hasExtra(BluetoothAdapter.EXTRA_STATE, to)); + } } diff --git a/system/BUILD.gn b/system/BUILD.gn index b86ca5f392..48b6207a60 100644 --- a/system/BUILD.gn +++ b/system/BUILD.gn @@ -76,7 +76,6 @@ config("target_defaults") { "//bt/system", "//bt/flags/exported_include", "//bt/sysprop/exported_include", - "//bt/system/linux_include", "//bt/system/include", "//bt/system/gd", "//bt/system/pdl/hci/include", diff --git a/system/audio_hal_interface/aidl/le_audio_software_aidl.cc b/system/audio_hal_interface/aidl/le_audio_software_aidl.cc index be7cf3a6b2..e0b96475d3 100644 --- a/system/audio_hal_interface/aidl/le_audio_software_aidl.cc +++ b/system/audio_hal_interface/aidl/le_audio_software_aidl.cc @@ -30,6 +30,7 @@ #include "common/strings.h" #include "hal_version_manager.h" #include "le_audio_utils.h" +#include "osi/include/properties.h" namespace bluetooth { namespace audio { @@ -694,6 +695,14 @@ bluetooth::audio::le_audio::OffloadCapabilities get_offload_capabilities() { return {offload_capabilities, broadcast_offload_capabilities}; } +static bool IsUsingCodecExtensibility() { + auto codec_ext_status = + osi_property_get_bool("bluetooth.core.le_audio.codec_extension_aidl.enabled", false); + + log::debug("Using codec extensibility AIDL: {}", codec_ext_status); + return codec_ext_status; +} + AudioConfiguration stream_config_to_hal_audio_config( const ::bluetooth::le_audio::stream_config& offload_config) { LeAudioConfiguration ucast_config = { @@ -726,6 +735,7 @@ AudioConfiguration stream_config_to_hal_audio_config( .blocksPerSdu = static_cast<int8_t>(offload_config.codec_frames_blocks_per_sdu), }; ucast_config.leAudioCodecConfig = LeAudioCodecConfiguration(lc3_config); + ucast_config.codecType = CodecType::LC3; lc3_codec_config_found = true; } @@ -741,14 +751,20 @@ AudioConfiguration stream_config_to_hal_audio_config( BLE_ADDRESS_RANDOM; } - ucast_config.streamMap.push_back({ + LeAudioConfiguration::StreamMap map_entry = { .streamHandle = info.stream_handle, .audioChannelAllocation = static_cast<int32_t>(info.audio_channel_allocation), .isStreamActive = info.is_stream_active, - .aseConfiguration = GetAidlLeAudioAseConfigurationFromStackFormat( - info.codec_config, info.target_latency, info.target_phy, info.metadata), - .bluetoothDeviceAddress = aidl_device_address, - }); + }; + + // Add the additional codec extensibility data fields + if (IsUsingCodecExtensibility()) { + map_entry.aseConfiguration = GetAidlLeAudioAseConfigurationFromStackFormat( + info.codec_config, info.target_latency, info.target_phy, info.metadata); + map_entry.bluetoothDeviceAddress = aidl_device_address; + } + + ucast_config.streamMap.push_back(map_entry); } if (!lc3_codec_config_found) { diff --git a/system/bta/Android.bp b/system/bta/Android.bp index 52d34d59cc..5a8f721ebd 100644 --- a/system/bta/Android.bp +++ b/system/bta/Android.bp @@ -231,6 +231,7 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackA2dp", ":TestMockStackAcl", @@ -243,7 +244,6 @@ cc_test { ":TestMockStackGatt", ":TestMockStackHid", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackPan", ":TestMockStackRfcomm", ":TestMockStackRnr", @@ -339,10 +339,10 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", "test/gatt/database_builder_sample_device_test.cc", "test/gatt/database_builder_test.cc", "test/gatt/database_test.cc", diff --git a/system/bta/BUILD.gn b/system/bta/BUILD.gn index 9c28016617..f621539151 100644 --- a/system/bta/BUILD.gn +++ b/system/bta/BUILD.gn @@ -143,7 +143,6 @@ static_library("bta") { "sys", "//bt/system/", "//bt/system/include", - "//bt/system/linux_include", "//bt/system/bta", "//bt/system/bta/aics/include", "//bt/system/gd", diff --git a/system/bta/le_audio/broadcaster/broadcaster_test.cc b/system/bta/le_audio/broadcaster/broadcaster_test.cc index a211a810ad..16177230d1 100644 --- a/system/bta/le_audio/broadcaster/broadcaster_test.cc +++ b/system/bta/le_audio/broadcaster/broadcaster_test.cc @@ -63,6 +63,8 @@ using testing::Test; using namespace bluetooth::le_audio; using namespace bluetooth; +using bluetooth::hci::testing::mock_controller_; + using bluetooth::le_audio::DsaMode; using bluetooth::le_audio::LeAudioCodecConfiguration; using bluetooth::le_audio::LeAudioSourceAudioHalClient; @@ -287,8 +289,8 @@ protected: init_message_loop_thread(); reset_mock_function_count_map(); - bluetooth::hci::testing::mock_controller_ = &mock_controller_; - ON_CALL(mock_controller_, SupportsBleIsochronousBroadcaster).WillByDefault(Return(true)); + mock_controller_ = std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*mock_controller_, SupportsBleIsochronousBroadcaster).WillByDefault(Return(true)); iso_manager_ = bluetooth::hci::IsoManager::GetInstance(); ASSERT_NE(iso_manager_, nullptr); @@ -366,7 +368,7 @@ protected: ContentControlIdKeeper::GetInstance()->Stop(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.release(); delete mock_audio_source_; iso_active_callback = nullptr; delete mock_audio_source_; @@ -436,7 +438,6 @@ protected: protected: MockLeAudioBroadcasterCallbacks mock_broadcaster_callbacks_; - bluetooth::hci::testing::MockControllerInterface mock_controller_; bluetooth::hci::IsoManager* iso_manager_; MockIsoManager* mock_iso_manager_; bluetooth::hci::iso_manager::BigCallbacks* big_callbacks_ = nullptr; diff --git a/system/bta/le_audio/codec_manager.cc b/system/bta/le_audio/codec_manager.cc index 9452218c5d..104d397833 100644 --- a/system/bta/le_audio/codec_manager.cc +++ b/system/bta/le_audio/codec_manager.cc @@ -733,11 +733,11 @@ public: bool AppendStreamMapExtension(const std::vector<struct types::cis>& cises, const stream_parameters& stream_params, uint8_t direction) { - // In the legacy mode we are already done - if (!IsUsingCodecExtensibility()) { - log::verbose("Codec Extensibility is disabled"); - return true; - } + /* Without the codec extensibility enabled, we still need the BT stack structure to + * have the valid extended codec configuration entries, as these are used for codec type + * matching. The extended data fields of the AIDL API data structures are filed + * right before the AIDL call, only if the codec extensibility is enabled + */ const std::string tag = types::BidirectionalPair<std::string>({.sink = "Sink", .source = "Source"}) diff --git a/system/bta/le_audio/codec_manager_test.cc b/system/bta/le_audio/codec_manager_test.cc index b8f79a609b..c69464b72e 100644 --- a/system/bta/le_audio/codec_manager_test.cc +++ b/system/bta/le_audio/codec_manager_test.cc @@ -300,10 +300,12 @@ public: bluetooth::legacy::hci::testing::SetMock(legacy_hci_mock_); - ON_CALL(controller_interface, SupportsBleIsochronousBroadcaster).WillByDefault(Return(true)); - ON_CALL(controller_interface, IsSupported(OpCode::CONFIGURE_DATA_PATH)) + bluetooth::hci::testing::mock_controller_ = + std::make_unique<NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsBleIsochronousBroadcaster) + .WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, IsSupported(OpCode::CONFIGURE_DATA_PATH)) .WillByDefault(Return(true)); - bluetooth::hci::testing::mock_controller_ = &controller_interface; codec_manager = CodecManager::GetInstance(); @@ -311,9 +313,11 @@ public: RegisterSinkHalClientMock(); } - virtual void TearDown() override { codec_manager->Stop(); } + virtual void TearDown() override { + codec_manager->Stop(); + bluetooth::hci::testing::mock_controller_.release(); + } - NiceMock<bluetooth::hci::testing::MockControllerInterface> controller_interface; CodecManager* codec_manager; bluetooth::legacy::hci::testing::MockInterface legacy_hci_mock_; @@ -559,15 +563,16 @@ TEST_F(CodecManagerTestAdsp, testStreamConfigurationMono) { }; // Stream parameters + auto stream_map_entry_mono_bidir = + stream_map_info(97, codec_spec_conf::kLeAudioLocationMonoAudio, true); + stream_map_entry_mono_bidir.codec_config.id = kLeAudioCodecIdLc3; types::BidirectionalPair<stream_parameters> stream_params{ .sink = { .audio_channel_allocation = codec_spec_conf::kLeAudioLocationMonoAudio, .stream_config = { - .stream_map = {stream_map_info( - 97, codec_spec_conf::kLeAudioLocationMonoAudio, - true)}, + .stream_map = {stream_map_entry_mono_bidir}, .bits_per_sample = 16, .sampling_frequency_hz = 16000, .frame_duration_us = 10000, @@ -583,9 +588,7 @@ TEST_F(CodecManagerTestAdsp, testStreamConfigurationMono) { .audio_channel_allocation = codec_spec_conf::kLeAudioLocationMonoAudio, .stream_config = { - .stream_map = {stream_map_info( - 97, codec_spec_conf::kLeAudioLocationMonoAudio, - true)}, + .stream_map = {stream_map_entry_mono_bidir}, .bits_per_sample = 16, .sampling_frequency_hz = 16000, .frame_duration_us = 10000, @@ -628,6 +631,7 @@ TEST_F(CodecManagerTestAdsp, testStreamConfigurationMono) { ASSERT_EQ(codec_spec_conf::kLeAudioLocationMonoAudio, info.audio_channel_allocation); // The connected should be active ASSERT_TRUE(info.is_stream_active); + ASSERT_EQ(info.codec_config.id.coding_format, kLeAudioCodecIdLc3.coding_format); } else { ASSERT_EQ(97, info.stream_handle); diff --git a/system/bta/le_audio/devices_test.cc b/system/bta/le_audio/devices_test.cc index adc90e5213..cd711065c4 100644 --- a/system/bta/le_audio/devices_test.cc +++ b/system/bta/le_audio/devices_test.cc @@ -514,7 +514,9 @@ protected: desired_group_size_ = -1; bluetooth::manager::SetMockBtmInterface(&btm_interface_); - bluetooth::hci::testing::mock_controller_ = &controller_interface_; + + bluetooth::hci::testing::mock_controller_ = + std::make_unique<NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); auto codec_location = ::bluetooth::le_audio::types::CodecLocation::HOST; bluetooth::le_audio::AudioSetConfigurationProvider::Initialize(codec_location); @@ -740,6 +742,8 @@ protected: if (codec_manager_) { codec_manager_->Stop(); } + + bluetooth::hci::testing::mock_controller_.reset(); } LeAudioDevice* AddTestDevice(int snk_ase_num, int src_ase_num, int snk_ase_num_cached = 0, @@ -1417,7 +1421,6 @@ protected: LeAudioDeviceGroup* group_ = nullptr; bluetooth::manager::MockBtmInterface btm_interface_; MockCsisClient mock_csis_client_module_; - NiceMock<bluetooth::hci::testing::MockControllerInterface> controller_interface_; bluetooth::le_audio::CodecManager* codec_manager_; MockCodecManager* mock_codec_manager_; diff --git a/system/bta/le_audio/le_audio_client_test.cc b/system/bta/le_audio/le_audio_client_test.cc index a3c52dc9e6..02104518d2 100644 --- a/system/bta/le_audio/le_audio_client_test.cc +++ b/system/bta/le_audio/le_audio_client_test.cc @@ -1477,11 +1477,13 @@ protected: init_message_loop_thread(); reset_mock_function_count_map(); - ON_CALL(controller_, SupportsBleConnectedIsochronousStreamCentral).WillByDefault(Return(true)); - ON_CALL(controller_, SupportsBleConnectedIsochronousStreamPeripheral) + hci::testing::mock_controller_ = + std::make_unique<NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); + ON_CALL(*hci::testing::mock_controller_, SupportsBleConnectedIsochronousStreamCentral) .WillByDefault(Return(true)); - ON_CALL(controller_, SupportsBle2mPhy).WillByDefault(Return(true)); - bluetooth::hci::testing::mock_controller_ = &controller_; + ON_CALL(*hci::testing::mock_controller_, SupportsBleConnectedIsochronousStreamPeripheral) + .WillByDefault(Return(true)); + ON_CALL(*hci::testing::mock_controller_, SupportsBle2mPhy).WillByDefault(Return(true)); bluetooth::manager::SetMockBtmInterface(&mock_btm_interface_); gatt::SetMockBtaGattInterface(&mock_gatt_interface_); gatt::SetMockBtaGattQueue(&mock_gatt_queue_); @@ -1595,7 +1597,7 @@ protected: } iso_manager_->Stop(); - bluetooth::hci::testing::mock_controller_ = nullptr; + hci::testing::mock_controller_.reset(); } protected: @@ -2761,7 +2763,6 @@ protected: /* Audio track metadata */ char* test_tags_ptr_ = nullptr; - NiceMock<bluetooth::hci::testing::MockControllerInterface> controller_; }; class UnicastTest : public UnicastTestNoInit { diff --git a/system/bta/le_audio/state_machine_test.cc b/system/bta/le_audio/state_machine_test.cc index d17bfda188..e0860515fb 100644 --- a/system/bta/le_audio/state_machine_test.cc +++ b/system/bta/le_audio/state_machine_test.cc @@ -261,7 +261,9 @@ protected: bluetooth::manager::SetMockBtmInterface(&btm_interface); gatt::SetMockBtaGattInterface(&gatt_interface); gatt::SetMockBtaGattQueue(&gatt_queue); - bluetooth::hci::testing::mock_controller_ = &controller_; + + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); overwrite_cis_status_idx_ = 0; use_cis_retry_cnt_ = false; @@ -649,7 +651,7 @@ protected: cached_remote_qos_configuration_for_ase_.clear(); LeAudioGroupStateMachine::Cleanup(); ::bluetooth::le_audio::AudioSetConfigurationProvider::Cleanup(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.release(); } std::shared_ptr<LeAudioDevice> PrepareConnectedDevice(uint8_t id, @@ -1714,7 +1716,6 @@ protected: std::vector<RawAddress> addresses_; std::map<uint8_t, std::unique_ptr<LeAudioDeviceGroup>> le_audio_device_groups_; bool group_create_command_disallowed_ = false; - bluetooth::hci::testing::MockControllerInterface controller_; }; class StateMachineTest : public StateMachineTestBase { diff --git a/system/bta/test/bta_ag_sco_test.cc b/system/bta/test/bta_ag_sco_test.cc index 16caac7665..a90198c54a 100644 --- a/system/bta/test/bta_ag_sco_test.cc +++ b/system/bta/test/bta_ag_sco_test.cc @@ -43,14 +43,14 @@ protected: this->codec = codec; return enh_esco_params_t{}; }; - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); } void TearDown() override { test::mock::device_esco_parameters::esco_parameters_for_codec = {}; - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } esco_codec_t codec; - bluetooth::hci::testing::MockControllerInterface controller_; }; TEST_P(BtaAgScoParameterSelectionTest, create_sco_cvsd) { diff --git a/system/bta/test/bta_ag_test.cc b/system/bta/test/bta_ag_test.cc index 5fa3884669..2114f7e773 100644 --- a/system/bta/test/bta_ag_test.cc +++ b/system/bta/test/bta_ag_test.cc @@ -65,7 +65,8 @@ protected: void SetUp() override { reset_mock_function_count_map(); fake_osi_ = std::make_unique<test::fake::FakeOsi>(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); main_thread_start_up(); post_on_bt_main([]() { log::info("Main thread started up"); }); @@ -85,7 +86,7 @@ protected: bta_sys_deregister(BTA_ID_AG); post_on_bt_main([]() { log::info("Main thread shutting down"); }); main_thread_shut_down(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } std::unique_ptr<test::fake::FakeOsi> fake_osi_; @@ -93,7 +94,6 @@ protected: uint32_t tmp_num = 0xFFFF; RawAddress addr; esco_codec_t codec; - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtaAgSwbTest : public BtaAgTest { diff --git a/system/bta/test/bta_dm_test.cc b/system/bta/test/bta_dm_test.cc index 90d41d5e6f..b49008b739 100644 --- a/system/bta/test/bta_dm_test.cc +++ b/system/bta/test/bta_dm_test.cc @@ -65,10 +65,10 @@ class BtaDmTest : public BtaWithContextTest { protected: void SetUp() override { BtaWithContextTest::SetUp(); - ON_CALL(controller_, LeRand).WillByDefault([](bluetooth::hci::LeRandCallback cb) { - cb(0x1234); - }); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, LeRand) + .WillByDefault([](bluetooth::hci::LeRandCallback cb) { cb(0x1234); }); BTA_dm_init(); bluetooth::legacy::testing::bta_dm_init_cb(); @@ -82,9 +82,8 @@ protected: void TearDown() override { bluetooth::legacy::testing::bta_dm_deinit_cb(); BtaWithContextTest::TearDown(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtaDmCustomAlarmTest : public BtaDmTest { diff --git a/system/bta/test/bta_sdp_test.cc b/system/bta/test/bta_sdp_test.cc index 06e8ff86aa..77f1762cc0 100644 --- a/system/bta/test/bta_sdp_test.cc +++ b/system/bta/test/bta_sdp_test.cc @@ -30,17 +30,16 @@ class BtaSdpTest : public BtaWithHwOnTest { protected: void SetUp() override { BtaWithHwOnTest::SetUp(); - ON_CALL(controller_, LeRand).WillByDefault([](bluetooth::hci::LeRandCallback cb) { - cb(0x1234); - }); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, LeRand) + .WillByDefault([](bluetooth::hci::LeRandCallback cb) { cb(0x1234); }); } void TearDown() override { BtaWithHwOnTest::TearDown(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtaSdpRegisteredTest : public BtaSdpTest { diff --git a/system/bta/test/bta_test_fixtures.h b/system/bta/test/bta_test_fixtures.h index c259d0b916..e41e64d496 100644 --- a/system/bta/test/bta_test_fixtures.h +++ b/system/bta/test/bta_test_fixtures.h @@ -60,7 +60,8 @@ protected: ASSERT_NE(get_btm_client_interface().lifecycle.btm_init, nullptr); ASSERT_NE(get_btm_client_interface().lifecycle.btm_free, nullptr); - bluetooth::hci::testing::mock_controller_ = &mock_controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); bluetooth::testing::stack::rnr::set_interface(&mock_stack_rnr_interface_); test::mock::stack_gatt_api::GATT_Register.body = @@ -85,12 +86,11 @@ protected: mock_btm_client_interface.eir.BTM_WriteEIR = {}; bluetooth::testing::stack::rnr::reset_interface(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); BtaWithFakesTest::TearDown(); } - bluetooth::hci::testing::MockControllerInterface mock_controller_; bluetooth::testing::stack::rnr::Mock mock_stack_rnr_interface_; }; diff --git a/system/btif/Android.bp b/system/btif/Android.bp index 0eb097dca7..82544f36ba 100644 --- a/system/btif/Android.bp +++ b/system/btif/Android.bp @@ -122,7 +122,6 @@ cc_library_static { "src/btif_keystore.cc", "src/btif_le_audio.cc", "src/btif_le_audio_broadcaster.cc", - "src/btif_metrics_logging.cc", "src/btif_pan.cc", "src/btif_profile_queue.cc", "src/btif_profile_queue.cc", diff --git a/system/btif/BUILD.gn b/system/btif/BUILD.gn index ea6a0f6fbc..9def60989b 100644 --- a/system/btif/BUILD.gn +++ b/system/btif/BUILD.gn @@ -64,7 +64,6 @@ static_library("btif") { "src/btif_jni_task.cc", "src/btif_keystore.cc", "src/btif_le_audio.cc", - "src/btif_metrics_logging.cc", "src/btif_pan.cc", "src/btif_profile_queue.cc", "src/btif_profile_storage.cc", diff --git a/system/btif/include/btif_metrics_logging.h b/system/btif/include/btif_metrics_logging.h deleted file mode 100644 index 94f7a66b79..0000000000 --- a/system/btif/include/btif_metrics_logging.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "main/shim/metric_id_api.h" -#include "types/raw_address.h" - -void log_a2dp_audio_underrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes); - -void log_a2dp_audio_overrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes); - -void log_a2dp_playback_event(const RawAddress& address, int playback_state, int audio_coding_mode); - -void log_a2dp_session_metrics_event(const RawAddress& address, int64_t audio_duration_ms, - int media_timer_min_ms, int media_timer_max_ms, - int media_timer_avg_ms, int total_scheduling_count, - int buffer_overruns_max_count, int buffer_overruns_total, - float buffer_underruns_average, int buffer_underruns_count, - int64_t codec_index, bool is_a2dp_offload); - -void log_read_rssi_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi); - -void log_read_failed_contact_counter_result(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter); - -void log_read_tx_power_level_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level); - -void log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum key, int64_t value); - -void log_socket_connection_state(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role, - uint64_t connection_duration_ms, - android::bluetooth::SocketErrorEnum error_code, - bool is_hardware_offload); - -bool init_metric_id_allocator(const std::unordered_map<RawAddress, int>& paired_device_map, - bluetooth::shim::CallbackLegacy save_id_callback, - bluetooth::shim::CallbackLegacy forget_device_callback); - -bool close_metric_id_allocator(); - -int allocate_metric_id_from_metric_id_allocator(const RawAddress&); - -int save_metric_id_from_metric_id_allocator(const RawAddress&); - -void forget_device_from_metric_id_allocator(const RawAddress&); - -bool is_valid_id_from_metric_id_allocator(const int id); diff --git a/system/btif/src/bluetooth.cc b/system/btif/src/bluetooth.cc index 5741b05c4f..9badbc9ab6 100644 --- a/system/btif/src/bluetooth.cc +++ b/system/btif/src/bluetooth.cc @@ -71,7 +71,6 @@ #include "btif/include/btif_hh.h" #include "btif/include/btif_keystore.h" #include "btif/include/btif_le_audio.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_pan.h" #include "btif/include/btif_profile_storage.h" #include "btif/include/btif_rc.h" @@ -99,6 +98,7 @@ #include "hardware/bt_vc.h" #include "internal_include/bt_target.h" #include "main/shim/dumpsys.h" +#include "main/shim/metric_id_api.h" #include "os/parameter_provider.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" @@ -1099,7 +1099,7 @@ static std::string obfuscate_address(const RawAddress& address) { } static int get_metric_id(const RawAddress& address) { - return allocate_metric_id_from_metric_id_allocator(address); + return bluetooth::shim::AllocateIdFromMetricIdAllocator(address); } static int set_dynamic_audio_buffer_size(int codec, int size) { diff --git a/system/btif/src/btif_a2dp_source.cc b/system/btif/src/btif_a2dp_source.cc index cf7b7f1957..20805a92bd 100644 --- a/system/btif/src/btif_a2dp_source.cc +++ b/system/btif/src/btif_a2dp_source.cc @@ -46,13 +46,13 @@ #include "btif_av_co.h" #include "btif_common.h" #include "btif_hf.h" -#include "btif_metrics_logging.h" #include "btm_iso_api.h" #include "common/message_loop_thread.h" #include "common/metrics.h" #include "common/repeating_timer.h" #include "common/time_util.h" #include "hardware/bt_av.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/fixed_queue.h" #include "osi/include/wakelock.h" @@ -253,8 +253,6 @@ static bool btif_a2dp_source_startup(void); static void btif_a2dp_source_startup_delayed(void); static void btif_a2dp_source_start_session_delayed(const RawAddress& peer_address, std::promise<void> start_session_promise); -static void btif_a2dp_source_end_session_delayed(const RawAddress& peer_address); -static void btif_a2dp_source_shutdown_delayed(std::promise<void>); static void btif_a2dp_source_audio_tx_start_event(void); static void btif_a2dp_source_audio_tx_stop_event(void); static void btif_a2dp_source_audio_tx_flush_event(void); @@ -262,7 +260,6 @@ static void btif_a2dp_source_audio_tx_flush_event(void); // The peer address is |peer_addr|. // This function should be called prior to starting A2DP streaming. static void btif_a2dp_source_setup_codec(const RawAddress& peer_addr); -static void btif_a2dp_source_cleanup_codec(); static void btif_a2dp_source_cleanup_codec_delayed(); static void btif_a2dp_source_encoder_user_config_update_event( const RawAddress& peer_address, @@ -496,7 +493,7 @@ bool btif_a2dp_source_restart_session(const RawAddress& old_peer_address, log::assert_that(!new_peer_address.IsEmpty(), "assert failed: !new_peer_address.IsEmpty()"); - // Must stop first the audio streaming + // Must stop first the audio streaming. btif_a2dp_source_stop_audio_req(); // If the old active peer was valid, end the old session. @@ -516,22 +513,24 @@ bool btif_a2dp_source_restart_session(const RawAddress& old_peer_address, bool btif_a2dp_source_end_session(const RawAddress& peer_address) { log::info("peer_address={} state={}", peer_address, btif_a2dp_source_cb.StateStr()); - btif_a2dp_source_cleanup_codec(); - btif_a2dp_source_end_session_delayed(peer_address); - return true; -} -static void btif_a2dp_source_end_session_delayed(const RawAddress& peer_address) { - log::info("peer_address={} state={}", peer_address, btif_a2dp_source_cb.StateStr()); + // Must stop first the audio streaming. + btif_a2dp_source_stop_audio_req(); + + do_in_main_thread(base::BindOnce(&btif_a2dp_source_cleanup_codec_delayed)); + if ((btif_a2dp_source_cb.State() == BtifA2dpSource::kStateRunning) || (btif_a2dp_source_cb.State() == BtifA2dpSource::kStateShuttingDown)) { btif_av_stream_stop(peer_address); } else { log::error("A2DP Source media task is not running"); } + if (bluetooth::audio::a2dp::is_hal_enabled()) { bluetooth::audio::a2dp::end_session(); } + + return true; } void btif_a2dp_source_allow_low_latency_audio(bool allowed) { @@ -549,16 +548,10 @@ void btif_a2dp_source_shutdown(std::promise<void> shutdown_complete_promise) { return; } - /* Make sure no channels are restarted while shutting down */ + // Make sure no channels are restarted while shutting down. btif_a2dp_source_cb.SetState(BtifA2dpSource::kStateShuttingDown); - btif_a2dp_source_shutdown_delayed(std::move(shutdown_complete_promise)); -} - -static void btif_a2dp_source_shutdown_delayed(std::promise<void> shutdown_complete_promise) { - log::info("state={}", btif_a2dp_source_cb.StateStr()); - - // Stop the timer + // Stop the timer. btif_a2dp_source_cb.media_alarm.CancelAndWait(); wakelock_release(); @@ -658,13 +651,6 @@ static void btif_a2dp_source_setup_codec(const RawAddress& peer_address) { } } -static void btif_a2dp_source_cleanup_codec() { - log::info("state={}", btif_a2dp_source_cb.StateStr()); - // Must stop media task first before cleaning up the encoder - btif_a2dp_source_stop_audio_req(); - do_in_main_thread(base::BindOnce(&btif_a2dp_source_cleanup_codec_delayed)); -} - static void btif_a2dp_source_cleanup_codec_delayed() { log::info("state={}", btif_a2dp_source_cb.StateStr()); if (btif_a2dp_source_cb.encoder_interface != nullptr) { @@ -945,8 +931,9 @@ static uint32_t btif_a2dp_source_read_callback(uint8_t* p_buf, uint32_t len) { btif_a2dp_source_cb.stats.media_read_total_underflow_count++; btif_a2dp_source_cb.stats.media_read_last_underflow_us = bluetooth::common::time_get_os_boottime_us(); - log_a2dp_audio_underrun_event(btif_av_source_active_peer(), - btif_a2dp_source_cb.encoder_interval_ms, len - bytes_read); + bluetooth::shim::LogMetricA2dpAudioUnderrunEvent(btif_av_source_active_peer(), + btif_a2dp_source_cb.encoder_interval_ms, + len - bytes_read); } return bytes_read; @@ -998,9 +985,9 @@ static bool btif_a2dp_source_enqueue_callback(BT_HDR* p_buf, size_t frames_n, osi_free(p_data); } } - log_a2dp_audio_overrun_event(btif_av_source_active_peer(), - btif_a2dp_source_cb.encoder_interval_ms, drop_n, - num_dropped_encoded_frames, num_dropped_encoded_bytes); + bluetooth::shim::LogMetricA2dpAudioOverrunEvent( + btif_av_source_active_peer(), btif_a2dp_source_cb.encoder_interval_ms, drop_n, + num_dropped_encoded_frames, num_dropped_encoded_bytes); // Request additional debug info if we had to flush buffers RawAddress peer_bda = btif_av_source_active_peer(); @@ -1290,12 +1277,12 @@ static void btif_a2dp_source_update_metrics(void) { } if (metrics.audio_duration_ms != -1) { - log_a2dp_session_metrics_event(btif_av_source_active_peer(), metrics.audio_duration_ms, - metrics.media_timer_min_ms, metrics.media_timer_max_ms, - metrics.media_timer_avg_ms, metrics.total_scheduling_count, - metrics.buffer_overruns_max_count, metrics.buffer_overruns_total, - metrics.buffer_underruns_average, metrics.buffer_underruns_count, - metrics.codec_index, metrics.is_a2dp_offload); + bluetooth::shim::LogMetricA2dpSessionMetricsEvent( + btif_av_source_active_peer(), metrics.audio_duration_ms, metrics.media_timer_min_ms, + metrics.media_timer_max_ms, metrics.media_timer_avg_ms, metrics.total_scheduling_count, + metrics.buffer_overruns_max_count, metrics.buffer_overruns_total, + metrics.buffer_underruns_average, metrics.buffer_underruns_count, metrics.codec_index, + metrics.is_a2dp_offload); } } @@ -1315,8 +1302,9 @@ static void btm_read_rssi_cb(void* data) { return; } - log_read_rssi_result(result->rem_bda, bluetooth::common::kUnknownConnectionHandle, - result->hci_status, result->rssi); + bluetooth::shim::LogMetricReadRssiResult(result->rem_bda, + bluetooth::common::kUnknownConnectionHandle, + result->hci_status, result->rssi); log::warn("device: {}, rssi: {}", result->rem_bda, result->rssi); } @@ -1332,9 +1320,9 @@ static void btm_read_failed_contact_counter_cb(void* data) { log::error("unable to read Failed Contact Counter (status {})", result->status); return; } - log_read_failed_contact_counter_result(result->rem_bda, - bluetooth::common::kUnknownConnectionHandle, - result->hci_status, result->failed_contact_counter); + bluetooth::shim::LogMetricReadFailedContactCounterResult( + result->rem_bda, bluetooth::common::kUnknownConnectionHandle, result->hci_status, + result->failed_contact_counter); log::warn("device: {}, Failed Contact Counter: {}", result->rem_bda, result->failed_contact_counter); @@ -1351,8 +1339,9 @@ static void btm_read_tx_power_cb(void* data) { log::error("unable to read Tx Power (status {})", result->status); return; } - log_read_tx_power_level_result(result->rem_bda, bluetooth::common::kUnknownConnectionHandle, - result->hci_status, result->tx_power); + bluetooth::shim::LogMetricReadTxPowerLevelResult(result->rem_bda, + bluetooth::common::kUnknownConnectionHandle, + result->hci_status, result->tx_power); log::warn("device: {}, Tx Power: {}", result->rem_bda, result->tx_power); } diff --git a/system/btif/src/btif_av.cc b/system/btif/src/btif_av.cc index 101ebcc4a0..2ee3be4c88 100644 --- a/system/btif/src/btif_av.cc +++ b/system/btif/src/btif_av.cc @@ -52,18 +52,17 @@ #include "btif/include/btif_a2dp_source.h" #include "btif/include/btif_av_co.h" #include "btif/include/btif_common.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_profile_queue.h" #include "btif/include/btif_rc.h" #include "btif/include/btif_util.h" #include "btif/include/stack_manager_t.h" -#include "btif_metrics_logging.h" #include "common/state_machine.h" #include "device/include/device_iot_conf_defs.h" #include "device/include/device_iot_config.h" #include "hardware/bluetooth.h" #include "hardware/bt_av.h" #include "include/hardware/bt_rc.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "osi/include/properties.h" @@ -1985,7 +1984,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data // incoming/outgoing connect/disconnect requests. log::warn("Peer {} : event={}: transitioning to Idle due to ACL Disconnect", peer_.PeerAddress(), BtifAvEvent::EventName(event)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_ACL_DISCONNECTED, 1); btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED, bt_status_t::BT_STATUS_FAIL, BTA_AV_FAIL, @@ -1998,7 +1997,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data case BTA_AV_REJECT_EVT: log::warn("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event), peer_.FlagsToString()); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_REJECT_EVT, 1); btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED, bt_status_t::BT_STATUS_AUTH_REJECTED, BTA_AV_FAIL, @@ -2080,7 +2079,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_CONNECTED, bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_SUCCESS, 1); } else { if (btif_rc_is_connected_peer(peer_.PeerAddress())) { @@ -2099,7 +2098,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED, bt_status_t::BT_STATUS_FAIL, status, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_FAILURE, 1); } @@ -2139,8 +2138,8 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data "Peer {} : event={} : device is already connecting, ignore Connect " "request", peer_.PeerAddress(), BtifAvEvent::EventName(event)); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, 1); btif_queue_advance(); } break; @@ -2151,15 +2150,15 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data "Peer {} : event={} : device is already connecting, ignore incoming " "request", peer_.PeerAddress(), BtifAvEvent::EventName(event)); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, 1); } break; case BTIF_AV_OFFLOAD_START_REQ_EVT: log::error("Peer {} : event={}: stream is not Opened", peer_.PeerAddress(), BtifAvEvent::EventName(event)); btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_OFFLOAD_START_REQ_FAILURE, 1); break; @@ -2169,8 +2168,8 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data bt_status_t::BT_STATUS_FAIL, BTA_AV_FAIL, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_CLOSE, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_CLOSE, 1); DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT); if (peer_.SelfInitiatedConnection()) { btif_queue_advance(); @@ -2184,7 +2183,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle); DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_DISCONNECTED, 1); if (peer_.SelfInitiatedConnection()) { btif_queue_advance(); @@ -2203,7 +2202,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data CHECK_RC_EVENT(event, reinterpret_cast<tBTA_AV*>(p_data)); default: - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_UNKNOWN_EVENT, 1); log::warn("Peer {} : Unhandled event={}", peer_.PeerAddress(), BtifAvEvent::EventName(event)); return false; @@ -2933,7 +2932,7 @@ static void btif_report_audio_state(const RawAddress& peer_address, btav_audio_s ? AudioCodingModeEnum::AUDIO_CODING_MODE_HARDWARE : AudioCodingModeEnum::AUDIO_CODING_MODE_SOFTWARE; - log_a2dp_playback_event(peer_address, playback_state, audio_coding_mode); + bluetooth::shim::LogMetricA2dpPlaybackEvent(peer_address, playback_state, audio_coding_mode); } void btif_av_report_source_codec_state( diff --git a/system/btif/src/btif_config.cc b/system/btif/src/btif_config.cc index 2ee8fe494d..9a0e50dea1 100644 --- a/system/btif/src/btif_config.cc +++ b/system/btif/src/btif_config.cc @@ -32,9 +32,10 @@ #include <unordered_map> #include "btif_keystore.h" -#include "btif_metrics_logging.h" #include "common/address_obfuscator.h" #include "main/shim/config.h" +#include "main/shim/metric_id_api.h" +#include "main/shim/metrics_api.h" #include "main/shim/shim.h" #include "storage/config_keys.h" #include "types/raw_address.h" @@ -111,7 +112,7 @@ static void init_metric_id_allocator() { // there is one metric id under this mac_address int id = 0; btif_config_get_int(addr_str, BTIF_STORAGE_KEY_METRICS_ID_KEY, &id); - if (is_valid_id_from_metric_id_allocator(id)) { + if (bluetooth::shim::IsValidIdFromMetricIdAllocator(id)) { paired_device_map[mac_address] = id; is_valid_id_found = true; } @@ -128,15 +129,15 @@ static void init_metric_id_allocator() { auto forget_device_callback = [](const RawAddress& address, const int /* id */) { return btif_config_remove(address.ToString(), BTIF_STORAGE_KEY_METRICS_ID_KEY); }; - if (!init_metric_id_allocator(paired_device_map, std::move(save_device_callback), - std::move(forget_device_callback))) { + if (!bluetooth::shim::InitMetricIdAllocator(paired_device_map, std::move(save_device_callback), + std::move(forget_device_callback))) { log::fatal("Failed to initialize MetricIdAllocator"); } // Add device_without_id for (auto& address : addresses_without_id) { - allocate_metric_id_from_metric_id_allocator(address); - save_metric_id_from_metric_id_allocator(address); + bluetooth::shim::AllocateIdFromMetricIdAllocator(address); + bluetooth::shim::SaveDeviceOnMetricIdAllocator(address); } } @@ -160,7 +161,7 @@ static future_t* clean_up(void) { "assert failed: bluetooth::shim::is_gd_stack_started_up()"); // GD storage module cleanup by itself std::unique_lock<std::recursive_mutex> lock(config_lock); - close_metric_id_allocator(); + bluetooth::shim::CloseMetricIdAllocator(); return future_new_immediate(FUTURE_SUCCESS); } diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc index 96ed5848b1..44b876af4e 100644 --- a/system/btif/src/btif_dm.cc +++ b/system/btif/src/btif_dm.cc @@ -57,7 +57,6 @@ #include "btif_api.h" #include "btif_bqr.h" #include "btif_config.h" -#include "btif_metrics_logging.h" #include "btif_sdp.h" #include "btif_storage.h" #include "btif_util.h" @@ -72,6 +71,8 @@ #include "main/shim/entry.h" #include "main/shim/helpers.h" #include "main/shim/le_advertising_manager.h" +#include "main/shim/metric_id_api.h" +#include "main/shim/metrics_api.h" #include "main_thread.h" #include "metrics/bluetooth_event.h" #include "os/system_properties.h" @@ -582,11 +583,11 @@ static void bond_state_changed(bt_status_t status, const RawAddress& bd_addr, state, pairing_cb.state, pairing_cb.sdp_attempts); if (state == BT_BOND_STATE_NONE) { - forget_device_from_metric_id_allocator(bd_addr); + bluetooth::shim::ForgetDeviceFromMetricIdAllocator(bd_addr); btif_config_remove_device(bd_addr.ToString()); } else if (state == BT_BOND_STATE_BONDED) { - allocate_metric_id_from_metric_id_allocator(bd_addr); - if (!save_metric_id_from_metric_id_allocator(bd_addr)) { + bluetooth::shim::AllocateIdFromMetricIdAllocator(bd_addr); + if (!bluetooth::shim::SaveDeviceOnMetricIdAllocator(bd_addr)) { log::error("Fail to save metric id for device:{}", bd_addr); } } diff --git a/system/btif/src/btif_hf.cc b/system/btif/src/btif_hf.cc index 33fb900e07..178a1672e6 100644 --- a/system/btif/src/btif_hf.cc +++ b/system/btif/src/btif_hf.cc @@ -51,7 +51,6 @@ #include "bta/include/utl.h" #include "bta_ag_swb_aptx.h" #include "btif/include/btif_common.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_profile_queue.h" #include "btif/include/btif_util.h" #include "btm_api_types.h" @@ -390,7 +389,7 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { p_data->open.status, btif_hf_cb[idx].connected_bda, p_data->open.bd_addr); bt_hf_callbacks->ConnectionStateCallback(BTHF_CONNECTION_STATE_DISCONNECTED, &(p_data->open.bd_addr)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HFP_COLLISON_AT_AG_OPEN, 1); } break; @@ -412,7 +411,7 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { btif_hf_cb[idx].connected_bda, p_data->open.bd_addr); bt_hf_callbacks->ConnectionStateCallback(BTHF_CONNECTION_STATE_DISCONNECTED, &(btif_hf_cb[idx].connected_bda)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HFP_COLLISON_AT_CONNECTING, 1); reset_control_block(&btif_hf_cb[idx]); btif_queue_advance(); @@ -472,7 +471,7 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { bt_hf_callbacks->ConnectionStateCallback(btif_hf_cb[idx].state, &connected_bda); } - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HFP_SELF_INITIATED_AG_FAILED, 1); btif_queue_advance(); if (btm_sec_is_a_bonded_dev(connected_bda)) { @@ -496,8 +495,8 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { bt_hf_callbacks->ConnectionStateCallback(btif_hf_cb[idx].state, &connected_bda); if (failed_to_setup_slc) { log::error("failed to setup SLC for {}", connected_bda); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::HFP_SLC_SETUP_FAILED, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HFP_SLC_SETUP_FAILED, 1); btif_queue_advance(); LogMetricHfpSlcFail(ToGdAddress(p_data->open.bd_addr)); DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(btif_hf_cb[idx].connected_bda, @@ -881,7 +880,7 @@ public: bt_status_t DisconnectAudio(RawAddress* bd_addr) override; bt_status_t isNoiseReductionSupported(RawAddress* bd_addr) override; bt_status_t isVoiceRecognitionSupported(RawAddress* bd_addr) override; - bt_status_t StartVoiceRecognition(RawAddress* bd_addr) override; + bt_status_t StartVoiceRecognition(RawAddress* bd_addr, bool sendResult) override; bt_status_t StopVoiceRecognition(RawAddress* bd_addr) override; bt_status_t VolumeControl(bthf_volume_type_t type, int volume, RawAddress* bd_addr) override; bt_status_t DeviceStatusNotification(bthf_network_state_t ntk_state, bthf_service_type_t svc_type, @@ -1024,7 +1023,7 @@ bt_status_t HeadsetInterface::isVoiceRecognitionSupported(RawAddress* bd_addr) { return BT_STATUS_SUCCESS; } -bt_status_t HeadsetInterface::StartVoiceRecognition(RawAddress* bd_addr) { +bt_status_t HeadsetInterface::StartVoiceRecognition(RawAddress* bd_addr, bool sendResult) { CHECK_BTHF_INIT(); int idx = btif_hf_idx_by_bdaddr(bd_addr); if ((idx < 0) || (idx >= BTA_AG_MAX_NUM_CLIENTS)) { @@ -1040,9 +1039,11 @@ bt_status_t HeadsetInterface::StartVoiceRecognition(RawAddress* bd_addr) { return BT_STATUS_UNSUPPORTED; } btif_hf_cb[idx].is_during_voice_recognition = true; - tBTA_AG_RES_DATA ag_res = {}; - ag_res.state = true; - BTA_AgResult(btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, ag_res); + if (sendResult) { + tBTA_AG_RES_DATA ag_res = {}; + ag_res.state = true; + BTA_AgResult(btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, ag_res); + } return BT_STATUS_SUCCESS; } diff --git a/system/btif/src/btif_hh.cc b/system/btif/src/btif_hh.cc index 7288abe98c..36ad3d148e 100644 --- a/system/btif/src/btif_hh.cc +++ b/system/btif/src/btif_hh.cc @@ -48,7 +48,6 @@ #include "btif/include/btif_common.h" #include "btif/include/btif_dm.h" #include "btif/include/btif_hd.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_profile_storage.h" #include "btif/include/btif_storage.h" #include "btif/include/btif_util.h" @@ -56,6 +55,7 @@ #include "include/hardware/bt_hh.h" #include "internal_include/bt_target.h" #include "main/shim/dumpsys.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "stack/include/bt_hdr.h" @@ -468,7 +468,7 @@ static void btif_hh_incoming_connection_timeout(void* data) { handle); } log::warn("Reject unexpected incoming HID Connection, device: {}", conn.link_spec); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_INCOMING_CONNECTION_REJECTED, 1); btif_hh_device_t* p_dev = btif_hh_find_dev_by_link_spec(conn.link_spec); @@ -529,7 +529,7 @@ static bool hh_add_device(const tAclLinkSpec& link_spec, tBTA_HH_ATTR_MASK attr_ } log::error("Out of space to add device"); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_MAX_ADDED_DEVICE_LIMIT_REACHED, 1); return false; } @@ -633,7 +633,7 @@ static void hh_open_handler(tBTA_HH_CONN& conn) { log::warn("Reject Incoming HID Connection, device: {}, state: {}", conn.link_spec, bthh_connection_state_text(dev_status)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_INCOMING_CONNECTION_REJECTED, 1); if (p_dev != nullptr) { @@ -910,9 +910,10 @@ static void hh_vc_unplug_handler(tBTA_HH_CBDATA& dev_status) { BTHH_STATE_UPDATE(p_dev->link_spec, p_dev->dev_status); if (!p_dev->local_vup) { - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum:: - HIDH_COUNT_VIRTUAL_UNPLUG_REQUESTED_BY_REMOTE_DEVICE, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDH_COUNT_VIRTUAL_UNPLUG_REQUESTED_BY_REMOTE_DEVICE, + 1); } // Remove the HID device @@ -1193,9 +1194,10 @@ bt_status_t btif_hh_connect(const tAclLinkSpec& link_spec) { if (!p_dev && btif_hh_cb.device_num >= BTIF_HH_MAX_HID) { // No space for more HID device now. log::warn("Error, exceeded the maximum supported HID device number {}", BTIF_HH_MAX_HID); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum:: - HIDH_COUNT_CONNECT_REQ_WHEN_MAX_DEVICE_LIMIT_REACHED, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDH_COUNT_CONNECT_REQ_WHEN_MAX_DEVICE_LIMIT_REACHED, + 1); return BT_STATUS_NOMEM; } @@ -2030,7 +2032,7 @@ static bt_status_t get_report(RawAddress* bd_addr, tBLE_ADDR_TYPE addr_type, return BT_STATUS_DEVICE_NOT_FOUND; } else if (((int)reportType) <= BTA_HH_RPTT_RESRV || ((int)reportType) > BTA_HH_RPTT_FEATURE) { log::error("report type={} not supported", reportType); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_WRONG_REPORT_TYPE, 1); return BT_STATUS_UNSUPPORTED; } else { @@ -2102,7 +2104,7 @@ static bt_status_t set_report(RawAddress* bd_addr, tBLE_ADDR_TYPE addr_type, return BT_STATUS_DEVICE_NOT_FOUND; } else if (((int)reportType) <= BTA_HH_RPTT_RESRV || ((int)reportType) > BTA_HH_RPTT_FEATURE) { log::error("report type={} not supported", reportType); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_WRONG_REPORT_TYPE, 1); return BT_STATUS_UNSUPPORTED; } else { diff --git a/system/btif/src/btif_metrics_logging.cc b/system/btif/src/btif_metrics_logging.cc deleted file mode 100644 index 40f2fed315..0000000000 --- a/system/btif/src/btif_metrics_logging.cc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "btif/include/btif_metrics_logging.h" - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "main/shim/metrics_api.h" -#include "types/raw_address.h" - -void log_a2dp_audio_underrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes) { - bluetooth::shim::LogMetricA2dpAudioUnderrunEvent(address, encoding_interval_millis, - num_missing_pcm_bytes); -} - -void log_a2dp_audio_overrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes) { - bluetooth::shim::LogMetricA2dpAudioOverrunEvent(address, encoding_interval_millis, - num_dropped_buffers, num_dropped_encoded_frames, - num_dropped_encoded_bytes); -} - -void log_a2dp_playback_event(const RawAddress& address, int playback_state, int audio_coding_mode) { - bluetooth::shim::LogMetricA2dpPlaybackEvent(address, playback_state, audio_coding_mode); -} - -void log_a2dp_session_metrics_event(const RawAddress& address, int64_t audio_duration_ms, - int media_timer_min_ms, int media_timer_max_ms, - int media_timer_avg_ms, int total_scheduling_count, - int buffer_overruns_max_count, int buffer_overruns_total, - float buffer_underruns_average, int buffer_underruns_count, - int64_t codec_index, bool is_a2dp_offload) { - bluetooth::shim::LogMetricA2dpSessionMetricsEvent( - address, audio_duration_ms, media_timer_min_ms, media_timer_max_ms, media_timer_avg_ms, - total_scheduling_count, buffer_overruns_max_count, buffer_overruns_total, - buffer_underruns_average, buffer_underruns_count, codec_index, is_a2dp_offload); -} - -void log_read_rssi_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi) { - bluetooth::shim::LogMetricReadRssiResult(address, handle, cmd_status, rssi); -} - -void log_read_failed_contact_counter_result(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter) { - bluetooth::shim::LogMetricReadFailedContactCounterResult(address, handle, cmd_status, - failed_contact_counter); -} - -void log_read_tx_power_level_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level) { - bluetooth::shim::LogMetricReadTxPowerLevelResult(address, handle, cmd_status, - transmit_power_level); -} - -void log_socket_connection_state(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role, - uint64_t connection_duration_ms, - android::bluetooth::SocketErrorEnum error_code, - bool is_hardware_offload) { - bluetooth::shim::LogMetricSocketConnectionState( - address, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, socket_role, - connection_duration_ms, error_code, is_hardware_offload); -} - -void log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - bluetooth::shim::CountCounterMetrics(key, value); -} - -bool init_metric_id_allocator(const std::unordered_map<RawAddress, int>& paired_device_map, - bluetooth::shim::CallbackLegacy save_device_callback, - bluetooth::shim::CallbackLegacy forget_device_callback) { - return bluetooth::shim::InitMetricIdAllocator(paired_device_map, std::move(save_device_callback), - std::move(forget_device_callback)); -} - -bool close_metric_id_allocator() { return bluetooth::shim::CloseMetricIdAllocator(); } - -int allocate_metric_id_from_metric_id_allocator(const RawAddress& address) { - return bluetooth::shim::AllocateIdFromMetricIdAllocator(address); -} - -int save_metric_id_from_metric_id_allocator(const RawAddress& address) { - return bluetooth::shim::SaveDeviceOnMetricIdAllocator(address); -} - -void forget_device_from_metric_id_allocator(const RawAddress& address) { - bluetooth::shim::ForgetDeviceFromMetricIdAllocator(address); -} - -bool is_valid_id_from_metric_id_allocator(const int id) { - return bluetooth::shim::IsValidIdFromMetricIdAllocator(id); -} diff --git a/system/btif/src/btif_sock_logging.cc b/system/btif/src/btif_sock_logging.cc index 111e52002b..8847daa7f1 100644 --- a/system/btif/src/btif_sock_logging.cc +++ b/system/btif/src/btif_sock_logging.cc @@ -23,9 +23,9 @@ #include <atomic> -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_sock.h" #include "common/time_util.h" +#include "main/shim/metrics_api.h" #include "types/raw_address.h" #define SOCK_LOGGER_SIZE_MAX 16 @@ -79,7 +79,7 @@ void btif_sock_connection_logger(const RawAddress& address, int port, int type, } clock_gettime(CLOCK_REALTIME, &connection_logger[index].timestamp); - log_socket_connection_state( + bluetooth::shim::LogMetricSocketConnectionState( address, port, type, toConnectionStateEnum(state), tx_bytes, rx_bytes, uid, server_port, toSocketRoleEnum(role), getConnectionDuration(connection_start_time_ms), toSocketErrorEnum(error_code), data_path == BTSOCK_DATA_PATH_HARDWARE_OFFLOAD); diff --git a/system/btif/src/btif_sock_rfc.cc b/system/btif/src/btif_sock_rfc.cc index 4c75b0f355..1ea4bf9981 100644 --- a/system/btif/src/btif_sock_rfc.cc +++ b/system/btif/src/btif_sock_rfc.cc @@ -33,7 +33,6 @@ #include "bta/include/bta_jv_co.h" #include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_rfcomm_scn.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_sock.h" #include "btif/include/btif_sock_l2cap.h" #include "btif/include/btif_sock_logging.h" @@ -45,6 +44,7 @@ #include "include/hardware/bt_sock.h" #include "lpp/lpp_offload_interface.h" #include "main/shim/entry.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/compat.h" #include "osi/include/list.h" @@ -909,12 +909,12 @@ static void on_rfc_close(tBTA_JV_RFCOMM_CLOSE* /* p_close */, uint32_t id) { log::warn("RFCOMM slot with id {} not found.", id); return; } - log_socket_connection_state(slot->addr, slot->id, BTSOCK_RFCOMM, - android::bluetooth::SOCKET_CONNECTION_STATE_DISCONNECTING, 0, 0, - slot->app_uid, slot->scn, - slot->f.server ? android::bluetooth::SOCKET_ROLE_LISTEN - : android::bluetooth::SOCKET_ROLE_CONNECTION, - 0, android::bluetooth::SOCKET_ERROR_NONE, slot->data_path); + bluetooth::shim::LogMetricSocketConnectionState( + slot->addr, slot->id, BTSOCK_RFCOMM, + android::bluetooth::SOCKET_CONNECTION_STATE_DISCONNECTING, 0, 0, slot->app_uid, slot->scn, + slot->f.server ? android::bluetooth::SOCKET_ROLE_LISTEN + : android::bluetooth::SOCKET_ROLE_CONNECTION, + 0, android::bluetooth::SOCKET_ERROR_NONE, slot->data_path); cleanup_rfc_slot(slot, BTSOCK_ERROR_NONE); } diff --git a/system/btif/test/btif_core_test.cc b/system/btif/test/btif_core_test.cc index 7342a17b99..3073bd194c 100644 --- a/system/btif/test/btif_core_test.cc +++ b/system/btif/test/btif_core_test.cc @@ -207,7 +207,8 @@ class BtifCoreTest : public ::testing::Test { protected: void SetUp() override { callback_map_.clear(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); bluetooth::testing::set_hal_cbacks(&callbacks); auto promise = std::promise<void>(); auto future = promise.get_future(); @@ -223,17 +224,17 @@ protected: callback_map_["callback_thread_event"] = [&promise]() { promise.set_value(); }; CleanCoreInterface(); ASSERT_EQ(std::future_status::ready, future.wait_for(timeout_time)); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); callback_map_.erase("callback_thread_event"); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtifCoreWithControllerTest : public BtifCoreTest { protected: void SetUp() override { BtifCoreTest::SetUp(); - ON_CALL(controller_, SupportsSniffSubrating).WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsSniffSubrating) + .WillByDefault(Return(true)); } void TearDown() override { BtifCoreTest::TearDown(); } @@ -761,12 +762,13 @@ class BtifCoreWithVendorSupportTest : public BtifCoreWithControllerTest { protected: void SetUp() override { BtifCoreWithControllerTest::SetUp(); - bluetooth::hci::testing::mock_hci_layer_ = &hci_; + bluetooth::hci::testing::mock_hci_layer_ = + std::make_unique<bluetooth::hci::testing::MockHciLayer>(); test::mock::osi_properties::osi_property_get.body = get_properties; std::promise<void> configuration_promise; auto configuration_done = configuration_promise.get_future(); - EXPECT_CALL(hci_, + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, EnqueueCommand(_, Matcher<ContextualOnceCallback<void(CommandCompleteView)>>(_))) .WillOnce( // Replace with real PDL for 0xfc17 @@ -784,7 +786,7 @@ protected: configuration_promise.set_value(); }) .RetiresOnSaturation(); - EXPECT_CALL(hci_, + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, EnqueueCommand(_, Matcher<ContextualOnceCallback<void(CommandCompleteView)>>(_))) .WillOnce([](std::unique_ptr<CommandBuilder> cmd, ContextualOnceCallback<void(CommandCompleteView)> callback) { @@ -798,7 +800,8 @@ protected: callback(response); }) .RetiresOnSaturation(); - EXPECT_CALL(hci_, RegisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT, _)) + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, + RegisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT, _)) .WillOnce(SaveArg<1>(&this->vse_callback_)); do_in_main_thread(BindOnce([]() { bluetooth::bqr::EnableBtQualityReport(get_main()); })); ASSERT_EQ(std::future_status::ready, configuration_done.wait_for(std::chrono::seconds(1))); @@ -808,18 +811,18 @@ protected: std::promise<void> disable_promise; auto disable_future = disable_promise.get_future(); auto set_promise = [&disable_promise]() { disable_promise.set_value(); }; - EXPECT_CALL(hci_, UnregisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT)); - EXPECT_CALL(hci_, + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, + UnregisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT)); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, EnqueueCommand(_, Matcher<ContextualOnceCallback<void(CommandCompleteView)>>(_))) .WillOnce(Invoke(set_promise)) .RetiresOnSaturation(); do_in_main_thread(BindOnce([]() { bluetooth::bqr::DisableBtQualityReport(); })); ASSERT_EQ(std::future_status::ready, disable_future.wait_for(std::chrono::seconds(1))); - bluetooth::hci::testing::mock_hci_layer_ = nullptr; + bluetooth::hci::testing::mock_hci_layer_.reset(); BtifCoreWithControllerTest::TearDown(); } - bluetooth::hci::testing::MockHciLayer hci_; ContextualCallback<void(VendorSpecificEventView)> vse_callback_; }; diff --git a/system/common/BUILD.gn b/system/common/BUILD.gn index a1884973dd..50ec9c1dd0 100644 --- a/system/common/BUILD.gn +++ b/system/common/BUILD.gn @@ -30,7 +30,6 @@ static_library("common") { include_dirs = [ "//bt/system/", "//bt/system/stack/include", - "//bt/system/linux_include", ] deps = [ diff --git a/system/common/metrics.cc b/system/common/metrics.cc index a3b3eea450..c6c0977115 100644 --- a/system/common/metrics.cc +++ b/system/common/metrics.cc @@ -18,87 +18,19 @@ #include "common/metrics.h" -#include <base/base64.h> #include <bluetooth/log.h> #include <frameworks/proto_logging/stats/enums/bluetooth/le/enums.pb.h> -#include <include/hardware/bt_av.h> #include <statslog_bt.h> -#include <unistd.h> -#include <algorithm> -#include <cerrno> #include <cstdint> -#include <cstring> -#include <memory> -#include <mutex> // NOLINT -#include <utility> +#include <vector> -#include "common/address_obfuscator.h" -#include "common/leaky_bonded_queue.h" -#include "common/time_util.h" -#include "hci/address.h" #include "main/shim/metric_id_api.h" -#include "osi/include/osi.h" #include "types/raw_address.h" -namespace std { -template <> -struct formatter<android::bluetooth::DirectionEnum> - : enum_formatter<android::bluetooth::DirectionEnum> {}; -template <> -struct formatter<android::bluetooth::SocketConnectionstateEnum> - : enum_formatter<android::bluetooth::SocketConnectionstateEnum> {}; -template <> -struct formatter<android::bluetooth::SocketRoleEnum> - : enum_formatter<android::bluetooth::SocketRoleEnum> {}; -template <> -struct formatter<android::bluetooth::AddressTypeEnum> - : enum_formatter<android::bluetooth::AddressTypeEnum> {}; -template <> -struct formatter<android::bluetooth::DeviceInfoSrcEnum> - : enum_formatter<android::bluetooth::DeviceInfoSrcEnum> {}; -template <> -struct formatter<android::bluetooth::SocketErrorEnum> - : enum_formatter<android::bluetooth::SocketErrorEnum> {}; -} // namespace std - namespace bluetooth { namespace common { -using bluetooth::hci::Address; - -void LogLinkLayerConnectionEvent(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, - uint32_t hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, - uint16_t cmd_status, uint16_t reason_code) { - std::string obfuscated_id; - int metric_id = 0; - if (address != nullptr) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(*address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(*address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address != nullptr ? obfuscated_id.c_str() : nullptr, - address != nullptr ? obfuscated_id.size() : 0); - int ret = stats_write(BLUETOOTH_LINK_LAYER_CONNECTION_EVENT, bytes_field, connection_handle, - direction, link_type, hci_cmd, hci_event, hci_ble_event, cmd_status, - reason_code, metric_id); - if (ret < 0) { - log::warn( - "failed to log status 0x{:x}, reason 0x{:x} from cmd 0x{:x}, event " - "0x{:x}, ble_event 0x{:x} for {}, handle {}, type 0x{:x}, error {}", - cmd_status, reason_code, hci_cmd, hci_event, hci_ble_event, *address, connection_handle, - link_type, ret); - } -} - -void LogHciTimeoutEvent(uint32_t hci_cmd) { - int ret = stats_write(BLUETOOTH_HCI_TIMEOUT_REPORTED, static_cast<int64_t>(hci_cmd)); - if (ret < 0) { - log::warn("failed for opcode 0x{:x}, error {}", hci_cmd, ret); - } -} - void LogRemoteVersionInfo(uint16_t handle, uint8_t status, uint8_t version, uint16_t manufacturer_name, uint16_t subversion) { int ret = stats_write(BLUETOOTH_REMOTE_VERSION_INFO_REPORTED, handle, status, version, @@ -111,276 +43,6 @@ void LogRemoteVersionInfo(uint16_t handle, uint8_t status, uint8_t version, } } -void LogA2dpAudioUnderrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int64_t encoding_interval_nanos = encoding_interval_millis * 1000000; - int ret = stats_write(BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED, bytes_field, - encoding_interval_nanos, num_missing_pcm_bytes, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, encoding_interval_nanos {}, num_missing_pcm_bytes {}, " - "error {}", - address, encoding_interval_nanos, num_missing_pcm_bytes, ret); - } -} - -void LogA2dpAudioOverrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int64_t encoding_interval_nanos = encoding_interval_millis * 1000000; - int ret = stats_write(BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED, bytes_field, encoding_interval_nanos, - num_dropped_buffers, num_dropped_encoded_frames, num_dropped_encoded_bytes, - metric_id); - if (ret < 0) { - log::warn( - "failed to log for {}, encoding_interval_nanos {}, num_dropped_buffers " - "{}, num_dropped_encoded_frames {}, num_dropped_encoded_bytes {}, " - "error {}", - address, encoding_interval_nanos, num_dropped_buffers, num_dropped_encoded_frames, - num_dropped_encoded_bytes, ret); - } -} - -void LogA2dpPlaybackEvent(const RawAddress& address, int playback_state, int audio_coding_mode) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED, bytes_field, playback_state, - audio_coding_mode, metric_id); - if (ret < 0) { - log::warn( - "failed to log for {}, playback_state {}, audio_coding_mode {}, error " - "{}", - address, playback_state, audio_coding_mode, ret); - } -} - -void LogReadRssiResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_RSSI_REPORTED, bytes_field, handle, cmd_status, rssi, - metric_id); - if (ret < 0) { - log::warn("failed for {}, handle {}, status 0x{:x}, rssi {} dBm, error {}", address, handle, - cmd_status, rssi, ret); - } -} - -void LogReadFailedContactCounterResult(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED, bytes_field, handle, - cmd_status, failed_contact_counter, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, handle {}, status 0x{:x}, failed_contact_counter {} " - "packets, error {}", - address, handle, cmd_status, failed_contact_counter, ret); - } -} - -void LogReadTxPowerLevelResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED, bytes_field, handle, cmd_status, - transmit_power_level, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, handle {}, status 0x{:x}, transmit_power_level {} " - "packets, error {}", - address, handle, cmd_status, transmit_power_level, ret); - } -} - -void LogSmpPairingEvent(const RawAddress& address, uint8_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint8_t smp_fail_reason) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_SMP_PAIRING_EVENT_REPORTED, obfuscated_id_field, smp_cmd, - direction, smp_fail_reason, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, smp_cmd 0x{:x}, direction {}, smp_fail_reason 0x{:x}, " - "error {}", - address, smp_cmd, direction, smp_fail_reason, ret); - } -} - -void LogClassicPairingEvent(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED, obfuscated_id_field, handle, - hci_cmd, hci_event, cmd_status, reason_code, event_value, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, handle {}, hci_cmd 0x{:x}, hci_event 0x{:x}, " - "cmd_status 0x{:x}, reason 0x{:x}, event_value {}, error {}", - address, handle, hci_cmd, hci_event, cmd_status, reason_code, event_value, ret); - } -} - -void LogSdpAttribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - BytesField attribute_field(attribute_value, attribute_size); - int ret = stats_write(BLUETOOTH_SDP_ATTRIBUTE_REPORTED, obfuscated_id_field, protocol_uuid, - attribute_id, attribute_field, metric_id); - if (ret < 0) { - log::warn("failed for {}, protocol_uuid 0x{:x}, attribute_id 0x{:x}, error {}", address, - protocol_uuid, attribute_id, ret); - } -} - -void LogSocketConnectionState(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role, - uint64_t connection_duration_ms, - android::bluetooth::SocketErrorEnum error_code, - bool is_hardware_offload) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED, obfuscated_id_field, port, type, - connection_state, tx_bytes, rx_bytes, uid, server_port, socket_role, - metric_id, static_cast<int64_t>(connection_duration_ms), error_code, - is_hardware_offload); - if (ret < 0) { - log::warn( - "failed for {}, port {}, type {}, state {}, tx_bytes {}, rx_bytes {}, " - "uid {}, server_port {}, socket_role {}, error {}, connection_duration_ms {}, " - "socket_error_code {}, " - "is_hardware_offload {}", - address, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, - socket_role, ret, connection_duration_ms, error_code, is_hardware_offload); - } -} - -void LogManufacturerInfo(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_INFO_REPORTED, obfuscated_id_field, source_type, - source_name.c_str(), manufacturer.c_str(), model.c_str(), - hardware_version.c_str(), software_version.c_str(), metric_id, address_type, - address.address[5], address.address[4], address.address[3]); - if (ret < 0) { - log::warn( - "failed for {}, source_type {}, source_name {}, manufacturer {}, model " - "{}, hardware_version {}, software_version {} MAC address type {} MAC " - "address prefix {} {} {}, error {}", - address, source_type, source_name, manufacturer, model, hardware_version, - software_version, address_type, address.address[5], address.address[4], - address.address[3], ret); - } -} - -void LogBluetoothHalCrashReason(const RawAddress& address, uint32_t error_code, - uint32_t vendor_error_code) { - std::string obfuscated_id; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_HAL_CRASH_REASON_REPORTED, 0, obfuscated_id_field, error_code, - vendor_error_code); - if (ret < 0) { - log::warn("failed for {}, error_code 0x{:x}, vendor_error_code 0x{:x}, error {}", address, - error_code, vendor_error_code, ret); - } -} - void LogLeAudioConnectionSessionReported( int32_t group_size, int32_t group_metric_id, int64_t connection_duration_nanos, const std::vector<int64_t>& device_connecting_offset_nanos, @@ -429,5 +91,4 @@ void LogLeAudioBroadcastSessionReported(int64_t duration_nanos) { } } // namespace common - } // namespace bluetooth diff --git a/system/common/metrics.h b/system/common/metrics.h index 4ccb47f64c..4d5a234ce5 100644 --- a/system/common/metrics.h +++ b/system/common/metrics.h @@ -18,22 +18,12 @@ #pragma once -#include <bta/include/bta_api.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/le/enums.pb.h> -#include <stdint.h> - -#include <memory> -#include <string> +#include <cstdint> #include <vector> -#include "hci/address.h" -#include "os/metrics.h" #include "types/raw_address.h" namespace bluetooth { - namespace common { /** @@ -42,34 +32,6 @@ namespace common { static const uint32_t kUnknownConnectionHandle = 0xFFFF; /** - * Log link layer connection event - * - * @param address Stack wide consistent Bluetooth address of this event, - * nullptr if unknown - * @param connection_handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param direction direction of this connection - * @param link_type type of the link - * @param hci_cmd HCI command opecode associated with this event, if any - * @param hci_event HCI event code associated with this event, if any - * @param hci_ble_event HCI BLE event code associated with this event, if any - * @param cmd_status Command status associated with this event, if any - * @param reason_code Reason code associated with this event, if any - */ -void LogLinkLayerConnectionEvent(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, - uint32_t hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, - uint16_t cmd_status, uint16_t reason_code); - -/** - * Logs when Bluetooth controller failed to reply with command status within - * a timeout period after receiving an HCI command from the host - * - * @param hci_cmd opcode of HCI command that caused this timeout - */ -void LogHciTimeoutEvent(uint32_t hci_cmd); - -/** * Logs when we receive Bluetooth Read Remote Version Information Complete * Event from the remote device, as documented by the Bluetooth Core HCI * specification @@ -86,173 +48,6 @@ void LogHciTimeoutEvent(uint32_t hci_cmd); void LogRemoteVersionInfo(uint16_t handle, uint8_t status, uint8_t version, uint16_t manufacturer_name, uint16_t subversion); -/** - * Log A2DP audio buffer underrun event - * - * @param address A2DP device associated with this event - * @param encoding_interval_millis encoding interval in milliseconds - * @param num_missing_pcm_bytes number of PCM bytes that cannot be read from - * the source - */ -void LogA2dpAudioUnderrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes); - -/** - * Log A2DP audio buffer overrun event - * - * @param address A2DP device associated with this event - * @param encoding_interval_millis encoding interval in milliseconds - * @param num_dropped_buffers number of encoded buffers dropped from Tx queue - * @param num_dropped_encoded_frames number of encoded frames dropped from Tx - * queue - * @param num_dropped_encoded_bytes number of encoded bytes dropped from Tx - * queue - */ -void LogA2dpAudioOverrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes); - -/** - * Log A2DP playback state changed event - * - * @param address A2DP device associated with this event - * @param playback_state audio playback state - * @param audio_coding_mode audio codec encoding mode - */ -void LogA2dpPlaybackEvent(const RawAddress& address, int playback_state, int audio_coding_mode); - -/** - * Log read RSSI result - * - * @param address device associated with this event - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param cmd_status command status from read RSSI command - * @param rssi rssi value in dBm - */ -void LogReadRssiResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi); - -/** - * Log failed contact counter report - * - * @param address device associated with this event - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param cmd_status command status from read failed contact counter command - * @param failed_contact_counter Number of consecutive failed contacts for a - * connection corresponding to the Handle - */ -void LogReadFailedContactCounterResult(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter); - -/** - * Log transmit power level for a particular device after read - * - * @param address device associated with this event - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param cmd_status command status from read failed contact counter command - * @param transmit_power_level transmit power level for connection to this - * device - */ -void LogReadTxPowerLevelResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level); - -/** - * Logs when there is an event related to Bluetooth Security Manager Protocol - * - * @param address address of associated device - * @param smp_cmd SMP command code associated with this event - * @param direction direction of this SMP command - * @param smp_fail_reason SMP pairing failure reason code from SMP spec - */ -void LogSmpPairingEvent(const RawAddress& address, uint8_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint8_t smp_fail_reason); - -/** - * Logs there is an event related Bluetooth classic pairing - * - * @param address address of associated device - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param hci_cmd HCI command associated with this event - * @param hci_event HCI event associated with this event - * @param cmd_status Command status associated with this event - * @param reason_code Reason code associated with this event - * @param event_value A status value related to this specific event - */ -void LogClassicPairingEvent(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value); - -/** - * Logs when certain Bluetooth SDP attributes are discovered - * - * @param address address of associated device - * @param protocol_uuid 16 bit protocol UUID from Bluetooth Assigned Numbers - * @param attribute_id 16 bit attribute ID from Bluetooth Assigned Numbers - * @param attribute_size size of this attribute - * @param attribute_value pointer to the attribute data, must be larger than - * attribute_size - */ -void LogSdpAttribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value); - -/** - * Logs when there is a change in Bluetooth socket connection state - * - * @param address address of associated device, empty if this is a server port - * @param port port of this socket connection - * @param type type of socket - * @param connection_state socket connection state - * @param tx_bytes number of bytes transmitted - * @param rx_bytes number of bytes received - * @param server_port server port of this socket, if any. When both - * |server_port| and |port| fields are populated, |port| must be spawned - * by |server_port| - * @param socket_role role of this socket, server or connection - * @param uid socket owner's uid - * @param connection_duration_ms duration of socket connection in milliseconds - * @param error_code error code of socket failures - * @param is_hardware_offload whether this is a offload socket - */ -void LogSocketConnectionState(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role, - uint64_t connection_duration_ms, - android::bluetooth::SocketErrorEnum error_code, - bool is_hardware_offload); - -/** - * Logs when a Bluetooth device's manufacturer information is learnt - * - * @param address address of associated device - * @param source_type where is this device info obtained from - * @param source_name name of the data source, internal or external - * @param manufacturer name of the manufacturer of this device - * @param model model of this device - * @param hardware_version hardware version of this device - * @param software_version software version of this device - */ -void LogManufacturerInfo(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version); - -/** - * Logs when received Bluetooth HAL crash reason report. - * - * @param address current connected address. - * @param error_code the crash reason from bluetooth hal - * @param vendor_error_code the vendor crash reason from bluetooth Firmware - */ -void LogBluetoothHalCrashReason(const RawAddress& address, uint32_t error_code, - uint32_t vendor_error_code); - void LogLeAudioConnectionSessionReported( int32_t group_size, int32_t group_metric_id, int64_t connection_duration_nanos, const std::vector<int64_t>& device_connecting_offset_nanos, @@ -268,5 +63,4 @@ void LogLeAudioConnectionSessionReported( void LogLeAudioBroadcastSessionReported(int64_t duration_nanos); } // namespace common - } // namespace bluetooth diff --git a/system/common/metrics_linux.cc b/system/common/metrics_linux.cc index 3283619415..e886c05bf3 100644 --- a/system/common/metrics_linux.cc +++ b/system/common/metrics_linux.cc @@ -16,81 +16,18 @@ * ******************************************************************************/ -#include <bluetooth/log.h> +#include <cstdint> +#include <vector> #include "common/metrics.h" #include "types/raw_address.h" namespace bluetooth { - namespace common { -void LogClassicPairingEvent(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* hci_cmd */, uint16_t /* hci_event */, - uint16_t /* cmd_status */, uint16_t /* reason_code */, - int64_t /* event_value */) {} - -void LogSocketConnectionState(const RawAddress& /* address */, int /* port */, int /* type */, - android::bluetooth::SocketConnectionstateEnum /* connection_state */, - int64_t /* tx_bytes */, int64_t /* rx_bytes */, int /* uid */, - int /* server_port */, - android::bluetooth::SocketRoleEnum /* socket_role */, - uint64_t /* connection_duration_ms */, - android::bluetooth::SocketErrorEnum /* error_code */, - bool /* is_hardware_offload */) {} - -void LogHciTimeoutEvent(uint32_t /* hci_cmd */) {} - -void LogA2dpAudioUnderrunEvent(const RawAddress& /* address */, - uint64_t /* encoding_interval_millis */, - int /* num_missing_pcm_bytes */) {} - -void LogA2dpAudioOverrunEvent(const RawAddress& /* address */, - uint64_t /* encoding_interval_millis */, - int /* num_dropped_buffers */, int /* num_dropped_encoded_frames */, - int /* num_dropped_encoded_bytes */) {} - -void LogA2dpPlaybackEvent(const RawAddress& /* address */, int /* playback_state */, - int /* audio_coding_mode */) {} - -void LogBluetoothHalCrashReason(const RawAddress& /* address */, uint32_t /* error_code */, - uint32_t /* vendor_error_code */) {} - -void LogReadRssiResult(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* cmd_status */, int8_t /* rssi */) {} - -void LogReadFailedContactCounterResult(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* cmd_status */, - int32_t /* failed_contact_counter */) {} - -void LogReadTxPowerLevelResult(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* cmd_status */, int32_t /* transmit_power_level */) {} - void LogRemoteVersionInfo(uint16_t /* handle */, uint8_t /* status */, uint8_t /* version */, uint16_t /* manufacturer_name */, uint16_t /* subversion */) {} -void LogLinkLayerConnectionEvent(const RawAddress* /* address */, uint32_t /* connection_handle */, - android::bluetooth::DirectionEnum /* direction */, - uint16_t /* link_type */, uint32_t /* hci_cmd */, - uint16_t /* hci_event */, uint16_t /* hci_ble_event */, - uint16_t /* cmd_status */, uint16_t /* reason_code */) {} - -void LogManufacturerInfo(const RawAddress& /* address */, - android::bluetooth::AddressTypeEnum /* address_type */, - android::bluetooth::DeviceInfoSrcEnum /* source_type */, - const std::string& /* source_name */, - const std::string& /* manufacturer */, const std::string& /* model */, - const std::string& /* hardware_version */, - const std::string& /* software_version */) {} - -void LogSdpAttribute(const RawAddress& /* address */, uint16_t /* protocol_uuid */, - uint16_t /* attribute_id */, size_t /* attribute_size */, - const char* /* attribute_value */) {} - -void LogSmpPairingEvent(const RawAddress& /* address */, uint8_t /* smp_cmd */, - android::bluetooth::DirectionEnum /* direction */, - uint8_t /* smp_fail_reason */) {} - void LogLeAudioConnectionSessionReported( int32_t /* group_size */, int32_t /* group_metric_id */, int64_t /* connection_duration_nanos */, @@ -107,5 +44,4 @@ void LogLeAudioConnectionSessionReported( void LogLeAudioBroadcastSessionReported(int64_t /* duration_nanos */) {} } // namespace common - } // namespace bluetooth diff --git a/system/conf/interop_database.conf b/system/conf/interop_database.conf index ecf3da0b07..d921db421d 100644 --- a/system/conf/interop_database.conf +++ b/system/conf/interop_database.conf @@ -895,3 +895,8 @@ BSK10 = Name_Based [INTEROP_DISABLE_HF_PROFILE] JBL Flip 5 = Name_Based JBL Flip 6 = Name_Based + +# Some devices don't respond to LE appearance read request. +[INTEROP_DISABLE_READ_LE_APPEARANCE] +L1_L = Name_Based +L1_R = Name_Based diff --git a/system/device/include/interop.h b/system/device/include/interop.h index 22233bcd65..d72315d1b0 100644 --- a/system/device/include/interop.h +++ b/system/device/include/interop.h @@ -358,16 +358,20 @@ typedef enum { // Peer can request proper latency based on its power state later. INTEROP_HID_PREF_CONN_ZERO_LATENCY, - // Some HOGP devices have the report map longer than the maximum GATT attribute value length (512 - // bytes). + // Some HOGP devices have the report map longer than the maximum GATT + // attribute value length (512 bytes). INTEROP_HOGP_LONG_REPORT, - // Some HOGP devices requires MTU exchange be part of the initial setup to function. + // Some HOGP devices requires MTU exchange be part of the initial setup to + // function. INTEROP_HOGP_FORCE_MTU_EXCHANGE, // Some devices claim to support HFP in EIR but does not actually support it. INTEROP_DISABLE_HF_PROFILE, + // Some devices don't respond to LE appearance read request. + INTEROP_DISABLE_READ_LE_APPEARANCE, + END_OF_INTEROP_LIST } interop_feature_t; diff --git a/system/device/src/interop.cc b/system/device/src/interop.cc index 60d90cf6d6..44313664ed 100644 --- a/system/device/src/interop.cc +++ b/system/device/src/interop.cc @@ -392,6 +392,7 @@ static const char* interop_feature_string_(const interop_feature_t feature) { CASE_RETURN_STR(INTEROP_HOGP_LONG_REPORT); CASE_RETURN_STR(INTEROP_HOGP_FORCE_MTU_EXCHANGE); CASE_RETURN_STR(INTEROP_DISABLE_HF_PROFILE); + CASE_RETURN_STR(INTEROP_DISABLE_READ_LE_APPEARANCE); } return UNKNOWN_INTEROP_FEATURE; } diff --git a/system/gd/Android.bp b/system/gd/Android.bp index 26f31f0b8e..9a6bd02551 100644 --- a/system/gd/Android.bp +++ b/system/gd/Android.bp @@ -357,8 +357,8 @@ cc_test { srcs: [ ":BluetoothPacketTestSources", ":TestCommonMockFunctions", + ":TestMockMainShim", ":TestMockMainShimEntry", - ":TestMockStackMetrics", "common/bidi_queue_unittest.cc", "common/blocking_queue_unittest.cc", "common/byte_array_test.cc", @@ -414,6 +414,9 @@ cc_test { "storage/mutation_test.cc", "storage/storage_module_test.cc", ], + cflags: [ + "-DUSE_FAKE_TIMERS", + ], static_libs: [ "bluetooth_flags_c_lib_for_test", "libbase", @@ -581,11 +584,12 @@ cc_fuzz { defaults: ["gd_fuzz_defaults"], srcs: [ ":TestCommonMockFunctions", - ":TestMockStackMetrics", + ":TestMockMainShim", "hci/fuzz/acl_manager_fuzz_test.cc", ], include_dirs: [ "packages/modules/Bluetooth/system", + "packages/modules/Bluetooth/system/include", ], static_libs: [ "libbt-platform-protos-lite", diff --git a/system/gd/AndroidTestTemplate.xml b/system/gd/AndroidTestTemplate.xml index 4083baac14..92e0a83ae1 100644 --- a/system/gd/AndroidTestTemplate.xml +++ b/system/gd/AndroidTestTemplate.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2018 The Android Open Source Project +<!-- Copyright (C) 2018 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/system/gd/benchmark.cc b/system/gd/benchmark.cc index 2b11c898d5..923b0c76e7 100644 --- a/system/gd/benchmark.cc +++ b/system/gd/benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/audit_log.cc b/system/gd/common/audit_log.cc index 36cee3c801..e83c2894f8 100644 --- a/system/gd/common/audit_log.cc +++ b/system/gd/common/audit_log.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/audit_log.h b/system/gd/common/audit_log.h index b129bc7411..70a160870e 100644 --- a/system/gd/common/audit_log.h +++ b/system/gd/common/audit_log.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/bidi_queue.h b/system/gd/common/bidi_queue.h index 98271887eb..4dad186562 100644 --- a/system/gd/common/bidi_queue.h +++ b/system/gd/common/bidi_queue.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/bidi_queue_unittest.cc b/system/gd/common/bidi_queue_unittest.cc index 3505d16cdb..2235c3cc71 100644 --- a/system/gd/common/bidi_queue_unittest.cc +++ b/system/gd/common/bidi_queue_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/bind.h b/system/gd/common/bind.h index 9385c79dc5..fc1c9cdb80 100644 --- a/system/gd/common/bind.h +++ b/system/gd/common/bind.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/blocking_queue.h b/system/gd/common/blocking_queue.h index 4b68e514ab..25b46163d7 100644 --- a/system/gd/common/blocking_queue.h +++ b/system/gd/common/blocking_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/blocking_queue_unittest.cc b/system/gd/common/blocking_queue_unittest.cc index 2b109ffe5f..623dc026bd 100644 --- a/system/gd/common/blocking_queue_unittest.cc +++ b/system/gd/common/blocking_queue_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/byte_array.h b/system/gd/common/byte_array.h index b7183c4d2d..daff291385 100644 --- a/system/gd/common/byte_array.h +++ b/system/gd/common/byte_array.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/byte_array_test.cc b/system/gd/common/byte_array_test.cc index b9a64b3882..29ae26494b 100644 --- a/system/gd/common/byte_array_test.cc +++ b/system/gd/common/byte_array_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/callback.h b/system/gd/common/callback.h index 7bf6f3a4ef..5fa3ee991c 100644 --- a/system/gd/common/callback.h +++ b/system/gd/common/callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/circular_buffer.h b/system/gd/common/circular_buffer.h index 6132f2e51c..bfb4b4252a 100644 --- a/system/gd/common/circular_buffer.h +++ b/system/gd/common/circular_buffer.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/circular_buffer_test.cc b/system/gd/common/circular_buffer_test.cc index 618388858b..5b465de723 100644 --- a/system/gd/common/circular_buffer_test.cc +++ b/system/gd/common/circular_buffer_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/contextual_callback.h b/system/gd/common/contextual_callback.h index 548936d68b..6a6602e217 100644 --- a/system/gd/common/contextual_callback.h +++ b/system/gd/common/contextual_callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/i_postable_context.h b/system/gd/common/i_postable_context.h index b421579ca8..13ec14db29 100644 --- a/system/gd/common/i_postable_context.h +++ b/system/gd/common/i_postable_context.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/list_map.h b/system/gd/common/list_map.h index 1b63302806..8c1b014753 100644 --- a/system/gd/common/list_map.h +++ b/system/gd/common/list_map.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/list_map_test.cc b/system/gd/common/list_map_test.cc index 991fd25c58..d9a6c149b3 100644 --- a/system/gd/common/list_map_test.cc +++ b/system/gd/common/list_map_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/lru_cache.h b/system/gd/common/lru_cache.h index 303688d55f..6f5c2340f5 100644 --- a/system/gd/common/lru_cache.h +++ b/system/gd/common/lru_cache.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/lru_cache_test.cc b/system/gd/common/lru_cache_test.cc index 555a04edd2..166eb94561 100644 --- a/system/gd/common/lru_cache_test.cc +++ b/system/gd/common/lru_cache_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/multi_priority_queue.h b/system/gd/common/multi_priority_queue.h index d48f0bffb0..9dcc751c8e 100644 --- a/system/gd/common/multi_priority_queue.h +++ b/system/gd/common/multi_priority_queue.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/multi_priority_queue_test.cc b/system/gd/common/multi_priority_queue_test.cc index 435e1ad3cd..5691a7ca7a 100644 --- a/system/gd/common/multi_priority_queue_test.cc +++ b/system/gd/common/multi_priority_queue_test.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/numbers.h b/system/gd/common/numbers.h index e31bebbee3..5256093fa5 100644 --- a/system/gd/common/numbers.h +++ b/system/gd/common/numbers.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/numbers_test.cc b/system/gd/common/numbers_test.cc index bf4159f934..c5afad5cdc 100644 --- a/system/gd/common/numbers_test.cc +++ b/system/gd/common/numbers_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/postable_context.h b/system/gd/common/postable_context.h index 4a9514870f..332952df31 100644 --- a/system/gd/common/postable_context.h +++ b/system/gd/common/postable_context.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/stop_watch.cc b/system/gd/common/stop_watch.cc index b9f95bbcbe..5425ab7ed7 100644 --- a/system/gd/common/stop_watch.cc +++ b/system/gd/common/stop_watch.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/stop_watch.h b/system/gd/common/stop_watch.h index 792229172e..1a33d10770 100644 --- a/system/gd/common/stop_watch.h +++ b/system/gd/common/stop_watch.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/strings.cc b/system/gd/common/strings.cc index db42acfcf4..ba450acf65 100644 --- a/system/gd/common/strings.cc +++ b/system/gd/common/strings.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/strings.h b/system/gd/common/strings.h index 5593715eb2..ab8756e08e 100644 --- a/system/gd/common/strings.h +++ b/system/gd/common/strings.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/strings_test.cc b/system/gd/common/strings_test.cc index 9188eae528..24b4adedc6 100644 --- a/system/gd/common/strings_test.cc +++ b/system/gd/common/strings_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/sync_map_count.h b/system/gd/common/sync_map_count.h index b9cfab3049..10e63cdd08 100644 --- a/system/gd/common/sync_map_count.h +++ b/system/gd/common/sync_map_count.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/sync_map_count_test.cc b/system/gd/common/sync_map_count_test.cc index 0e29c32467..04911b87bc 100644 --- a/system/gd/common/sync_map_count_test.cc +++ b/system/gd/common/sync_map_count_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/testing/bind_test_util.h b/system/gd/common/testing/bind_test_util.h index 7db92045f7..d3f8996265 100644 --- a/system/gd/common/testing/bind_test_util.h +++ b/system/gd/common/testing/bind_test_util.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/testing/wired_pair_of_bidi_queues.h b/system/gd/common/testing/wired_pair_of_bidi_queues.h index ca401cb9e0..663727f1df 100644 --- a/system/gd/common/testing/wired_pair_of_bidi_queues.h +++ b/system/gd/common/testing/wired_pair_of_bidi_queues.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/type_helper.h b/system/gd/common/type_helper.h index 2f4a9d74fe..7ffd9b7363 100644 --- a/system/gd/common/type_helper.h +++ b/system/gd/common/type_helper.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/crypto_toolbox/crypto_toolbox_test.cc b/system/gd/crypto_toolbox/crypto_toolbox_test.cc index 35ab082d89..382d7035d4 100644 --- a/system/gd/crypto_toolbox/crypto_toolbox_test.cc +++ b/system/gd/crypto_toolbox/crypto_toolbox_test.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/fuzz/helpers.cc b/system/gd/fuzz/helpers.cc index a03f04aab8..1efe175dda 100644 --- a/system/gd/fuzz/helpers.cc +++ b/system/gd/fuzz/helpers.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/fuzz/helpers.h b/system/gd/fuzz/helpers.h index 7b90ff82bc..ed7f3ee852 100644 --- a/system/gd/fuzz/helpers.h +++ b/system/gd/fuzz/helpers.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/fuzz_test.cc b/system/gd/fuzz_test.cc index bdb007b295..73ad2fd65e 100644 --- a/system/gd/fuzz_test.cc +++ b/system/gd/fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/fuzz/fuzz_hci_hal.cc b/system/gd/hal/fuzz/fuzz_hci_hal.cc index a0db9f01d9..3d9afec3a8 100644 --- a/system/gd/hal/fuzz/fuzz_hci_hal.cc +++ b/system/gd/hal/fuzz/fuzz_hci_hal.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/fuzz/fuzz_hci_hal.h b/system/gd/hal/fuzz/fuzz_hci_hal.h index 07a3593e7c..ab9fc7ee64 100644 --- a/system/gd/hal/fuzz/fuzz_hci_hal.h +++ b/system/gd/hal/fuzz/fuzz_hci_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_backend.h b/system/gd/hal/hci_backend.h index 5c107ef8a1..657d771bbc 100644 --- a/system/gd/hal/hci_backend.h +++ b/system/gd/hal/hci_backend.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_backend_aidl.cc b/system/gd/hal/hci_backend_aidl.cc index 04bd67f992..93994c374d 100644 --- a/system/gd/hal/hci_backend_aidl.cc +++ b/system/gd/hal/hci_backend_aidl.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_backend_hidl.cc b/system/gd/hal/hci_backend_hidl.cc index 0fb2729307..79f69a44f0 100644 --- a/system/gd/hal/hci_backend_hidl.cc +++ b/system/gd/hal/hci_backend_hidl.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal.h b/system/gd/hal/hci_hal.h index d016d354f2..2c028c3b6f 100644 --- a/system/gd/hal/hci_hal.h +++ b/system/gd/hal/hci_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,6 +51,10 @@ public: // Send an ISO data packet from the controller to the host // @param data the ISO HCI packet to be passed to the host stack virtual void isoDataReceived(HciPacket data) = 0; + + // This function is invoked when the controller encounters an error requiring + // the Bluetooth stack to initiate a reset. + virtual void controllerNeedsReset() {} }; // Mirrors hardware/interfaces/bluetooth/1.0/IBluetoothHci.hal in Android @@ -101,9 +105,6 @@ public: // Get the MSFT opcode (as specified in Microsoft-defined Bluetooth HCI // extensions) virtual uint16_t getMsftOpcode() { return 0; } - - // Mark the controller as broken to prevent further read / write operation. - virtual void markControllerBroken() { return; } }; // LINT.ThenChange(fuzz/fuzz_hci_hal.h) diff --git a/system/gd/hal/hci_hal_android.cc b/system/gd/hal/hci_hal_android.cc index 8f1246d064..f548080d83 100644 --- a/system/gd/hal/hci_hal_android.cc +++ b/system/gd/hal/hci_hal_android.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_android_test.cc b/system/gd/hal/hci_hal_android_test.cc index 471e54bb70..247f15745f 100644 --- a/system/gd/hal/hci_hal_android_test.cc +++ b/system/gd/hal/hci_hal_android_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_fake.cc b/system/gd/hal/hci_hal_fake.cc index 7d396dd571..781dde6749 100644 --- a/system/gd/hal/hci_hal_fake.cc +++ b/system/gd/hal/hci_hal_fake.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_fake.h b/system/gd/hal/hci_hal_fake.h index 1d94f768ce..9d58064297 100644 --- a/system/gd/hal/hci_hal_fake.h +++ b/system/gd/hal/hci_hal_fake.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_host.cc b/system/gd/hal/hci_hal_host.cc index 970a2ae48c..bf020a2e02 100644 --- a/system/gd/hal/hci_hal_host.cc +++ b/system/gd/hal/hci_hal_host.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -262,9 +262,6 @@ public: void sendHciCommand(HciPacket command) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(command); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -275,9 +272,6 @@ public: void sendAclData(HciPacket data) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(data); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -288,10 +282,6 @@ public: void sendScoData(HciPacket data) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } - log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(data); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -302,9 +292,6 @@ public: void sendIsoData(HciPacket data) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(data); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -317,15 +304,6 @@ public: return os::Management::getInstance().getVendorSpecificCode(MGMT_VS_OPCODE_MSFT); } - void markControllerBroken() override { - std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - log::error("Controller already marked as broken!"); - return; - } - controller_broken_ = true; - } - protected: void ListDependencies(ModuleList* list) const { list->add<LinkClocker>(); } @@ -337,8 +315,7 @@ protected: // We don't want to crash when the chipset is broken. if (sock_fd_ == INVALID_FD) { log::error("Failed to connect to HCI socket. Aborting HAL initialization process."); - controller_broken_ = true; - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); return; } @@ -392,7 +369,6 @@ private: std::queue<std::vector<uint8_t>> hci_outgoing_queue_; SnoopLogger* btsnoop_logger_ = nullptr; LinkClocker* link_clocker_ = nullptr; - bool controller_broken_ = false; void write_to_fd(HciPacket packet) { // TODO(chromeos-bt-team@): replace this with new queue when it's ready @@ -414,8 +390,8 @@ private: hci_outgoing_queue_.pop(); if (bytes_written == -1) { log::error("Can't write to socket: {}", strerror(errno)); - markControllerBroken(); - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); + return; } if (hci_outgoing_queue_.empty()) { hci_incoming_thread_.GetReactor()->ModifyRegistration(reactable_, @@ -439,15 +415,13 @@ private: // we don't want crash when the chipset is broken. if (received_size == -1) { log::error("Can't receive from socket: {}", strerror(errno)); - markControllerBroken(); - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); return; } if (received_size == 0) { log::warn("Can't read H4 header. EOF received"); - markControllerBroken(); - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); return; } diff --git a/system/gd/hal/hci_hal_host.h b/system/gd/hal/hci_hal_host.h index 9f1350b265..42712d791a 100644 --- a/system/gd/hal/hci_hal_host.h +++ b/system/gd/hal/hci_hal_host.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_host_rootcanal.cc b/system/gd/hal/hci_hal_host_rootcanal.cc index 612372a962..065711059a 100644 --- a/system/gd/hal/hci_hal_host_rootcanal.cc +++ b/system/gd/hal/hci_hal_host_rootcanal.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_host_test.cc b/system/gd/hal/hci_hal_host_test.cc index 9f50867f59..4f4c6bc6d0 100644 --- a/system/gd/hal/hci_hal_host_test.cc +++ b/system/gd/hal/hci_hal_host_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/link_clocker.cc b/system/gd/hal/link_clocker.cc index f491e9ee1b..0a7ee8366a 100644 --- a/system/gd/hal/link_clocker.cc +++ b/system/gd/hal/link_clocker.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/link_clocker.h b/system/gd/hal/link_clocker.h index acabf0787b..34286bfd96 100644 --- a/system/gd/hal/link_clocker.h +++ b/system/gd/hal/link_clocker.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal.h b/system/gd/hal/ranging_hal.h index b22378970e..6966aedb0a 100644 --- a/system/gd/hal/ranging_hal.h +++ b/system/gd/hal/ranging_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal_android.cc b/system/gd/hal/ranging_hal_android.cc index 033ed789f0..086e651da2 100644 --- a/system/gd/hal/ranging_hal_android.cc +++ b/system/gd/hal/ranging_hal_android.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal_host.cc b/system/gd/hal/ranging_hal_host.cc index 59282dc422..78ce007068 100644 --- a/system/gd/hal/ranging_hal_host.cc +++ b/system/gd/hal/ranging_hal_host.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal_mock.h b/system/gd/hal/ranging_hal_mock.h index 328411353f..84696d3f64 100644 --- a/system/gd/hal/ranging_hal_mock.h +++ b/system/gd/hal/ranging_hal_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/serialize_packet.h b/system/gd/hal/serialize_packet.h index 70466fc164..9c13f4b671 100644 --- a/system/gd/hal/serialize_packet.h +++ b/system/gd/hal/serialize_packet.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger.cc b/system/gd/hal/snoop_logger.cc index a34e70162b..538d13ec3e 100644 --- a/system/gd/hal/snoop_logger.cc +++ b/system/gd/hal/snoop_logger.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger.h b/system/gd/hal/snoop_logger.h index f448eef4db..b009add89c 100644 --- a/system/gd/hal/snoop_logger.h +++ b/system/gd/hal/snoop_logger.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_socket_test.cc b/system/gd/hal/snoop_logger_socket_test.cc index 85642e37ed..b40f6f5bf3 100644 --- a/system/gd/hal/snoop_logger_socket_test.cc +++ b/system/gd/hal/snoop_logger_socket_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_socket_thread_test.cc b/system/gd/hal/snoop_logger_socket_thread_test.cc index a967a8d2a2..726f7ab245 100644 --- a/system/gd/hal/snoop_logger_socket_thread_test.cc +++ b/system/gd/hal/snoop_logger_socket_thread_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_test.cc b/system/gd/hal/snoop_logger_test.cc index de42db5c06..78d9bb54e4 100644 --- a/system/gd/hal/snoop_logger_test.cc +++ b/system/gd/hal/snoop_logger_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_tracing.cc b/system/gd/hal/snoop_logger_tracing.cc index 415aceab19..38ce3dec33 100644 --- a/system/gd/hal/snoop_logger_tracing.cc +++ b/system/gd/hal/snoop_logger_tracing.cc @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_tracing.h b/system/gd/hal/snoop_logger_tracing.h index 9b4bd7be9d..ccf2a60605 100644 --- a/system/gd/hal/snoop_logger_tracing.h +++ b/system/gd/hal/snoop_logger_tracing.h @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/socket_hal.h b/system/gd/hal/socket_hal.h index 3922e29da0..3a6fba43b9 100644 --- a/system/gd/hal/socket_hal.h +++ b/system/gd/hal/socket_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/socket_hal_android.cc b/system/gd/hal/socket_hal_android.cc index bdbf0a8663..4e206e3d35 100644 --- a/system/gd/hal/socket_hal_android.cc +++ b/system/gd/hal/socket_hal_android.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/socket_hal_host.cc b/system/gd/hal/socket_hal_host.cc index 292428a821..7ee57731cc 100644 --- a/system/gd/hal/socket_hal_host.cc +++ b/system/gd/hal/socket_hal_host.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_builder_test.cc b/system/gd/hci/acl_builder_test.cc index b23581e36f..6c78f0b1e9 100644 --- a/system/gd/hci/acl_builder_test.cc +++ b/system/gd/hci/acl_builder_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_connection_interface.h b/system/gd/hci/acl_connection_interface.h index f90b9909d1..ba700aca0b 100644 --- a/system/gd/hci/acl_connection_interface.h +++ b/system/gd/hci/acl_connection_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager.cc b/system/gd/hci/acl_manager.cc index 6da8b37a6d..26b0ce70eb 100644 --- a/system/gd/hci/acl_manager.cc +++ b/system/gd/hci/acl_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -260,11 +260,6 @@ void AclManager::CreateLeConnection(AddressWithType address_with_type, bool is_d CallOn(pimpl_->le_impl_, &le_impl::create_le_connection, address_with_type, true, is_direct); } -void AclManager::IsOnBackgroundList(AddressWithType address_with_type, std::promise<bool> promise) { - CallOn(pimpl_->le_impl_, &le_impl::is_on_background_connection_list, address_with_type, - std::move(promise)); -} - void AclManager::SetLeSuggestedDefaultDataParameters(uint16_t octets, uint16_t time) { CallOn(pimpl_->le_impl_, &le_impl::set_le_suggested_default_data_parameters, octets, time); } diff --git a/system/gd/hci/acl_manager.h b/system/gd/hci/acl_manager.h index 8326d479ab..2b3d523b1f 100644 --- a/system/gd/hci/acl_manager.h +++ b/system/gd/hci/acl_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -108,7 +108,6 @@ public: // connected virtual void CancelConnect(Address address); virtual void RemoveFromBackgroundList(AddressWithType address_with_type); - virtual void IsOnBackgroundList(AddressWithType address_with_type, std::promise<bool> promise); virtual void CancelLeConnect(AddressWithType address_with_type); diff --git a/system/gd/hci/acl_manager/acl_connection.cc b/system/gd/hci/acl_manager/acl_connection.cc index e616416f63..28605cc033 100644 --- a/system/gd/hci/acl_manager/acl_connection.cc +++ b/system/gd/hci/acl_manager/acl_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_connection.h b/system/gd/hci/acl_manager/acl_connection.h index 0a7e7d1f07..03fe48755d 100644 --- a/system/gd/hci/acl_manager/acl_connection.h +++ b/system/gd/hci/acl_manager/acl_connection.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_fragmenter.cc b/system/gd/hci/acl_manager/acl_fragmenter.cc index 3264ded78d..af0ced547e 100644 --- a/system/gd/hci/acl_manager/acl_fragmenter.cc +++ b/system/gd/hci/acl_manager/acl_fragmenter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_fragmenter.h b/system/gd/hci/acl_manager/acl_fragmenter.h index 28d14c1a3a..26fd7ea482 100644 --- a/system/gd/hci/acl_manager/acl_fragmenter.h +++ b/system/gd/hci/acl_manager/acl_fragmenter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_scheduler.cc b/system/gd/hci/acl_manager/acl_scheduler.cc index f7c47505af..65981d9c23 100644 --- a/system/gd/hci/acl_manager/acl_scheduler.cc +++ b/system/gd/hci/acl_manager/acl_scheduler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_scheduler.h b/system/gd/hci/acl_manager/acl_scheduler.h index c90ab11983..4c61461be1 100644 --- a/system/gd/hci/acl_manager/acl_scheduler.h +++ b/system/gd/hci/acl_manager/acl_scheduler.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_scheduler_test.cc b/system/gd/hci/acl_manager/acl_scheduler_test.cc index fa5b0fc164..21414c5925 100644 --- a/system/gd/hci/acl_manager/acl_scheduler_test.cc +++ b/system/gd/hci/acl_manager/acl_scheduler_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/assembler.h b/system/gd/hci/acl_manager/assembler.h index d126a980a2..00e63e1e38 100644 --- a/system/gd/hci/acl_manager/assembler.h +++ b/system/gd/hci/acl_manager/assembler.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_acl_connection.cc b/system/gd/hci/acl_manager/classic_acl_connection.cc index 301211c345..4a13a1335a 100644 --- a/system/gd/hci/acl_manager/classic_acl_connection.cc +++ b/system/gd/hci/acl_manager/classic_acl_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_acl_connection.h b/system/gd/hci/acl_manager/classic_acl_connection.h index 75dacf52d1..62c11b3196 100644 --- a/system/gd/hci/acl_manager/classic_acl_connection.h +++ b/system/gd/hci/acl_manager/classic_acl_connection.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_acl_connection_test.cc b/system/gd/hci/acl_manager/classic_acl_connection_test.cc index 32949927e7..e6167285c8 100644 --- a/system/gd/hci/acl_manager/classic_acl_connection_test.cc +++ b/system/gd/hci/acl_manager/classic_acl_connection_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_impl.h b/system/gd/hci/acl_manager/classic_impl.h index ecef1f9414..586b64549c 100644 --- a/system/gd/hci/acl_manager/classic_impl.h +++ b/system/gd/hci/acl_manager/classic_impl.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_impl_test.cc b/system/gd/hci/acl_manager/classic_impl_test.cc index 6b57eac662..11e89bb633 100644 --- a/system/gd/hci/acl_manager/classic_impl_test.cc +++ b/system/gd/hci/acl_manager/classic_impl_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_callbacks.h b/system/gd/hci/acl_manager/connection_callbacks.h index 8804b5ad9d..2998f20724 100644 --- a/system/gd/hci/acl_manager/connection_callbacks.h +++ b/system/gd/hci/acl_manager/connection_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_callbacks_mock.h b/system/gd/hci/acl_manager/connection_callbacks_mock.h index 64bd067db2..5018331c42 100644 --- a/system/gd/hci/acl_manager/connection_callbacks_mock.h +++ b/system/gd/hci/acl_manager/connection_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_management_callbacks.h b/system/gd/hci/acl_manager/connection_management_callbacks.h index 55d0062c0a..b4546a3a2d 100644 --- a/system/gd/hci/acl_manager/connection_management_callbacks.h +++ b/system/gd/hci/acl_manager/connection_management_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_management_callbacks_mock.h b/system/gd/hci/acl_manager/connection_management_callbacks_mock.h index e453ac99fc..eab69fcd39 100644 --- a/system/gd/hci/acl_manager/connection_management_callbacks_mock.h +++ b/system/gd/hci/acl_manager/connection_management_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acceptlist_callbacks.h b/system/gd/hci/acl_manager/le_acceptlist_callbacks.h index a7b7dd5f5e..d547a79c3c 100644 --- a/system/gd/hci/acl_manager/le_acceptlist_callbacks.h +++ b/system/gd/hci/acl_manager/le_acceptlist_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acl_connection.cc b/system/gd/hci/acl_manager/le_acl_connection.cc index 8e6f93be08..3b40ddc52c 100644 --- a/system/gd/hci/acl_manager/le_acl_connection.cc +++ b/system/gd/hci/acl_manager/le_acl_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acl_connection.h b/system/gd/hci/acl_manager/le_acl_connection.h index 5052be51a7..35ef292708 100644 --- a/system/gd/hci/acl_manager/le_acl_connection.h +++ b/system/gd/hci/acl_manager/le_acl_connection.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acl_connection_test.cc b/system/gd/hci/acl_manager/le_acl_connection_test.cc index 5153fa4d3b..403f3fd9c4 100644 --- a/system/gd/hci/acl_manager/le_acl_connection_test.cc +++ b/system/gd/hci/acl_manager/le_acl_connection_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_callbacks.h b/system/gd/hci/acl_manager/le_connection_callbacks.h index 2359c5ac32..c33dbbbe33 100644 --- a/system/gd/hci/acl_manager/le_connection_callbacks.h +++ b/system/gd/hci/acl_manager/le_connection_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_callbacks_mock.h b/system/gd/hci/acl_manager/le_connection_callbacks_mock.h index fca3e93b89..4866ed8e29 100644 --- a/system/gd/hci/acl_manager/le_connection_callbacks_mock.h +++ b/system/gd/hci/acl_manager/le_connection_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_management_callbacks.h b/system/gd/hci/acl_manager/le_connection_management_callbacks.h index 6ac56af029..d7b33c64b7 100644 --- a/system/gd/hci/acl_manager/le_connection_management_callbacks.h +++ b/system/gd/hci/acl_manager/le_connection_management_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h b/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h index bfbd214779..280dd7a860 100644 --- a/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h +++ b/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_impl.h b/system/gd/hci/acl_manager/le_impl.h index ac3e7171f9..ce93f46e7e 100644 --- a/system/gd/hci/acl_manager/le_impl.h +++ b/system/gd/hci/acl_manager/le_impl.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,11 +39,11 @@ #include "hci/hci_packets.h" #include "hci/le_address_manager.h" #include "macros.h" +#include "main/shim/metrics_api.h" #include "os/alarm.h" #include "os/handler.h" #include "os/system_properties.h" #include "stack/include/btm_ble_api_types.h" -#include "stack/include/stack_metrics_logging.h" namespace bluetooth { namespace hci { @@ -426,7 +426,7 @@ public: return; } - log_le_connection_status(address, true /* is_connect */, status); + bluetooth::shim::LogMetricLeConnectionStatus(address, true /* is_connect */, status); const bool in_filter_accept_list = is_device_in_accept_list(remote_address); @@ -586,7 +586,8 @@ public: arm_on_resume_ = true; add_device_to_accept_list(remote_address); } - log_le_connection_status(remote_address.GetAddress(), false /* is_connect */, reason); + bluetooth::shim::LogMetricLeConnectionStatus(remote_address.GetAddress(), + false /* is_connect */, reason); } void on_le_connection_update_complete(LeMetaEventView view) { @@ -724,7 +725,8 @@ public: } void add_device_to_accept_list(AddressWithType address_with_type) { - log_le_device_in_accept_list(address_with_type.GetAddress(), true /* is_add */); + bluetooth::shim::LogMetricLeDeviceInAcceptList(address_with_type.GetAddress(), + true /* is_add */); if (connections.alreadyConnected(address_with_type)) { log::info("Device already connected, return"); return; @@ -747,7 +749,8 @@ public: } void remove_device_from_accept_list(AddressWithType address_with_type) { - log_le_device_in_accept_list(address_with_type.GetAddress(), false /* is_add */); + bluetooth::shim::LogMetricLeDeviceInAcceptList(address_with_type.GetAddress(), + false /* is_add */); if (accept_list.find(address_with_type) == accept_list.end()) { log::warn("Device not in acceptlist and cannot be removed: {}", address_with_type); return; @@ -1132,8 +1135,9 @@ public: remove_device_from_accept_list(address_with_type); } // Temporary mapping the error code to PAGE_TIMEOUT - log_le_connection_completion(address_with_type.GetAddress(), ErrorCode::PAGE_TIMEOUT, - true /* is locally initiated */); + bluetooth::shim::LogMetricLeConnectionCompletion(address_with_type.GetAddress(), + ErrorCode::PAGE_TIMEOUT, + true /* is locally initiated */); le_client_handler_->Post(common::BindOnce( &LeConnectionCallbacks::OnLeConnectFail, common::Unretained(le_client_callbacks_), address_with_type, ErrorCode::CONNECTION_ACCEPT_TIMEOUT)); @@ -1249,12 +1253,6 @@ public: background_connections_.erase(address_with_type); } - void is_on_background_connection_list(AddressWithType address_with_type, - std::promise<bool> promise) { - promise.set_value(background_connections_.find(address_with_type) != - background_connections_.end()); - } - void OnPause() override { // bluetooth::hci::LeAddressManagerCallback if (!address_manager_registered) { log::warn("Unregistered!"); diff --git a/system/gd/hci/acl_manager/le_impl_test.cc b/system/gd/hci/acl_manager/le_impl_test.cc index d43d2faca1..66bc16bbd8 100644 --- a/system/gd/hci/acl_manager/le_impl_test.cc +++ b/system/gd/hci/acl_manager/le_impl_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/round_robin_scheduler.cc b/system/gd/hci/acl_manager/round_robin_scheduler.cc index 6abf838728..ad0e6dc621 100644 --- a/system/gd/hci/acl_manager/round_robin_scheduler.cc +++ b/system/gd/hci/acl_manager/round_robin_scheduler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/round_robin_scheduler.h b/system/gd/hci/acl_manager/round_robin_scheduler.h index 61be5f1147..080ce0988f 100644 --- a/system/gd/hci/acl_manager/round_robin_scheduler.h +++ b/system/gd/hci/acl_manager/round_robin_scheduler.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/round_robin_scheduler_test.cc b/system/gd/hci/acl_manager/round_robin_scheduler_test.cc index f2c9b5528b..25bd2aff80 100644 --- a/system/gd/hci/acl_manager/round_robin_scheduler_test.cc +++ b/system/gd/hci/acl_manager/round_robin_scheduler_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager_mock.h b/system/gd/hci/acl_manager_mock.h index 330b82bdac..75af214e5b 100644 --- a/system/gd/hci/acl_manager_mock.h +++ b/system/gd/hci/acl_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager_test.cc b/system/gd/hci/acl_manager_test.cc index e0a1c6674a..8b33dc723e 100644 --- a/system/gd/hci/acl_manager_test.cc +++ b/system/gd/hci/acl_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager_unittest.cc b/system/gd/hci/acl_manager_unittest.cc index bfb132594c..848141da0b 100644 --- a/system/gd/hci/acl_manager_unittest.cc +++ b/system/gd/hci/acl_manager_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/address_unittest.cc b/system/gd/hci/address_unittest.cc index 0254545631..ee81f975f6 100644 --- a/system/gd/hci/address_unittest.cc +++ b/system/gd/hci/address_unittest.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/address_with_type.h b/system/gd/hci/address_with_type.h index 26c35e814d..b2a662bcae 100644 --- a/system/gd/hci/address_with_type.h +++ b/system/gd/hci/address_with_type.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/address_with_type_test.cc b/system/gd/hci/address_with_type_test.cc index c3b8bb0db9..9128bf1f57 100644 --- a/system/gd/hci/address_with_type_test.cc +++ b/system/gd/hci/address_with_type_test.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/class_of_device_unittest.cc b/system/gd/hci/class_of_device_unittest.cc index 1d3f4f8f3a..4bcedfd84d 100644 --- a/system/gd/hci/class_of_device_unittest.cc +++ b/system/gd/hci/class_of_device_unittest.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/command_interface.h b/system/gd/hci/command_interface.h index a6781ef7c5..56b6b5f63f 100644 --- a/system/gd/hci/command_interface.h +++ b/system/gd/hci/command_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller.cc b/system/gd/hci/controller.cc index eaba7da848..919643f14d 100644 --- a/system/gd/hci/controller.cc +++ b/system/gd/hci/controller.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -61,9 +61,7 @@ struct Controller::impl { handler->BindOn(this, &Controller::impl::NumberOfCompletedPackets)); set_event_mask(kDefaultEventMask); - if (com::android::bluetooth::flags::encryption_change_v2()) { - set_event_mask_page_2(kDefaultEventMaskPage2); - } + set_event_mask_page_2(kDefaultEventMaskPage2); write_le_host_support(Enable::ENABLED, Enable::DISABLED); hci_->EnqueueCommand( diff --git a/system/gd/hci/controller.h b/system/gd/hci/controller.h index 70609950da..6a35bb691f 100644 --- a/system/gd/hci/controller.h +++ b/system/gd/hci/controller.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_interface.h b/system/gd/hci/controller_interface.h index a9ebecd32a..a2a7b64c18 100644 --- a/system/gd/hci/controller_interface.h +++ b/system/gd/hci/controller_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_interface_mock.h b/system/gd/hci/controller_interface_mock.h index 36bc50a423..8b21585009 100644 --- a/system/gd/hci/controller_interface_mock.h +++ b/system/gd/hci/controller_interface_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_mock.h b/system/gd/hci/controller_mock.h index fd3a7058d1..e39d721126 100644 --- a/system/gd/hci/controller_mock.h +++ b/system/gd/hci/controller_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_test.cc b/system/gd/hci/controller_test.cc index fca2d3e9e2..e680a8598e 100644 --- a/system/gd/hci/controller_test.cc +++ b/system/gd/hci/controller_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_unittest.cc b/system/gd/hci/controller_unittest.cc index 6ab8d4d68b..cb90589637 100644 --- a/system/gd/hci/controller_unittest.cc +++ b/system/gd/hci/controller_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/distance_measurement_interface.h b/system/gd/hci/distance_measurement_interface.h index 9b6e7727c3..055d9e875c 100644 --- a/system/gd/hci/distance_measurement_interface.h +++ b/system/gd/hci/distance_measurement_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/distance_measurement_manager.cc b/system/gd/hci/distance_measurement_manager.cc index c4761c9646..6e57f2c9d5 100644 --- a/system/gd/hci/distance_measurement_manager.cc +++ b/system/gd/hci/distance_measurement_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -441,6 +441,8 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { it->second.measurement_ongoing = true; it->second.waiting_for_start_callback = true; it->second.local_hci_role = local_hci_role; + it->second.retry_counter_for_create_config = 0; + it->second.retry_counter_for_cs_enable = 0; return true; } @@ -845,6 +847,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { static void reset_tracker_on_stopped(CsTracker& cs_tracker) { cs_tracker.measurement_ongoing = false; cs_tracker.state = CsTrackerState::STOPPED; + cs_tracker.procedure_data_list.clear(); } void handle_cs_setup_failure(uint16_t connection_handle, DistanceMeasurementErrorCode errorCode) { @@ -906,7 +909,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { if (cs_requester_trackers_.find(connection_handle) != cs_requester_trackers_.end()) { reset_tracker_on_stopped(cs_requester_trackers_[connection_handle]); } - } else if (status_view.GetStatus() != ErrorCode::SUCCESS) { + } else if (enable == Enable::ENABLED && status_view.GetStatus() != ErrorCode::SUCCESS) { if (cs_requester_trackers_.count(connection_handle) == 0) { log::error("Error code {} for connection_handle {}. No request tracker found.", ErrorCodeText(status), connection_handle); @@ -919,6 +922,14 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { if (cs_requester_trackers_[connection_handle].retry_counter_for_cs_enable++ >= kMaxRetryCounterForCsEnable) { handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); + } else { + cs_requester_trackers_[connection_handle].procedure_schedule_guard_alarm->Cancel(); + log::info("schedule next procedure enable after {} ms", + cs_requester_trackers_[connection_handle].interval_ms); + cs_requester_trackers_[connection_handle].procedure_schedule_guard_alarm->Schedule( + common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this), + connection_handle, Enable::ENABLED), + std::chrono::milliseconds(cs_requester_trackers_[connection_handle].interval_ms)); } } } @@ -1237,25 +1248,8 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { void on_cs_procedure_enable_complete(LeCsProcedureEnableCompleteView event_view) { log::assert_that(event_view.IsValid(), "assert failed: event_view.IsValid()"); uint16_t connection_handle = event_view.GetConnectionHandle(); - log::debug("on cs procedure enabled complete"); - if (event_view.GetStatus() != ErrorCode::SUCCESS) { - std::string error_code = ErrorCodeText(event_view.GetStatus()); - if (cs_requester_trackers_.count(connection_handle) == 0) { - log::warn( - "Received LeCsProcedureEnableCompleteView with error code {}, No request tracker " - "found", - error_code); - handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); - return; - } - log::warn("Received LeCsProcedureEnableCompleteView with error code {}. Retry counter {}", - error_code, cs_requester_trackers_[connection_handle].retry_counter_for_cs_enable); - if (cs_requester_trackers_[connection_handle].retry_counter_for_cs_enable++ >= - kMaxRetryCounterForCsEnable) { - handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); - } - return; - } + log::debug("Procedure enabled, {}", event_view.ToString()); + uint8_t config_id = event_view.GetConfigId(); CsTracker* live_tracker = nullptr; @@ -1272,7 +1266,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states, valid_responder_states); if (live_tracker == nullptr) { - log::error("no tracker is available for {}", connection_handle); + log::error("enable - no tracker is available for {}", connection_handle); return; } if (live_tracker->used_config_id != config_id) { @@ -1280,7 +1274,22 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { live_tracker->used_config_id); return; } - log::debug("Procedure enabled, {}", event_view.ToString()); + + if (live_tracker->local_start && event_view.GetStatus() != ErrorCode::SUCCESS) { + log::warn("Received LeCsProcedureEnableCompleteView with error code {}. Retry counter {}", + ErrorCodeText(event_view.GetStatus()), live_tracker->retry_counter_for_cs_enable); + if (live_tracker->retry_counter_for_cs_enable++ >= kMaxRetryCounterForCsEnable) { + handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); + } else { + live_tracker->procedure_schedule_guard_alarm->Cancel(); + log::info("schedule next procedure enable after {} ms", live_tracker->interval_ms); + live_tracker->procedure_schedule_guard_alarm->Schedule( + common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this), + connection_handle, Enable::ENABLED), + std::chrono::milliseconds(live_tracker->interval_ms)); + } + return; + } live_tracker->state = CsTrackerState::STARTED; live_tracker->selected_tx_power = event_view.GetSelectedTxPower(); live_tracker->n_procedure_count = event_view.GetProcedureCount(); @@ -1297,38 +1306,45 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { if (live_tracker->n_procedure_count >= 1) { live_tracker->procedure_schedule_guard_alarm->Cancel(); log::info("schedule next procedure enable after {} ms", schedule_interval); - cs_requester_trackers_[connection_handle].procedure_schedule_guard_alarm->Schedule( + live_tracker->procedure_schedule_guard_alarm->Schedule( common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this), connection_handle, Enable::ENABLED), std::chrono::milliseconds(schedule_interval)); } - } - if (live_tracker->local_start && live_tracker->waiting_for_start_callback) { - live_tracker->waiting_for_start_callback = false; - distance_measurement_callbacks_->OnDistanceMeasurementStarted(live_tracker->address, - METHOD_CS); - } - if (live_tracker->local_start && is_hal_v2()) { - // reset the procedure sequence - live_tracker->procedure_sequence_after_enable = -1; - ranging_hal_->UpdateProcedureEnableConfig(connection_handle, event_view); + if (live_tracker->waiting_for_start_callback) { + live_tracker->waiting_for_start_callback = false; + distance_measurement_callbacks_->OnDistanceMeasurementStarted(live_tracker->address, + METHOD_CS); + } + if (is_hal_v2()) { + // reset the procedure sequence + live_tracker->procedure_sequence_after_enable = -1; + ranging_hal_->UpdateProcedureEnableConfig(connection_handle, event_view); + } } } else if (event_view.GetState() == Enable::DISABLED) { - uint8_t valid_requester_states = static_cast<uint8_t>(CsTrackerState::STARTED); - uint8_t valid_responder_states = static_cast<uint8_t>(CsTrackerState::STARTED); - live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states, - valid_responder_states); - if (live_tracker == nullptr) { - log::error("no tracker is available for {}", connection_handle); - return; + if (event_view.GetStatus() == ErrorCode::SUCCESS) { + // local or remote host requested it. + uint8_t valid_requester_states = static_cast<uint8_t>(CsTrackerState::STARTED); + uint8_t valid_responder_states = static_cast<uint8_t>(CsTrackerState::STARTED); + live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states, + valid_responder_states); + if (live_tracker == nullptr) { + log::error("disable - no tracker is available for {}", connection_handle); + return; + } + reset_tracker_on_stopped(*live_tracker); + } else { + // work around, controller may send 'DISABLE' complete with error for 'ENABLE' command + auto req_it = cs_requester_trackers_.find(connection_handle); + if (req_it != cs_requester_trackers_.end() && + req_it->second.state == CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED && + config_id == req_it->second.used_config_id) { + log::warn("expect ENABLE complete, bug got DISABLE complete."); + handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); + } } - reset_tracker_on_stopped(*live_tracker); - } - // reset the procedure data list. - std::vector<CsProcedureData>& data_list = live_tracker->procedure_data_list; - while (!data_list.empty()) { - data_list.erase(data_list.begin()); } } diff --git a/system/gd/hci/distance_measurement_manager.h b/system/gd/hci/distance_measurement_manager.h index c0f3cae654..9d13e50cd1 100644 --- a/system/gd/hci/distance_measurement_manager.h +++ b/system/gd/hci/distance_measurement_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/distance_measurement_manager_mock.h b/system/gd/hci/distance_measurement_manager_mock.h index f08c6db45a..ba9919af9e 100644 --- a/system/gd/hci/distance_measurement_manager_mock.h +++ b/system/gd/hci/distance_measurement_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/distance_measurement_manager_test.cc b/system/gd/hci/distance_measurement_manager_test.cc index 0dbf778fd0..35a629c53a 100644 --- a/system/gd/hci/distance_measurement_manager_test.cc +++ b/system/gd/hci/distance_measurement_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,8 @@ #include <gmock/gmock.h> #include <gtest/gtest.h> +#include "common/bind.h" +#include "common/strings.h" #include "hal/ranging_hal.h" #include "hal/ranging_hal_mock.h" #include "hci/acl_manager_mock.h" @@ -31,14 +33,20 @@ #include "hci/hci_layer.h" #include "hci/hci_layer_fake.h" #include "module.h" +#include "os/fake_timer/fake_timerfd.h" #include "packet/packet_view.h" #include "ras/ras_packets.h" +using bluetooth::os::fake_timer::fake_timerfd_advance; +using bluetooth::os::fake_timer::fake_timerfd_reset; +using testing::_; using testing::AtLeast; using testing::Return; namespace { -constexpr auto kTimeout = std::chrono::seconds(1); +static constexpr auto kTimeout = std::chrono::seconds(1); +static constexpr uint8_t kMaxRetryCounterForCreateConfig = 0x03; +static constexpr uint8_t kMaxRetryCounterForCsEnable = 0x03; } namespace bluetooth { @@ -52,6 +60,9 @@ protected: }; class TestAclManager : public testing::MockAclManager { +public: + void AddDeviceToRelaxedConnectionIntervalList(const Address /*address*/) override {} + protected: void Start() override {} void Stop() override {} @@ -65,7 +76,7 @@ struct CsReadCapabilitiesCompleteEvent { uint8_t num_antennas_supported = 2; uint8_t max_antenna_paths_supported = 4; CsRoleSupported roles_supported = {/*initiator=*/1, /*reflector=*/1}; - CsOptionalModesSupported modes_supported = {/*mode_3=*/1}; + unsigned char modes_supported = {/*mode_3=*/1}; CsRttCapability rtt_capability = {/*rtt_aa_only_n=*/1, /*rtt_sounding_n=*/1, /*rtt_random_payload_n=*/1}; uint8_t rtt_aa_only_n = 1; @@ -74,7 +85,7 @@ struct CsReadCapabilitiesCompleteEvent { CsOptionalNadmSoundingCapability nadm_sounding_capability = { /*normalized_attack_detector_metric=*/1}; CsOptionalNadmRandomCapability nadm_random_capability = {/*normalized_attack_detector_metric=*/1}; - CsOptionalCsSyncPhysSupported cs_sync_phys_supported = {/*le_2m_phy=*/1}; + CsOptionalCsSyncPhysSupported cs_sync_phys_supported = {/*le_2m_phy=*/1, /*le_2m_2bt_phy=*/0}; CsOptionalSubfeaturesSupported subfeatures_supported = {/*no_frequency_actuation_error=*/1, /*channel_selection_algorithm=*/1, /*phase_based_ranging=*/1}; @@ -101,6 +112,53 @@ struct CsReadCapabilitiesCompleteEvent { uint8_t tx_snr_capability = 1; }; +struct CsConfigCompleteEvent { + ErrorCode status = ErrorCode::SUCCESS; + uint8_t config_id = 0; + CsAction action = CsAction::CONFIG_CREATED; + CsMainModeType main_mode_type = CsMainModeType::MODE_2; + CsSubModeType sub_mode_type = CsSubModeType::UNUSED; + uint8_t min_main_mode_steps = 3; // 0x02 to 0xFF + uint8_t max_main_mode_steps = 100; // 0x02 to 0xFF + uint8_t main_mode_repetition = 0; // 0x00 to 0x03 + uint8_t mode_0_steps = 1; // 0x01 to 0x03 + CsRole cs_role = CsRole::INITIATOR; + CsRttType rtt_type = CsRttType::RTT_AA_ONLY; + CsSyncPhy sync_phy = CsSyncPhy::LE_2M_PHY; + std::array<uint8_t, 10> channel_map = GetChannelMap("1FFFFFFFFFFFFC7FFFFC"); + uint8_t channel_map_repetition = 1; // 0x01 to 0xFF + CsChannelSelectionType channel_selection_type = CsChannelSelectionType::TYPE_3C; + CsCh3cShape ch3c_shape = CsCh3cShape::HAT_SHAPE; + uint8_t ch3c_jump = 2; // 0x02 to 0x08 + uint8_t t_ip1_time = 0x0A; // 0x0A, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x50, or 0x91 + uint8_t t_ip2_time = 0x0A; // 0x0A, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x50, or 0x91 + uint8_t t_fcs_time = 0x0F; // 0x0F, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x50, 0x64, 0x78, or 0x96 + uint8_t t_pm_time = 0x0A; // 0x0A, 0x14, or 0x28 + + static const std::array<uint8_t, 10> GetChannelMap(const std::string& hex_string) { + assert(hex_stinrg.length() == 20); + auto channel_vector = common::FromHexString(hex_string); + std::array<uint8_t, 10> channel_map{}; + std::copy(channel_vector->begin(), channel_vector->end(), channel_map.begin()); + std::reverse(channel_map.begin(), channel_map.end()); + return channel_map; + } +}; + +struct CsProcedureEnableCompleteEvent { + ErrorCode status = ErrorCode::SUCCESS; + uint8_t config_id = 0; + uint8_t tone_antenna_config_selection = 0; + uint8_t selected_tx_power = 0; // -127 to 20 dBm + uint32_t subevent_len = 2500; // 1250us to 4s + uint8_t subevents_per_event = 1; // 0x01 to 0x20 + uint16_t subevent_interval = 1; // N x 0.625ms + uint16_t event_interval = 0; // number of acl conn interval + uint16_t procedure_interval = 2; // number of acl conn interval + uint16_t procedure_count = 5; // 0x0001 to 0xFFFF + uint16_t max_procedure_len = 10; // N x 0.625 ms +}; + struct StartMeasurementParameters { Address remote_address = Address::FromString("12:34:56:78:9a:bc").value(); uint16_t connection_handle = 64; @@ -126,6 +184,7 @@ protected: EXPECT_CALL(*mock_controller_, SupportsBleChannelSounding()).WillOnce(Return(true)); EXPECT_CALL(*mock_ranging_hal_, IsBound()).Times(AtLeast(1)).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_ranging_hal_, GetRangingHalVersion).WillRepeatedly(Return(hal::V_2)); handler_ = fake_registry_.GetTestHandler(); dm_manager_ = fake_registry_.Start<DistanceMeasurementManager>(&thread_, handler_); @@ -145,6 +204,19 @@ protected: return dm_session_promise_->get_future(); } + std::future<void> fake_timer_advance(uint64_t ms) { + std::promise<void> promise; + auto future = promise.get_future(); + handler_->Post(common::BindOnce( + [](std::promise<void> promise, uint64_t ms) { + fake_timerfd_advance(ms); + promise.set_value(); + }, + common::Passed(std::move(promise)), ms)); + + return future; + } + void sync_client_handler() { log::assert_that(thread_.GetReactor()->WaitForIdle(kTimeout), "assert failed: thread_.GetReactor()->WaitForIdle(kTimeout)"); @@ -172,6 +244,55 @@ protected: cs_cap_complete_event.t_sw_time_supported, cs_cap_complete_event.tx_snr_capability); } + static std::unique_ptr<LeCsReadRemoteSupportedCapabilitiesCompleteBuilder> + GetRemoteSupportedCapabilitiesCompleteEvent( + uint16_t connection_handle, + const CsReadCapabilitiesCompleteEvent& cs_cap_complete_event) { + return LeCsReadRemoteSupportedCapabilitiesCompleteBuilder::Create( + cs_cap_complete_event.error_code, connection_handle, + cs_cap_complete_event.num_config_supported, + cs_cap_complete_event.max_consecutive_procedures_supported, + cs_cap_complete_event.num_antennas_supported, + cs_cap_complete_event.max_antenna_paths_supported, + cs_cap_complete_event.roles_supported, cs_cap_complete_event.modes_supported, + cs_cap_complete_event.rtt_capability, cs_cap_complete_event.rtt_aa_only_n, + cs_cap_complete_event.rtt_sounding_n, cs_cap_complete_event.rtt_random_payload_n, + cs_cap_complete_event.nadm_sounding_capability, + cs_cap_complete_event.nadm_random_capability, + cs_cap_complete_event.cs_sync_phys_supported, + cs_cap_complete_event.subfeatures_supported, + cs_cap_complete_event.t_ip1_times_supported, + cs_cap_complete_event.t_ip2_times_supported, + cs_cap_complete_event.t_fcs_times_supported, cs_cap_complete_event.t_pm_times_supported, + cs_cap_complete_event.t_sw_time_supported, cs_cap_complete_event.tx_snr_capability); + } + + static std::unique_ptr<LeCsConfigCompleteBuilder> GetConfigCompleteEvent( + uint16_t connection_handle, CsConfigCompleteEvent complete_event) { + return LeCsConfigCompleteBuilder::Create( + complete_event.status, connection_handle, complete_event.config_id, + complete_event.action, complete_event.main_mode_type, complete_event.sub_mode_type, + complete_event.min_main_mode_steps, complete_event.max_main_mode_steps, + complete_event.main_mode_repetition, complete_event.mode_0_steps, + complete_event.cs_role, complete_event.rtt_type, complete_event.sync_phy, + complete_event.channel_map, complete_event.channel_map_repetition, + complete_event.channel_selection_type, complete_event.ch3c_shape, + complete_event.ch3c_jump, complete_event.t_ip1_time, complete_event.t_ip2_time, + complete_event.t_fcs_time, complete_event.t_pm_time); + } + + static std::unique_ptr<LeCsProcedureEnableCompleteBuilder> GetProcedureEnableCompleteEvent( + uint16_t connection_handle, Enable enable, + CsProcedureEnableCompleteEvent complete_event) { + return LeCsProcedureEnableCompleteBuilder::Create( + complete_event.status, connection_handle, complete_event.config_id, enable, + complete_event.tone_antenna_config_selection, complete_event.selected_tx_power, + complete_event.subevent_len, complete_event.subevents_per_event, + complete_event.subevent_interval, complete_event.event_interval, + complete_event.procedure_interval, complete_event.procedure_count, + complete_event.max_procedure_len); + } + void StartMeasurement(const StartMeasurementParameters& params) { dm_manager_->StartDistanceMeasurement(params.remote_address, params.connection_handle, params.local_hci_role, params.interval, params.method); @@ -183,6 +304,72 @@ protected: GetLocalSupportedCapabilitiesCompleteEvent(read_cs_complete_event)); } + void StartMeasurementTillRasConnectedEvent(const StartMeasurementParameters& params) { + ReceivedReadLocalCapabilitiesComplete(); + EXPECT_CALL(*mock_ranging_hal_, OpenSession(_, _, _)) + .WillOnce([this](uint16_t connection_handle, uint16_t /*att_handle*/, + const std::vector<hal::VendorSpecificCharacteristic>& + vendor_specific_data) { + mock_ranging_hal_->GetRangingHalCallback()->OnOpened(connection_handle, + vendor_specific_data); + }); + StartMeasurement(params); + dm_manager_->HandleRasClientConnectedEvent( + params.remote_address, params.connection_handle, + /*att_handle=*/0, + /*vendor_specific_data=*/std::vector<hal::VendorSpecificCharacteristic>(), + /*conn_interval=*/24); + } + + void StartMeasurementTillReadRemoteCaps(const StartMeasurementParameters& params) { + StartMeasurementTillRasConnectedEvent(params); + + test_hci_layer_->GetCommand(OpCode::LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES); + CsReadCapabilitiesCompleteEvent read_cs_complete_event; + test_hci_layer_->IncomingEvent(LeCsReadRemoteSupportedCapabilitiesStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xFF)); + test_hci_layer_->IncomingLeMetaEvent(GetRemoteSupportedCapabilitiesCompleteEvent( + params.connection_handle, read_cs_complete_event)); + + test_hci_layer_->GetCommand(OpCode::LE_CS_SET_DEFAULT_SETTINGS); + test_hci_layer_->IncomingEvent(LeCsSetDefaultSettingsCompleteBuilder::Create( + /*num_hci_command_packets=*/static_cast<uint8_t>(0xEE), ErrorCode::SUCCESS, + params.connection_handle)); + } + + void StartMeasurementTillCreateConfig(const StartMeasurementParameters& params) { + StartMeasurementTillReadRemoteCaps(params); + + CsConfigCompleteEvent cs_config_complete_event; + test_hci_layer_->GetCommand(OpCode::LE_CS_CREATE_CONFIG); + test_hci_layer_->IncomingEvent(LeCsCreateConfigStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xFF)); + test_hci_layer_->IncomingLeMetaEvent( + GetConfigCompleteEvent(params.connection_handle, cs_config_complete_event)); + } + + void StartMeasurementTillSecurityEnable(const StartMeasurementParameters& params) { + StartMeasurementTillCreateConfig(params); + + test_hci_layer_->GetCommand(OpCode::LE_CS_SECURITY_ENABLE); + test_hci_layer_->IncomingEvent(LeCsSecurityEnableStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xFF)); + test_hci_layer_->IncomingLeMetaEvent(LeCsSecurityEnableCompleteBuilder::Create( + ErrorCode::SUCCESS, params.connection_handle)); + } + + void StartMeasurementTillSetProcedureParameters(const StartMeasurementParameters& params) { + StartMeasurementTillSecurityEnable(params); + + test_hci_layer_->GetCommand(OpCode::LE_CS_SET_PROCEDURE_PARAMETERS); + test_hci_layer_->IncomingEvent(LeCsSetProcedureParametersCompleteBuilder::Create( + /*num_hci_command_packets=*/static_cast<uint8_t>(0xEE), ErrorCode::SUCCESS, + params.connection_handle)); + } + protected: TestModuleRegistry fake_registry_; HciLayerFake* test_hci_layer_ = nullptr; @@ -250,6 +437,193 @@ TEST_F(DistanceMeasurementManagerTest, ras_remote_not_support) { dm_session_future.wait_for(kTimeout); sync_client_handler(); } + +TEST_F(DistanceMeasurementManagerTest, error_read_remote_cs_caps_command) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillRasConnectedEvent(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES); + test_hci_layer_->IncomingEvent(LeCsReadRemoteSupportedCapabilitiesStatusBuilder::Create( + /*status=*/ErrorCode::COMMAND_DISALLOWED, + /*num_hci_command_packets=*/0xff)); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, fail_read_remote_cs_caps_complete) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillRasConnectedEvent(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES); + CsReadCapabilitiesCompleteEvent read_cs_complete_event; + read_cs_complete_event.error_code = ErrorCode::COMMAND_DISALLOWED; + test_hci_layer_->IncomingLeMetaEvent(GetRemoteSupportedCapabilitiesCompleteEvent( + params.connection_handle, read_cs_complete_event)); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, error_create_config_command) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillReadRemoteCaps(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_CREATE_CONFIG); + test_hci_layer_->IncomingEvent(LeCsCreateConfigStatusBuilder::Create( + /*status=*/ErrorCode::COMMAND_DISALLOWED, + /*num_hci_command_packets=*/0xff)); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, fail_create_config_complete) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillReadRemoteCaps(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + CsConfigCompleteEvent cs_config_complete_event; + cs_config_complete_event.status = ErrorCode::COMMAND_DISALLOWED; + for (int i = 0; i <= kMaxRetryCounterForCreateConfig; i++) { + test_hci_layer_->GetCommand(OpCode::LE_CS_CREATE_CONFIG); + test_hci_layer_->IncomingLeMetaEvent( + GetConfigCompleteEvent(params.connection_handle, cs_config_complete_event)); + } + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, retry_fail_procedure_enable_command) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillSetProcedureParameters(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + for (int i = 0; i <= kMaxRetryCounterForCsEnable; i++) { + test_hci_layer_->GetCommand(OpCode::LE_CS_PROCEDURE_ENABLE); + test_hci_layer_->IncomingEvent(LeCsProcedureEnableStatusBuilder::Create( + /*status=*/ErrorCode::COMMAND_DISALLOWED, + /*num_hci_command_packets=*/0xff)); + auto future = fake_timer_advance(params.interval + 10); + future.wait_for(kTimeout); + sync_client_handler(); + } + fake_timerfd_reset(); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, retry_fail_procedure_enable_complete) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillSetProcedureParameters(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + CsProcedureEnableCompleteEvent complete_event; + complete_event.status = ErrorCode::LINK_LAYER_COLLISION; + for (int i = 0; i <= kMaxRetryCounterForCsEnable; i++) { + test_hci_layer_->GetCommand(OpCode::LE_CS_PROCEDURE_ENABLE); + test_hci_layer_->IncomingEvent(LeCsProcedureEnableStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xff)); + test_hci_layer_->IncomingLeMetaEvent(GetProcedureEnableCompleteEvent( + params.connection_handle, Enable::ENABLED, complete_event)); + auto future = fake_timer_advance(params.interval + 10); + future.wait_for(kTimeout); + sync_client_handler(); + } + fake_timerfd_reset(); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, unexpected_procedure_enable_complete_as_disable) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillSetProcedureParameters(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_PROCEDURE_ENABLE); + test_hci_layer_->IncomingEvent(LeCsProcedureEnableStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xff)); + CsProcedureEnableCompleteEvent complete_event; + complete_event.status = ErrorCode::LINK_LAYER_COLLISION; + test_hci_layer_->IncomingLeMetaEvent(GetProcedureEnableCompleteEvent( + params.connection_handle, Enable::DISABLED, complete_event)); + + sync_client_handler(); +} + } // namespace } // namespace hci } // namespace bluetooth diff --git a/system/gd/hci/enum_helper.h b/system/gd/hci/enum_helper.h index 43ac2f92a1..ad97c318e5 100644 --- a/system/gd/hci/enum_helper.h +++ b/system/gd/hci/enum_helper.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/event_checkers.h b/system/gd/hci/event_checkers.h index a484f5752e..8263f238df 100644 --- a/system/gd/hci/event_checkers.h +++ b/system/gd/hci/event_checkers.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/acl_manager_fuzz_test.cc b/system/gd/hci/fuzz/acl_manager_fuzz_test.cc index d9c039415c..6c98e82168 100644 --- a/system/gd/hci/fuzz/acl_manager_fuzz_test.cc +++ b/system/gd/hci/fuzz/acl_manager_fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/fuzz_hci_layer.cc b/system/gd/hci/fuzz/fuzz_hci_layer.cc index 64115ec253..d665655bd3 100644 --- a/system/gd/hci/fuzz/fuzz_hci_layer.cc +++ b/system/gd/hci/fuzz/fuzz_hci_layer.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/fuzz_hci_layer.h b/system/gd/hci/fuzz/fuzz_hci_layer.h index d4a69c114e..59a09acfe2 100644 --- a/system/gd/hci/fuzz/fuzz_hci_layer.h +++ b/system/gd/hci/fuzz/fuzz_hci_layer.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/hci_layer_fuzz_client.cc b/system/gd/hci/fuzz/hci_layer_fuzz_client.cc index 6ca1b15f99..a76770dd70 100644 --- a/system/gd/hci/fuzz/hci_layer_fuzz_client.cc +++ b/system/gd/hci/fuzz/hci_layer_fuzz_client.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/hci_layer_fuzz_client.h b/system/gd/hci/fuzz/hci_layer_fuzz_client.h index 3f9942c48a..3a62de2890 100644 --- a/system/gd/hci/fuzz/hci_layer_fuzz_client.h +++ b/system/gd/hci/fuzz/hci_layer_fuzz_client.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/hci_layer_fuzz_test.cc b/system/gd/hci/fuzz/hci_layer_fuzz_test.cc index 1fed31e882..3f362879f5 100644 --- a/system/gd/hci/fuzz/hci_layer_fuzz_test.cc +++ b/system/gd/hci/fuzz/hci_layer_fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/status_vs_complete_commands.cc b/system/gd/hci/fuzz/status_vs_complete_commands.cc index c4cc72ca73..8c21cdeeec 100644 --- a/system/gd/hci/fuzz/status_vs_complete_commands.cc +++ b/system/gd/hci/fuzz/status_vs_complete_commands.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/status_vs_complete_commands.h b/system/gd/hci/fuzz/status_vs_complete_commands.h index 57cb9c1174..c2831f2819 100644 --- a/system/gd/hci/fuzz/status_vs_complete_commands.h +++ b/system/gd/hci/fuzz/status_vs_complete_commands.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_interface.h b/system/gd/hci/hci_interface.h index 46c5f400bd..677dead98e 100644 --- a/system/gd/hci/hci_interface.h +++ b/system/gd/hci/hci_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer.cc b/system/gd/hci/hci_layer.cc index fd3d4ff278..da370a7564 100644 --- a/system/gd/hci/hci_layer.cc +++ b/system/gd/hci/hci_layer.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,6 +64,11 @@ using std::unique_ptr; static std::recursive_mutex life_cycle_guard; static bool life_cycle_stopped = true; +#ifdef TARGET_FLOSS +// Signal to indicate the controller needs to be reset. +const int SIG_RESET_CTRL = SIGUSR1; +#endif + static std::chrono::milliseconds getHciTimeoutMs() { static auto sHciTimeoutMs = std::chrono::milliseconds(bluetooth::os::GetSystemPropertyUint32Base( "bluetooth.hci.timeout_milliseconds", HciLayer::kHciTimeoutMs.count())); @@ -296,12 +301,18 @@ struct HciLayer::impl { void on_hci_timeout(OpCode op_code) { #ifdef TARGET_FLOSS + std::unique_lock<std::recursive_mutex> lock(life_cycle_guard); + if (life_cycle_stopped) { + return; + } + log::warn("Ignoring the timeouted HCI command {}.", OpCodeText(op_code)); - // Terminate the process to trigger controller reset, also mark the controller - // is broken to prevent further error while terminating. - auto hal = module_.GetDependency<hal::HciHal>(); - hal->markControllerBroken(); - kill(getpid(), SIGTERM); + + // Terminate the process to trigger controller reset, also stop sending and + // processing any incoming packet immediately to prevent further error + // while terminating. + module_.LifeCycleStop(); + kill(getpid(), SIG_RESET_CTRL); return; #endif @@ -507,12 +518,11 @@ struct HciLayer::impl { log::assert_that(event_view.IsValid(), "assert failed: event_view.IsValid()"); #ifdef TARGET_FLOSS log::warn("Hardware Error Event with code 0x{:02x}", event_view.GetHardwareCode()); - // Sending SIGTERM to process the exception from BT controller. + // Sending signal to indicate BT controller needs to reset. // The Floss daemon will be restarted. HCI reset during restart will clear the // error state of the BT controller. - auto hal = module_.GetDependency<hal::HciHal>(); - hal->markControllerBroken(); - kill(getpid(), SIGTERM); + module_.LifeCycleStop(); + kill(getpid(), SIG_RESET_CTRL); #else log::fatal("Hardware Error Event with code 0x{:02x}", event_view.GetHardwareCode()); #endif @@ -619,6 +629,14 @@ struct HciLayer::hal_callbacks : public hal::HciHalCallbacks { module_.impl_->incoming_iso_buffer_.Enqueue(std::move(iso), module_.GetHandler()); } +#ifdef TARGET_FLOSS + void controllerNeedsReset() override { + log::info("Controller needs reset!"); + module_.LifeCycleStop(); + kill(getpid(), SIG_RESET_CTRL); + } +#endif + HciLayer& module_; }; @@ -958,6 +976,7 @@ void HciLayer::StartWithNoHalDependencies(Handler* handler) { void HciLayer::Stop() { std::unique_lock<std::recursive_mutex> lock(life_cycle_guard); + life_cycle_stopped = true; auto hal = GetDependency<hal::HciHal>(); hal->unregisterIncomingPacketCallback(); delete hal_callbacks_; @@ -966,7 +985,11 @@ void HciLayer::Stop() { impl_->sco_queue_.GetDownEnd()->UnregisterDequeue(); impl_->iso_queue_.GetDownEnd()->UnregisterDequeue(); delete impl_; +} +// Function to stop sending and handling incoming packets +void HciLayer::LifeCycleStop() { + std::unique_lock<std::recursive_mutex> lock(life_cycle_guard); life_cycle_stopped = true; } diff --git a/system/gd/hci/hci_layer.h b/system/gd/hci/hci_layer.h index d30884a625..94f706cf6b 100644 --- a/system/gd/hci/hci_layer.h +++ b/system/gd/hci/hci_layer.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -149,6 +149,8 @@ protected: void Stop() override; + void LifeCycleStop(); + virtual void Disconnect(uint16_t handle, ErrorCode reason); virtual void ReadRemoteVersion(hci::ErrorCode hci_status, uint16_t handle, uint8_t version, uint16_t manufacturer_name, uint16_t sub_version); diff --git a/system/gd/hci/hci_layer_fake.cc b/system/gd/hci/hci_layer_fake.cc index b09bb5feeb..ffad279ac5 100644 --- a/system/gd/hci/hci_layer_fake.cc +++ b/system/gd/hci/hci_layer_fake.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_fake.h b/system/gd/hci/hci_layer_fake.h index 4743c0c0ff..d5d024ae77 100644 --- a/system/gd/hci/hci_layer_fake.h +++ b/system/gd/hci/hci_layer_fake.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_mock.h b/system/gd/hci/hci_layer_mock.h index f207203251..e272071a4b 100644 --- a/system/gd/hci/hci_layer_mock.h +++ b/system/gd/hci/hci_layer_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_test.cc b/system/gd/hci/hci_layer_test.cc index c30094d292..8ac7f846d9 100644 --- a/system/gd/hci/hci_layer_test.cc +++ b/system/gd/hci/hci_layer_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_unittest.cc b/system/gd/hci/hci_layer_unittest.cc index 86afb1298d..286f9ced19 100644 --- a/system/gd/hci/hci_layer_unittest.cc +++ b/system/gd/hci/hci_layer_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_metrics_logging.cc b/system/gd/hci/hci_metrics_logging.cc index 21f66ee3ba..914f2b637a 100644 --- a/system/gd/hci/hci_metrics_logging.cc +++ b/system/gd/hci/hci_metrics_logging.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_metrics_logging.h b/system/gd/hci/hci_metrics_logging.h index 4e1d9b72f4..d9c67ee771 100644 --- a/system/gd/hci/hci_metrics_logging.h +++ b/system/gd/hci/hci_metrics_logging.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_packets_fuzz_test.cc b/system/gd/hci/hci_packets_fuzz_test.cc index 00a053273c..72a0fc9ebf 100644 --- a/system/gd/hci/hci_packets_fuzz_test.cc +++ b/system/gd/hci/hci_packets_fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_packets_test.cc b/system/gd/hci/hci_packets_test.cc index 017a5dab98..efb7be096b 100644 --- a/system/gd/hci/hci_packets_test.cc +++ b/system/gd/hci/hci_packets_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/inquiry_interface.h b/system/gd/hci/inquiry_interface.h index 322e2da30a..74b254a3c1 100644 --- a/system/gd/hci/inquiry_interface.h +++ b/system/gd/hci/inquiry_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_acl_connection_interface.h b/system/gd/hci/le_acl_connection_interface.h index b3081e30b6..67d1729aec 100644 --- a/system/gd/hci/le_acl_connection_interface.h +++ b/system/gd/hci/le_acl_connection_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_address_manager.cc b/system/gd/hci/le_address_manager.cc index 5073cc1c2c..804f88985e 100644 --- a/system/gd/hci/le_address_manager.cc +++ b/system/gd/hci/le_address_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_address_manager.h b/system/gd/hci/le_address_manager.h index a657d8e55c..b985438d4e 100644 --- a/system/gd/hci/le_address_manager.h +++ b/system/gd/hci/le_address_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_address_manager_test.cc b/system/gd/hci/le_address_manager_test.cc index 33efcb51a2..1d5961be50 100644 --- a/system/gd/hci/le_address_manager_test.cc +++ b/system/gd/hci/le_address_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_interface.h b/system/gd/hci/le_advertising_interface.h index 5fcddc7123..179a70ff4d 100644 --- a/system/gd/hci/le_advertising_interface.h +++ b/system/gd/hci/le_advertising_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_manager.cc b/system/gd/hci/le_advertising_manager.cc index afa8fd300b..f9a80f44f8 100644 --- a/system/gd/hci/le_advertising_manager.cc +++ b/system/gd/hci/le_advertising_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_manager.h b/system/gd/hci/le_advertising_manager.h index fe614861e2..b50dd2623c 100644 --- a/system/gd/hci/le_advertising_manager.h +++ b/system/gd/hci/le_advertising_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_manager_mock.h b/system/gd/hci/le_advertising_manager_mock.h index baf2e263f1..e54e2ae584 100644 --- a/system/gd/hci/le_advertising_manager_mock.h +++ b/system/gd/hci/le_advertising_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_manager_test.cc b/system/gd/hci/le_advertising_manager_test.cc index 12fa70d263..efe9462137 100644 --- a/system/gd/hci/le_advertising_manager_test.cc +++ b/system/gd/hci/le_advertising_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_iso_interface.h b/system/gd/hci/le_iso_interface.h index 33aa1c4461..ec05320438 100644 --- a/system/gd/hci/le_iso_interface.h +++ b/system/gd/hci/le_iso_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_periodic_sync_manager.h b/system/gd/hci/le_periodic_sync_manager.h index 09c557549a..d600371480 100644 --- a/system/gd/hci/le_periodic_sync_manager.h +++ b/system/gd/hci/le_periodic_sync_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_periodic_sync_manager_test.cc b/system/gd/hci/le_periodic_sync_manager_test.cc index 18a76ae18c..cba8905dfd 100644 --- a/system/gd/hci/le_periodic_sync_manager_test.cc +++ b/system/gd/hci/le_periodic_sync_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_rand_callback.h b/system/gd/hci/le_rand_callback.h index 54db17e4f9..617a7c45a9 100644 --- a/system/gd/hci/le_rand_callback.h +++ b/system/gd/hci/le_rand_callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_callback.h b/system/gd/hci/le_scanning_callback.h index 4bd75dbbc4..6f086a3673 100644 --- a/system/gd/hci/le_scanning_callback.h +++ b/system/gd/hci/le_scanning_callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_interface.h b/system/gd/hci/le_scanning_interface.h index d26cf53604..6f0c456c3e 100644 --- a/system/gd/hci/le_scanning_interface.h +++ b/system/gd/hci/le_scanning_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager.cc b/system/gd/hci/le_scanning_manager.cc index e80caaf23c..439b6241c1 100644 --- a/system/gd/hci/le_scanning_manager.cc +++ b/system/gd/hci/le_scanning_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager.h b/system/gd/hci/le_scanning_manager.h index 90043145a9..e09bf304af 100644 --- a/system/gd/hci/le_scanning_manager.h +++ b/system/gd/hci/le_scanning_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager_mock.h b/system/gd/hci/le_scanning_manager_mock.h index f62012c38c..b72ce45fd2 100644 --- a/system/gd/hci/le_scanning_manager_mock.h +++ b/system/gd/hci/le_scanning_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager_test.cc b/system/gd/hci/le_scanning_manager_test.cc index 134702cb4a..f19ac15862 100644 --- a/system/gd/hci/le_scanning_manager_test.cc +++ b/system/gd/hci/le_scanning_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_reassembler.cc b/system/gd/hci/le_scanning_reassembler.cc index 8f8ad06b00..80e7be28d2 100644 --- a/system/gd/hci/le_scanning_reassembler.cc +++ b/system/gd/hci/le_scanning_reassembler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_reassembler.h b/system/gd/hci/le_scanning_reassembler.h index afc4b9b303..327d0445f7 100644 --- a/system/gd/hci/le_scanning_reassembler.h +++ b/system/gd/hci/le_scanning_reassembler.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_reassembler_test.cc b/system/gd/hci/le_scanning_reassembler_test.cc index d2461391f9..beaa0a375b 100644 --- a/system/gd/hci/le_scanning_reassembler_test.cc +++ b/system/gd/hci/le_scanning_reassembler_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_security_interface.h b/system/gd/hci/le_security_interface.h index 93a2122d8f..7bdfb590e9 100644 --- a/system/gd/hci/le_security_interface.h +++ b/system/gd/hci/le_security_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/link_key.cc b/system/gd/hci/link_key.cc index 78ea1a48ea..6795b904af 100644 --- a/system/gd/hci/link_key.cc +++ b/system/gd/hci/link_key.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/link_key.h b/system/gd/hci/link_key.h index fc55c0cacc..9f1930c1f9 100644 --- a/system/gd/hci/link_key.h +++ b/system/gd/hci/link_key.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/msft.cc b/system/gd/hci/msft.cc index 1c5a700030..c542bb950f 100644 --- a/system/gd/hci/msft.cc +++ b/system/gd/hci/msft.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/msft.h b/system/gd/hci/msft.h index 70b41ee8ce..6e9357d834 100644 --- a/system/gd/hci/msft.h +++ b/system/gd/hci/msft.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/octets.h b/system/gd/hci/octets.h index 0eba1561c0..159dc9df09 100644 --- a/system/gd/hci/octets.h +++ b/system/gd/hci/octets.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/remote_name_request.cc b/system/gd/hci/remote_name_request.cc index 2f703feca9..e2f5433f27 100644 --- a/system/gd/hci/remote_name_request.cc +++ b/system/gd/hci/remote_name_request.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/remote_name_request.h b/system/gd/hci/remote_name_request.h index c8553c7c2f..ce6f2a8337 100644 --- a/system/gd/hci/remote_name_request.h +++ b/system/gd/hci/remote_name_request.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/remote_name_request_test.cc b/system/gd/hci/remote_name_request_test.cc index 43367e89be..948d82bc89 100644 --- a/system/gd/hci/remote_name_request_test.cc +++ b/system/gd/hci/remote_name_request_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/security_interface.h b/system/gd/hci/security_interface.h index ad7a628b73..606e2edf01 100644 --- a/system/gd/hci/security_interface.h +++ b/system/gd/hci/security_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/uuid_unittest.cc b/system/gd/hci/uuid_unittest.cc index 3656a13ffd..c148c6b39d 100644 --- a/system/gd/hci/uuid_unittest.cc +++ b/system/gd/hci/uuid_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_interface.h b/system/gd/lpp/lpp_offload_interface.h index 388466f2e5..1387423fdb 100644 --- a/system/gd/lpp/lpp_offload_interface.h +++ b/system/gd/lpp/lpp_offload_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_interface_mock.h b/system/gd/lpp/lpp_offload_interface_mock.h index 03cd5f4f52..6ac1490830 100644 --- a/system/gd/lpp/lpp_offload_interface_mock.h +++ b/system/gd/lpp/lpp_offload_interface_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_manager.cc b/system/gd/lpp/lpp_offload_manager.cc index c5c1fb247e..4518cc96fe 100644 --- a/system/gd/lpp/lpp_offload_manager.cc +++ b/system/gd/lpp/lpp_offload_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_manager.h b/system/gd/lpp/lpp_offload_manager.h index 90097f77bd..c8b90a69df 100644 --- a/system/gd/lpp/lpp_offload_manager.h +++ b/system/gd/lpp/lpp_offload_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/bluetooth_event.cc b/system/gd/metrics/bluetooth_event.cc index 4311aeb2e1..6fa3678bec 100644 --- a/system/gd/metrics/bluetooth_event.cc +++ b/system/gd/metrics/bluetooth_event.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/bluetooth_event.h b/system/gd/metrics/bluetooth_event.h index 50c3f88d75..65875bcaa7 100644 --- a/system/gd/metrics/bluetooth_event.h +++ b/system/gd/metrics/bluetooth_event.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics.cc b/system/gd/metrics/chromeos/metrics.cc index 87966a379c..ee84dd7095 100644 --- a/system/gd/metrics/chromeos/metrics.cc +++ b/system/gd/metrics/chromeos/metrics.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_allowlist.cc b/system/gd/metrics/chromeos/metrics_allowlist.cc index 33f2bf6dde..67c2e2647b 100644 --- a/system/gd/metrics/chromeos/metrics_allowlist.cc +++ b/system/gd/metrics/chromeos/metrics_allowlist.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_allowlist.h b/system/gd/metrics/chromeos/metrics_allowlist.h index 6bd1530558..799c81b87f 100644 --- a/system/gd/metrics/chromeos/metrics_allowlist.h +++ b/system/gd/metrics/chromeos/metrics_allowlist.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_event.cc b/system/gd/metrics/chromeos/metrics_event.cc index 80f517da56..d7e0d76bb3 100644 --- a/system/gd/metrics/chromeos/metrics_event.cc +++ b/system/gd/metrics/chromeos/metrics_event.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_event.h b/system/gd/metrics/chromeos/metrics_event.h index b4ddb403ba..1b685cf358 100644 --- a/system/gd/metrics/chromeos/metrics_event.h +++ b/system/gd/metrics/chromeos/metrics_event.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/counter_metrics.cc b/system/gd/metrics/counter_metrics.cc index 99ba652bf9..5bafd90599 100644 --- a/system/gd/metrics/counter_metrics.cc +++ b/system/gd/metrics/counter_metrics.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/counter_metrics.h b/system/gd/metrics/counter_metrics.h index e5a63f6394..88c7711f92 100644 --- a/system/gd/metrics/counter_metrics.h +++ b/system/gd/metrics/counter_metrics.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/counter_metrics_unittest.cc b/system/gd/metrics/counter_metrics_unittest.cc index cbaf7f0072..eb5545ca19 100644 --- a/system/gd/metrics/counter_metrics_unittest.cc +++ b/system/gd/metrics/counter_metrics_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/linux/metrics.cc b/system/gd/metrics/linux/metrics.cc index 9be10aeec9..f15ebb4695 100644 --- a/system/gd/metrics/linux/metrics.cc +++ b/system/gd/metrics/linux/metrics.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/metrics.h b/system/gd/metrics/metrics.h index e26ded4e17..36fe66ed06 100644 --- a/system/gd/metrics/metrics.h +++ b/system/gd/metrics/metrics.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/utils.cc b/system/gd/metrics/utils.cc index b059bb7133..b39b27f5b7 100644 --- a/system/gd/metrics/utils.cc +++ b/system/gd/metrics/utils.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/utils.h b/system/gd/metrics/utils.h index 316ffdc74e..05d8d6044b 100644 --- a/system/gd/metrics/utils.h +++ b/system/gd/metrics/utils.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/module.cc b/system/gd/module.cc index d5ea4c4fd3..8904f0c559 100644 --- a/system/gd/module.cc +++ b/system/gd/module.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/module.h b/system/gd/module.h index b53f992ccf..816d455482 100644 --- a/system/gd/module.h +++ b/system/gd/module.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/module_unittest.cc b/system/gd/module_unittest.cc index d89be74219..d1bf59ac73 100644 --- a/system/gd/module_unittest.cc +++ b/system/gd/module_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/alarm.h b/system/gd/os/alarm.h index 2eeea77b1f..5f5f21c9c8 100644 --- a/system/gd/os/alarm.h +++ b/system/gd/os/alarm.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/alarm_benchmark.cc b/system/gd/os/alarm_benchmark.cc index cfe3c3db80..3839a1695d 100644 --- a/system/gd/os/alarm_benchmark.cc +++ b/system/gd/os/alarm_benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/android/parameter_provider.cc b/system/gd/os/android/parameter_provider.cc index c8507ddf32..06132e677f 100644 --- a/system/gd/os/android/parameter_provider.cc +++ b/system/gd/os/android/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/android/system_properties.cc b/system/gd/os/android/system_properties.cc index d0f2707173..7b246128b5 100644 --- a/system/gd/os/android/system_properties.cc +++ b/system/gd/os/android/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/bt_keystore.h b/system/gd/os/bt_keystore.h index 68005acdea..daff5f8217 100644 --- a/system/gd/os/bt_keystore.h +++ b/system/gd/os/bt_keystore.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/chromeos/parameter_provider.cc b/system/gd/os/chromeos/parameter_provider.cc index a8ee19c5a6..0cfd60b82a 100644 --- a/system/gd/os/chromeos/parameter_provider.cc +++ b/system/gd/os/chromeos/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/chromeos/system_properties.cc b/system/gd/os/chromeos/system_properties.cc index 16e474c8d2..07645d3390 100644 --- a/system/gd/os/chromeos/system_properties.cc +++ b/system/gd/os/chromeos/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fake_timer/fake_timerfd.cc b/system/gd/os/fake_timer/fake_timerfd.cc index 400a92743c..cacd37bd7f 100644 --- a/system/gd/os/fake_timer/fake_timerfd.cc +++ b/system/gd/os/fake_timer/fake_timerfd.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fake_timer/fake_timerfd.h b/system/gd/os/fake_timer/fake_timerfd.h index 31a698aec9..2183edb57c 100644 --- a/system/gd/os/fake_timer/fake_timerfd.h +++ b/system/gd/os/fake_timer/fake_timerfd.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/files.h b/system/gd/os/files.h index 34a9f2f5b9..4efb0afdd4 100644 --- a/system/gd/os/files.h +++ b/system/gd/os/files.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fuzz/dev_null_queue.h b/system/gd/os/fuzz/dev_null_queue.h index 46f88d3fc4..3ffd2adcca 100644 --- a/system/gd/os/fuzz/dev_null_queue.h +++ b/system/gd/os/fuzz/dev_null_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fuzz/fuzz_inject_queue.h b/system/gd/os/fuzz/fuzz_inject_queue.h index 322faa0d57..5cd60b1f2b 100644 --- a/system/gd/os/fuzz/fuzz_inject_queue.h +++ b/system/gd/os/fuzz/fuzz_inject_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/handler.cc b/system/gd/os/handler.cc index 388fcd4c72..919bf0be40 100644 --- a/system/gd/os/handler.cc +++ b/system/gd/os/handler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/handler.h b/system/gd/os/handler.h index 4bb75b86f4..167f475d68 100644 --- a/system/gd/os/handler.h +++ b/system/gd/os/handler.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/handler_unittest.cc b/system/gd/os/handler_unittest.cc index 7306effd30..cca5b955cc 100644 --- a/system/gd/os/handler_unittest.cc +++ b/system/gd/os/handler_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/host/parameter_provider.cc b/system/gd/os/host/parameter_provider.cc index 7b150da4be..e56f82731f 100644 --- a/system/gd/os/host/parameter_provider.cc +++ b/system/gd/os/host/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/host/system_properties.cc b/system/gd/os/host/system_properties.cc index 5b28659612..2d49810adb 100644 --- a/system/gd/os/host/system_properties.cc +++ b/system/gd/os/host/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux/parameter_provider.cc b/system/gd/os/linux/parameter_provider.cc index a8ee19c5a6..0cfd60b82a 100644 --- a/system/gd/os/linux/parameter_provider.cc +++ b/system/gd/os/linux/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux/system_properties.cc b/system/gd/os/linux/system_properties.cc index 16e474c8d2..07645d3390 100644 --- a/system/gd/os/linux/system_properties.cc +++ b/system/gd/os/linux/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/alarm.cc b/system/gd/os/linux_generic/alarm.cc index 9f85016f0b..8846ede579 100644 --- a/system/gd/os/linux_generic/alarm.cc +++ b/system/gd/os/linux_generic/alarm.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/alarm_timerfd_unittest.cc b/system/gd/os/linux_generic/alarm_timerfd_unittest.cc index bcf802b86d..5d0698ce31 100644 --- a/system/gd/os/linux_generic/alarm_timerfd_unittest.cc +++ b/system/gd/os/linux_generic/alarm_timerfd_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/alarm_unittest.cc b/system/gd/os/linux_generic/alarm_unittest.cc index f5c14dc410..14b97022b9 100644 --- a/system/gd/os/linux_generic/alarm_unittest.cc +++ b/system/gd/os/linux_generic/alarm_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/files.cc b/system/gd/os/linux_generic/files.cc index a759e1d631..045c02c471 100644 --- a/system/gd/os/linux_generic/files.cc +++ b/system/gd/os/linux_generic/files.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/files_test.cc b/system/gd/os/linux_generic/files_test.cc index 5d85d76fba..5804148c21 100644 --- a/system/gd/os/linux_generic/files_test.cc +++ b/system/gd/os/linux_generic/files_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/linux.h b/system/gd/os/linux_generic/linux.h index b0571355f9..1ef54967ab 100644 --- a/system/gd/os/linux_generic/linux.h +++ b/system/gd/os/linux_generic/linux.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/mgmt.cc b/system/gd/os/linux_generic/mgmt.cc index 8f2fbd0a17..ebb04b5ed5 100644 --- a/system/gd/os/linux_generic/mgmt.cc +++ b/system/gd/os/linux_generic/mgmt.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/queue_unittest.cc b/system/gd/os/linux_generic/queue_unittest.cc index 0e23454c61..f119a8f734 100644 --- a/system/gd/os/linux_generic/queue_unittest.cc +++ b/system/gd/os/linux_generic/queue_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactive_semaphore.cc b/system/gd/os/linux_generic/reactive_semaphore.cc index 57fc9d6fe9..76ec29b38b 100644 --- a/system/gd/os/linux_generic/reactive_semaphore.cc +++ b/system/gd/os/linux_generic/reactive_semaphore.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactive_semaphore.h b/system/gd/os/linux_generic/reactive_semaphore.h index ac10d76143..6b92200274 100644 --- a/system/gd/os/linux_generic/reactive_semaphore.h +++ b/system/gd/os/linux_generic/reactive_semaphore.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactor.cc b/system/gd/os/linux_generic/reactor.cc index 13f14dceb1..e67c1fd388 100644 --- a/system/gd/os/linux_generic/reactor.cc +++ b/system/gd/os/linux_generic/reactor.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactor_unittest.cc b/system/gd/os/linux_generic/reactor_unittest.cc index d131f5f74d..326ff1dd33 100644 --- a/system/gd/os/linux_generic/reactor_unittest.cc +++ b/system/gd/os/linux_generic/reactor_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/repeating_alarm.cc b/system/gd/os/linux_generic/repeating_alarm.cc index 20542228d4..f2536ba821 100644 --- a/system/gd/os/linux_generic/repeating_alarm.cc +++ b/system/gd/os/linux_generic/repeating_alarm.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/repeating_alarm_unittest.cc b/system/gd/os/linux_generic/repeating_alarm_unittest.cc index f101f505c9..1868615c84 100644 --- a/system/gd/os/linux_generic/repeating_alarm_unittest.cc +++ b/system/gd/os/linux_generic/repeating_alarm_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/thread.cc b/system/gd/os/linux_generic/thread.cc index 33dfb2a229..5799ec096c 100644 --- a/system/gd/os/linux_generic/thread.cc +++ b/system/gd/os/linux_generic/thread.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/thread_unittest.cc b/system/gd/os/linux_generic/thread_unittest.cc index 9057934845..08160972d4 100644 --- a/system/gd/os/linux_generic/thread_unittest.cc +++ b/system/gd/os/linux_generic/thread_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/mock_queue.h b/system/gd/os/mock_queue.h index 03ede2025b..187911174b 100644 --- a/system/gd/os/mock_queue.h +++ b/system/gd/os/mock_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/parameter_provider.h b/system/gd/os/parameter_provider.h index df8a8ee900..e943d9ab37 100644 --- a/system/gd/os/parameter_provider.h +++ b/system/gd/os/parameter_provider.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/queue.h b/system/gd/os/queue.h index fef9073202..1287ad4f39 100644 --- a/system/gd/os/queue.h +++ b/system/gd/os/queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/queue_benchmark.cc b/system/gd/os/queue_benchmark.cc index b4c442e7dd..c6dfdc9ec1 100644 --- a/system/gd/os/queue_benchmark.cc +++ b/system/gd/os/queue_benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/rand.h b/system/gd/os/rand.h index 03f29bc815..d0ab6db36b 100644 --- a/system/gd/os/rand.h +++ b/system/gd/os/rand.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/reactor.h b/system/gd/os/reactor.h index ef286fbb60..41ad1910a9 100644 --- a/system/gd/os/reactor.h +++ b/system/gd/os/reactor.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/repeating_alarm.h b/system/gd/os/repeating_alarm.h index d38e5374d0..4ffbc92cd5 100644 --- a/system/gd/os/repeating_alarm.h +++ b/system/gd/os/repeating_alarm.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/system_properties.h b/system/gd/os/system_properties.h index db31708480..e040119b3e 100644 --- a/system/gd/os/system_properties.h +++ b/system/gd/os/system_properties.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/system_properties_common.cc b/system/gd/os/system_properties_common.cc index 9dfed10da6..9a491d1a4d 100644 --- a/system/gd/os/system_properties_common.cc +++ b/system/gd/os/system_properties_common.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/system_properties_common_test.cc b/system/gd/os/system_properties_common_test.cc index 1550e0ad19..567995336e 100644 --- a/system/gd/os/system_properties_common_test.cc +++ b/system/gd/os/system_properties_common_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/thread.h b/system/gd/os/thread.h index ccab6113cc..d987195b6c 100644 --- a/system/gd/os/thread.h +++ b/system/gd/os/thread.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/thread_benchmark.cc b/system/gd/os/thread_benchmark.cc index 529eb8a662..e0dcb008e4 100644 --- a/system/gd/os/thread_benchmark.cc +++ b/system/gd/os/thread_benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/utils.h b/system/gd/os/utils.h index f768a317d7..d0fa4e7b64 100644 --- a/system/gd/os/utils.h +++ b/system/gd/os/utils.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/base_packet_builder.h b/system/gd/packet/base_packet_builder.h index 766e896f9d..37f0f0e236 100644 --- a/system/gd/packet/base_packet_builder.h +++ b/system/gd/packet/base_packet_builder.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/base_struct.h b/system/gd/packet/base_struct.h index f0461f9ff5..a378a05d22 100644 --- a/system/gd/packet/base_struct.h +++ b/system/gd/packet/base_struct.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/bit_inserter.cc b/system/gd/packet/bit_inserter.cc index d02e1deecf..4206c4a9ec 100644 --- a/system/gd/packet/bit_inserter.cc +++ b/system/gd/packet/bit_inserter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/bit_inserter.h b/system/gd/packet/bit_inserter.h index f7749d62c6..e0fb8faac4 100644 --- a/system/gd/packet/bit_inserter.h +++ b/system/gd/packet/bit_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/bit_inserter_unittest.cc b/system/gd/packet/bit_inserter_unittest.cc index 636fa470bd..19fc09191c 100644 --- a/system/gd/packet/bit_inserter_unittest.cc +++ b/system/gd/packet/bit_inserter_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_inserter.cc b/system/gd/packet/byte_inserter.cc index a821477a85..cbe04fb172 100644 --- a/system/gd/packet/byte_inserter.cc +++ b/system/gd/packet/byte_inserter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_inserter.h b/system/gd/packet/byte_inserter.h index 9cb71b2e36..150bc37d27 100644 --- a/system/gd/packet/byte_inserter.h +++ b/system/gd/packet/byte_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_observer.cc b/system/gd/packet/byte_observer.cc index 1b294b4bcc..34920b7ac7 100644 --- a/system/gd/packet/byte_observer.cc +++ b/system/gd/packet/byte_observer.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_observer.h b/system/gd/packet/byte_observer.h index f5c32f3d66..c700aa18ef 100644 --- a/system/gd/packet/byte_observer.h +++ b/system/gd/packet/byte_observer.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/checksum_type_checker.h b/system/gd/packet/checksum_type_checker.h index 380c4d3240..9aeb215c68 100644 --- a/system/gd/packet/checksum_type_checker.h +++ b/system/gd/packet/checksum_type_checker.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/custom_field_fixed_size_interface.h b/system/gd/packet/custom_field_fixed_size_interface.h index 1bf1335d27..ce27438948 100644 --- a/system/gd/packet/custom_field_fixed_size_interface.h +++ b/system/gd/packet/custom_field_fixed_size_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/custom_type_checker.h b/system/gd/packet/custom_type_checker.h index ea1b59f801..0f6a271789 100644 --- a/system/gd/packet/custom_type_checker.h +++ b/system/gd/packet/custom_type_checker.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/endian_inserter.h b/system/gd/packet/endian_inserter.h index 6490ed257c..670d13af15 100644 --- a/system/gd/packet/endian_inserter.h +++ b/system/gd/packet/endian_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/fragmenting_inserter.cc b/system/gd/packet/fragmenting_inserter.cc index a0230c5218..1f552b4eac 100644 --- a/system/gd/packet/fragmenting_inserter.cc +++ b/system/gd/packet/fragmenting_inserter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/fragmenting_inserter.h b/system/gd/packet/fragmenting_inserter.h index 282b6cc228..2073ea967a 100644 --- a/system/gd/packet/fragmenting_inserter.h +++ b/system/gd/packet/fragmenting_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/fragmenting_inserter_unittest.cc b/system/gd/packet/fragmenting_inserter_unittest.cc index 5d90a5a075..b4aa6f573d 100644 --- a/system/gd/packet/fragmenting_inserter_unittest.cc +++ b/system/gd/packet/fragmenting_inserter_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/iterator.cc b/system/gd/packet/iterator.cc index 3b4d48ea4c..0394641335 100644 --- a/system/gd/packet/iterator.cc +++ b/system/gd/packet/iterator.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/iterator.h b/system/gd/packet/iterator.h index d1ea14b687..bd724dd96c 100644 --- a/system/gd/packet/iterator.h +++ b/system/gd/packet/iterator.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_builder.h b/system/gd/packet/packet_builder.h index 19a0be1183..b772770a9d 100644 --- a/system/gd/packet/packet_builder.h +++ b/system/gd/packet/packet_builder.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_builder_unittest.cc b/system/gd/packet/packet_builder_unittest.cc index edb978d7de..8626b86d6e 100644 --- a/system/gd/packet/packet_builder_unittest.cc +++ b/system/gd/packet/packet_builder_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_struct.h b/system/gd/packet/packet_struct.h index 92ab83e4db..cb972f6b1c 100644 --- a/system/gd/packet/packet_struct.h +++ b/system/gd/packet/packet_struct.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_view.cc b/system/gd/packet/packet_view.cc index d9d4b86683..e4f44122e5 100644 --- a/system/gd/packet/packet_view.cc +++ b/system/gd/packet/packet_view.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_view.h b/system/gd/packet/packet_view.h index 3c495f3755..c9dafb931b 100644 --- a/system/gd/packet/packet_view.h +++ b/system/gd/packet/packet_view.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_view_unittest.cc b/system/gd/packet/packet_view_unittest.cc index 108275f94a..3842107fea 100644 --- a/system/gd/packet/packet_view_unittest.cc +++ b/system/gd/packet/packet_view_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/checksum_def.cc b/system/gd/packet/parser/checksum_def.cc index 0ad6ec6f90..6d34e5a581 100644 --- a/system/gd/packet/parser/checksum_def.cc +++ b/system/gd/packet/parser/checksum_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/checksum_def.h b/system/gd/packet/parser/checksum_def.h index ee8ea1b909..32a57d9eb7 100644 --- a/system/gd/packet/parser/checksum_def.h +++ b/system/gd/packet/parser/checksum_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/custom_field_def.cc b/system/gd/packet/parser/custom_field_def.cc index 1ffde0522e..22b3ceaf49 100644 --- a/system/gd/packet/parser/custom_field_def.cc +++ b/system/gd/packet/parser/custom_field_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/custom_field_def.h b/system/gd/packet/parser/custom_field_def.h index f605fe559b..10eee4af81 100644 --- a/system/gd/packet/parser/custom_field_def.h +++ b/system/gd/packet/parser/custom_field_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/declarations.h b/system/gd/packet/parser/declarations.h index ff89d8aaf1..e18b47666d 100644 --- a/system/gd/packet/parser/declarations.h +++ b/system/gd/packet/parser/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_def.cc b/system/gd/packet/parser/enum_def.cc index 8b36572b3a..999ce9cedc 100644 --- a/system/gd/packet/parser/enum_def.cc +++ b/system/gd/packet/parser/enum_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_def.h b/system/gd/packet/parser/enum_def.h index 1150da86c7..03c0017669 100644 --- a/system/gd/packet/parser/enum_def.h +++ b/system/gd/packet/parser/enum_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_gen.cc b/system/gd/packet/parser/enum_gen.cc index b7db3d6b29..f70e8ad449 100644 --- a/system/gd/packet/parser/enum_gen.cc +++ b/system/gd/packet/parser/enum_gen.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_gen.h b/system/gd/packet/parser/enum_gen.h index 7dcb7b76a3..d0909f3f4d 100644 --- a/system/gd/packet/parser/enum_gen.h +++ b/system/gd/packet/parser/enum_gen.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/field_list.h b/system/gd/packet/parser/field_list.h index 2eaeffa1cb..49cdb23755 100644 --- a/system/gd/packet/parser/field_list.h +++ b/system/gd/packet/parser/field_list.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/all_fields.h b/system/gd/packet/parser/fields/all_fields.h index 8c0aeee02f..f750098a1d 100644 --- a/system/gd/packet/parser/fields/all_fields.h +++ b/system/gd/packet/parser/fields/all_fields.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/array_field.cc b/system/gd/packet/parser/fields/array_field.cc index b3612a089b..3d6869234e 100644 --- a/system/gd/packet/parser/fields/array_field.cc +++ b/system/gd/packet/parser/fields/array_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/array_field.h b/system/gd/packet/parser/fields/array_field.h index 80c08e3b97..144feebb4d 100644 --- a/system/gd/packet/parser/fields/array_field.h +++ b/system/gd/packet/parser/fields/array_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/body_field.cc b/system/gd/packet/parser/fields/body_field.cc index b0a093d7d4..16608d4496 100644 --- a/system/gd/packet/parser/fields/body_field.cc +++ b/system/gd/packet/parser/fields/body_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/body_field.h b/system/gd/packet/parser/fields/body_field.h index 7f44d001e1..0777f80903 100644 --- a/system/gd/packet/parser/fields/body_field.h +++ b/system/gd/packet/parser/fields/body_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_field.cc b/system/gd/packet/parser/fields/checksum_field.cc index 729266ae9d..6a64143bb6 100644 --- a/system/gd/packet/parser/fields/checksum_field.cc +++ b/system/gd/packet/parser/fields/checksum_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_field.h b/system/gd/packet/parser/fields/checksum_field.h index c54439b343..c3753382a9 100644 --- a/system/gd/packet/parser/fields/checksum_field.h +++ b/system/gd/packet/parser/fields/checksum_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_start_field.cc b/system/gd/packet/parser/fields/checksum_start_field.cc index 3634b45c0f..c5b90f577d 100644 --- a/system/gd/packet/parser/fields/checksum_start_field.cc +++ b/system/gd/packet/parser/fields/checksum_start_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_start_field.h b/system/gd/packet/parser/fields/checksum_start_field.h index d0d29ca517..d873c3e889 100644 --- a/system/gd/packet/parser/fields/checksum_start_field.h +++ b/system/gd/packet/parser/fields/checksum_start_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/count_field.cc b/system/gd/packet/parser/fields/count_field.cc index 0c5c1ace85..7dd2a6a322 100644 --- a/system/gd/packet/parser/fields/count_field.cc +++ b/system/gd/packet/parser/fields/count_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/count_field.h b/system/gd/packet/parser/fields/count_field.h index d5e3927e95..c145c481fb 100644 --- a/system/gd/packet/parser/fields/count_field.h +++ b/system/gd/packet/parser/fields/count_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field.cc b/system/gd/packet/parser/fields/custom_field.cc index c01d5a15eb..a33a86c7f5 100644 --- a/system/gd/packet/parser/fields/custom_field.cc +++ b/system/gd/packet/parser/fields/custom_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field.h b/system/gd/packet/parser/fields/custom_field.h index 9a10479e69..e5f547027f 100644 --- a/system/gd/packet/parser/fields/custom_field.h +++ b/system/gd/packet/parser/fields/custom_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field_fixed_size.cc b/system/gd/packet/parser/fields/custom_field_fixed_size.cc index 84cffa7986..8419d0b58b 100644 --- a/system/gd/packet/parser/fields/custom_field_fixed_size.cc +++ b/system/gd/packet/parser/fields/custom_field_fixed_size.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field_fixed_size.h b/system/gd/packet/parser/fields/custom_field_fixed_size.h index a5f728286e..05c16fde68 100644 --- a/system/gd/packet/parser/fields/custom_field_fixed_size.h +++ b/system/gd/packet/parser/fields/custom_field_fixed_size.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/enum_field.cc b/system/gd/packet/parser/fields/enum_field.cc index 675232d568..f6a46719b8 100644 --- a/system/gd/packet/parser/fields/enum_field.cc +++ b/system/gd/packet/parser/fields/enum_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/enum_field.h b/system/gd/packet/parser/fields/enum_field.h index ea1a48f3ee..d961824e7e 100644 --- a/system/gd/packet/parser/fields/enum_field.h +++ b/system/gd/packet/parser/fields/enum_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_enum_field.cc b/system/gd/packet/parser/fields/fixed_enum_field.cc index 642c46fd4a..a3460df65e 100644 --- a/system/gd/packet/parser/fields/fixed_enum_field.cc +++ b/system/gd/packet/parser/fields/fixed_enum_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_enum_field.h b/system/gd/packet/parser/fields/fixed_enum_field.h index 4ea33db12b..31873c6bc3 100644 --- a/system/gd/packet/parser/fields/fixed_enum_field.h +++ b/system/gd/packet/parser/fields/fixed_enum_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_field.cc b/system/gd/packet/parser/fields/fixed_field.cc index a5dcd372fa..a15c7e4cac 100644 --- a/system/gd/packet/parser/fields/fixed_field.cc +++ b/system/gd/packet/parser/fields/fixed_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_field.h b/system/gd/packet/parser/fields/fixed_field.h index da67daf4e6..4f6da5e6d6 100644 --- a/system/gd/packet/parser/fields/fixed_field.h +++ b/system/gd/packet/parser/fields/fixed_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_scalar_field.cc b/system/gd/packet/parser/fields/fixed_scalar_field.cc index 4f66ddb4b7..1cf4ec7d4d 100644 --- a/system/gd/packet/parser/fields/fixed_scalar_field.cc +++ b/system/gd/packet/parser/fields/fixed_scalar_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_scalar_field.h b/system/gd/packet/parser/fields/fixed_scalar_field.h index fc6603ad37..ac1afdc892 100644 --- a/system/gd/packet/parser/fields/fixed_scalar_field.h +++ b/system/gd/packet/parser/fields/fixed_scalar_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/group_field.cc b/system/gd/packet/parser/fields/group_field.cc index 1440d23293..c9c4ce5681 100644 --- a/system/gd/packet/parser/fields/group_field.cc +++ b/system/gd/packet/parser/fields/group_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/group_field.h b/system/gd/packet/parser/fields/group_field.h index d1f0bee5c5..749a7539c4 100644 --- a/system/gd/packet/parser/fields/group_field.h +++ b/system/gd/packet/parser/fields/group_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/packet_field.cc b/system/gd/packet/parser/fields/packet_field.cc index 04239ade66..f83c68e4e9 100644 --- a/system/gd/packet/parser/fields/packet_field.cc +++ b/system/gd/packet/parser/fields/packet_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/packet_field.h b/system/gd/packet/parser/fields/packet_field.h index 4e25c9017e..22194d7fc1 100644 --- a/system/gd/packet/parser/fields/packet_field.h +++ b/system/gd/packet/parser/fields/packet_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/padding_field.cc b/system/gd/packet/parser/fields/padding_field.cc index d38148eb92..7f92b6c83a 100644 --- a/system/gd/packet/parser/fields/padding_field.cc +++ b/system/gd/packet/parser/fields/padding_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/padding_field.h b/system/gd/packet/parser/fields/padding_field.h index b9c5449a04..75ef037b5c 100644 --- a/system/gd/packet/parser/fields/padding_field.h +++ b/system/gd/packet/parser/fields/padding_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/payload_field.cc b/system/gd/packet/parser/fields/payload_field.cc index 85d17b81b7..9f5c3c25a7 100644 --- a/system/gd/packet/parser/fields/payload_field.cc +++ b/system/gd/packet/parser/fields/payload_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/payload_field.h b/system/gd/packet/parser/fields/payload_field.h index 6ef419d863..17aa1c07ff 100644 --- a/system/gd/packet/parser/fields/payload_field.h +++ b/system/gd/packet/parser/fields/payload_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/reserved_field.cc b/system/gd/packet/parser/fields/reserved_field.cc index 72b7f25601..a57c9855b7 100644 --- a/system/gd/packet/parser/fields/reserved_field.cc +++ b/system/gd/packet/parser/fields/reserved_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/reserved_field.h b/system/gd/packet/parser/fields/reserved_field.h index 258ce234af..a658c2067a 100644 --- a/system/gd/packet/parser/fields/reserved_field.h +++ b/system/gd/packet/parser/fields/reserved_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/scalar_field.cc b/system/gd/packet/parser/fields/scalar_field.cc index f916329cc1..b65e8bd8f7 100644 --- a/system/gd/packet/parser/fields/scalar_field.cc +++ b/system/gd/packet/parser/fields/scalar_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/scalar_field.h b/system/gd/packet/parser/fields/scalar_field.h index a63d46dd21..802e6f4db1 100644 --- a/system/gd/packet/parser/fields/scalar_field.h +++ b/system/gd/packet/parser/fields/scalar_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/size_field.cc b/system/gd/packet/parser/fields/size_field.cc index 6c0fbb5360..44c3418c55 100644 --- a/system/gd/packet/parser/fields/size_field.cc +++ b/system/gd/packet/parser/fields/size_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/size_field.h b/system/gd/packet/parser/fields/size_field.h index 9258a45752..1bd258fee6 100644 --- a/system/gd/packet/parser/fields/size_field.h +++ b/system/gd/packet/parser/fields/size_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/struct_field.cc b/system/gd/packet/parser/fields/struct_field.cc index 50762045e3..10e3bd26b6 100644 --- a/system/gd/packet/parser/fields/struct_field.cc +++ b/system/gd/packet/parser/fields/struct_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/struct_field.h b/system/gd/packet/parser/fields/struct_field.h index cb05169c28..e2dd1e7c8f 100644 --- a/system/gd/packet/parser/fields/struct_field.h +++ b/system/gd/packet/parser/fields/struct_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/variable_length_struct_field.cc b/system/gd/packet/parser/fields/variable_length_struct_field.cc index 0ba48e8800..f114af50bf 100644 --- a/system/gd/packet/parser/fields/variable_length_struct_field.cc +++ b/system/gd/packet/parser/fields/variable_length_struct_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/variable_length_struct_field.h b/system/gd/packet/parser/fields/variable_length_struct_field.h index 361b7fdca8..34cb38380c 100644 --- a/system/gd/packet/parser/fields/variable_length_struct_field.h +++ b/system/gd/packet/parser/fields/variable_length_struct_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/vector_field.cc b/system/gd/packet/parser/fields/vector_field.cc index 741bcff32f..ca620247da 100644 --- a/system/gd/packet/parser/fields/vector_field.cc +++ b/system/gd/packet/parser/fields/vector_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/vector_field.h b/system/gd/packet/parser/fields/vector_field.h index 8ef1155540..c371a731c4 100644 --- a/system/gd/packet/parser/fields/vector_field.h +++ b/system/gd/packet/parser/fields/vector_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/gen_cpp.cc b/system/gd/packet/parser/gen_cpp.cc index 7dd2deee07..5227c14001 100644 --- a/system/gd/packet/parser/gen_cpp.cc +++ b/system/gd/packet/parser/gen_cpp.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/logging.h b/system/gd/packet/parser/logging.h index 0f1f6f1428..6ccaf7d713 100644 --- a/system/gd/packet/parser/logging.h +++ b/system/gd/packet/parser/logging.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/main.cc b/system/gd/packet/parser/main.cc index 4426f748f8..cfe585c402 100644 --- a/system/gd/packet/parser/main.cc +++ b/system/gd/packet/parser/main.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_def.cc b/system/gd/packet/parser/packet_def.cc index 7753d37547..0d067a371b 100644 --- a/system/gd/packet/parser/packet_def.cc +++ b/system/gd/packet/parser/packet_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_def.h b/system/gd/packet/parser/packet_def.h index 2ca40975ff..1959c4c267 100644 --- a/system/gd/packet/parser/packet_def.h +++ b/system/gd/packet/parser/packet_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_dependency.cc b/system/gd/packet/parser/packet_dependency.cc index 01000ea1ae..ae4c690522 100644 --- a/system/gd/packet/parser/packet_dependency.cc +++ b/system/gd/packet/parser/packet_dependency.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_dependency.h b/system/gd/packet/parser/packet_dependency.h index ad2a5aa024..2e275e6242 100644 --- a/system/gd/packet/parser/packet_dependency.h +++ b/system/gd/packet/parser/packet_dependency.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/parent_def.cc b/system/gd/packet/parser/parent_def.cc index 18fd9a98ba..416ee76ea1 100644 --- a/system/gd/packet/parser/parent_def.cc +++ b/system/gd/packet/parser/parent_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/parent_def.h b/system/gd/packet/parser/parent_def.h index c7816da45b..acaf202d11 100644 --- a/system/gd/packet/parser/parent_def.h +++ b/system/gd/packet/parser/parent_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/parse_location.h b/system/gd/packet/parser/parse_location.h index ee2b747888..a3283ab71c 100644 --- a/system/gd/packet/parser/parse_location.h +++ b/system/gd/packet/parser/parse_location.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/size.h b/system/gd/packet/parser/size.h index f863639e36..493e4ae949 100644 --- a/system/gd/packet/parser/size.h +++ b/system/gd/packet/parser/size.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_def.cc b/system/gd/packet/parser/struct_def.cc index b611bc8957..3f13e0537b 100644 --- a/system/gd/packet/parser/struct_def.cc +++ b/system/gd/packet/parser/struct_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_def.h b/system/gd/packet/parser/struct_def.h index 82bba3446e..a1a9e275b9 100644 --- a/system/gd/packet/parser/struct_def.h +++ b/system/gd/packet/parser/struct_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_parser_generator.cc b/system/gd/packet/parser/struct_parser_generator.cc index cd66b31da6..13d894e3c7 100644 --- a/system/gd/packet/parser/struct_parser_generator.cc +++ b/system/gd/packet/parser/struct_parser_generator.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_parser_generator.h b/system/gd/packet/parser/struct_parser_generator.h index 1f5f9b1fcd..8120b187c6 100644 --- a/system/gd/packet/parser/struct_parser_generator.h +++ b/system/gd/packet/parser/struct_parser_generator.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/generated_packet_test.cc b/system/gd/packet/parser/test/generated_packet_test.cc index e706e15bee..61d7ea1299 100644 --- a/system/gd/packet/parser/test/generated_packet_test.cc +++ b/system/gd/packet/parser/test/generated_packet_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/simple_sum.h b/system/gd/packet/parser/test/simple_sum.h index aea9448803..6228a3abff 100644 --- a/system/gd/packet/parser/test/simple_sum.h +++ b/system/gd/packet/parser/test/simple_sum.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/six_bytes.cc b/system/gd/packet/parser/test/six_bytes.cc index 5122868318..bc5a16e42b 100644 --- a/system/gd/packet/parser/test/six_bytes.cc +++ b/system/gd/packet/parser/test/six_bytes.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/six_bytes.h b/system/gd/packet/parser/test/six_bytes.h index c8b3ea8293..34bd44b1c5 100644 --- a/system/gd/packet/parser/test/six_bytes.h +++ b/system/gd/packet/parser/test/six_bytes.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/variable.cc b/system/gd/packet/parser/test/variable.cc index 727d33a392..ff77914d26 100644 --- a/system/gd/packet/parser/test/variable.cc +++ b/system/gd/packet/parser/test/variable.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/variable.h b/system/gd/packet/parser/test/variable.h index febd3e63f7..c2d4dfabac 100644 --- a/system/gd/packet/parser/test/variable.h +++ b/system/gd/packet/parser/test/variable.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/type_def.h b/system/gd/packet/parser/type_def.h index 9aa5c29731..38c9ae4622 100644 --- a/system/gd/packet/parser/type_def.h +++ b/system/gd/packet/parser/type_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/util.h b/system/gd/packet/parser/util.h index c65a5dc493..cc7f09330d 100644 --- a/system/gd/packet/parser/util.h +++ b/system/gd/packet/parser/util.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/raw_builder.cc b/system/gd/packet/raw_builder.cc index 49ebeed351..46ffe27852 100644 --- a/system/gd/packet/raw_builder.cc +++ b/system/gd/packet/raw_builder.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/raw_builder.h b/system/gd/packet/raw_builder.h index 0b17c049d2..28aa291011 100644 --- a/system/gd/packet/raw_builder.h +++ b/system/gd/packet/raw_builder.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/raw_builder_unittest.cc b/system/gd/packet/raw_builder_unittest.cc index 07beca80c4..827ad2fc3b 100644 --- a/system/gd/packet/raw_builder_unittest.cc +++ b/system/gd/packet/raw_builder_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/view.cc b/system/gd/packet/view.cc index 672d2f7769..22b3f5c202 100644 --- a/system/gd/packet/view.cc +++ b/system/gd/packet/view.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/view.h b/system/gd/packet/view.h index 9ec8c4b1b1..372e2fb837 100644 --- a/system/gd/packet/view.h +++ b/system/gd/packet/view.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/rust/linux/service/src/interface_manager.rs b/system/gd/rust/linux/service/src/interface_manager.rs index 116979de0d..62fdbc8638 100644 --- a/system/gd/rust/linux/service/src/interface_manager.rs +++ b/system/gd/rust/linux/service/src/interface_manager.rs @@ -1,27 +1,29 @@ -use dbus::{channel::MatchingReceiver, message::MatchRule, nonblock::SyncConnection}; +use dbus::channel::MatchingReceiver; +use dbus::message::MatchRule; +use dbus::nonblock::SyncConnection; use dbus_crossroads::Crossroads; use dbus_projection::DisconnectWatcher; use std::sync::{Arc, Mutex}; use tokio::sync::mpsc::{channel, Receiver, Sender}; -use btstack::{ - battery_manager::BatteryManager, battery_provider_manager::BatteryProviderManager, - bluetooth::Bluetooth, bluetooth_admin::BluetoothAdmin, bluetooth_gatt::BluetoothGatt, - bluetooth_logging::BluetoothLogging, bluetooth_media::BluetoothMedia, - bluetooth_qa::BluetoothQA, socket_manager::BluetoothSocketManager, suspend::Suspend, - APIMessage, BluetoothAPI, Message, -}; +use btstack::battery_manager::BatteryManager; +use btstack::battery_provider_manager::BatteryProviderManager; +use btstack::bluetooth::{Bluetooth, SigData}; +use btstack::bluetooth_admin::BluetoothAdmin; +use btstack::bluetooth_gatt::BluetoothGatt; +use btstack::bluetooth_logging::BluetoothLogging; +use btstack::bluetooth_media::BluetoothMedia; +use btstack::bluetooth_qa::BluetoothQA; +use btstack::socket_manager::BluetoothSocketManager; +use btstack::suspend::Suspend; +use btstack::{APIMessage, BluetoothAPI}; -use crate::iface_battery_manager; -use crate::iface_battery_provider_manager; -use crate::iface_bluetooth; -use crate::iface_bluetooth_admin; -use crate::iface_bluetooth_gatt; -use crate::iface_bluetooth_media; -use crate::iface_bluetooth_qa; -use crate::iface_bluetooth_telephony; -use crate::iface_logging; +use crate::{ + iface_battery_manager, iface_battery_provider_manager, iface_bluetooth, iface_bluetooth_admin, + iface_bluetooth_gatt, iface_bluetooth_media, iface_bluetooth_qa, iface_bluetooth_telephony, + iface_logging, +}; pub(crate) struct InterfaceManager {} @@ -50,11 +52,11 @@ impl InterfaceManager { #[allow(clippy::too_many_arguments)] pub async fn dispatch( mut rx: Receiver<APIMessage>, - tx: Sender<Message>, virt_index: i32, conn: Arc<SyncConnection>, conn_join_handle: tokio::task::JoinHandle<()>, disconnect_watcher: Arc<Mutex<DisconnectWatcher>>, + sig_notifier: Arc<SigData>, bluetooth: Arc<Mutex<Box<Bluetooth>>>, bluetooth_admin: Arc<Mutex<Box<BluetoothAdmin>>>, bluetooth_gatt: Arc<Mutex<Box<BluetoothGatt>>>, @@ -93,6 +95,9 @@ impl InterfaceManager { }), ); + *sig_notifier.api_enabled.lock().unwrap() = true; + sig_notifier.api_notify.notify_all(); + // Register D-Bus method handlers of IBluetooth. let adapter_iface = iface_bluetooth::export_bluetooth_dbus_intf( conn.clone(), @@ -246,11 +251,8 @@ impl InterfaceManager { // To shut down the connection, call _handle.abort() and drop the connection. conn_join_handle.abort(); drop(conn); - - let tx = tx.clone(); - tokio::spawn(async move { - let _ = tx.send(Message::AdapterShutdown).await; - }); + *sig_notifier.api_enabled.lock().unwrap() = false; + sig_notifier.api_notify.notify_all(); break; } } diff --git a/system/gd/rust/linux/service/src/main.rs b/system/gd/rust/linux/service/src/main.rs index f326bb62ee..4fc43d11f3 100644 --- a/system/gd/rust/linux/service/src/main.rs +++ b/system/gd/rust/linux/service/src/main.rs @@ -9,22 +9,21 @@ use std::time::Duration; use tokio::runtime::Builder; use tokio::sync::mpsc::Sender; -use bt_topshim::{btif::get_btinterface, topstack}; -use btstack::{ - battery_manager::BatteryManager, - battery_provider_manager::BatteryProviderManager, - battery_service::BatteryService, - bluetooth::{Bluetooth, IBluetooth, SigData}, - bluetooth_admin::BluetoothAdmin, - bluetooth_gatt::BluetoothGatt, - bluetooth_logging::BluetoothLogging, - bluetooth_media::BluetoothMedia, - bluetooth_qa::BluetoothQA, - dis::DeviceInformation, - socket_manager::BluetoothSocketManager, - suspend::Suspend, - Message, Stack, -}; +use bt_topshim::btif::get_btinterface; +use bt_topshim::topstack; +use btstack::battery_manager::BatteryManager; +use btstack::battery_provider_manager::BatteryProviderManager; +use btstack::battery_service::BatteryService; +use btstack::bluetooth::{Bluetooth, IBluetooth, SigData}; +use btstack::bluetooth_admin::BluetoothAdmin; +use btstack::bluetooth_gatt::BluetoothGatt; +use btstack::bluetooth_logging::BluetoothLogging; +use btstack::bluetooth_media::BluetoothMedia; +use btstack::bluetooth_qa::BluetoothQA; +use btstack::dis::DeviceInformation; +use btstack::socket_manager::BluetoothSocketManager; +use btstack::suspend::Suspend; +use btstack::{Message, Stack}; mod dbus_arg; mod iface_battery_manager; @@ -40,6 +39,8 @@ mod interface_manager; const DBUS_SERVICE_NAME: &str = "org.chromium.bluetooth"; const ADMIN_SETTINGS_FILE_PATH: &str = "/var/lib/bluetooth/admin_policy.json"; +// Time to wait for API unregistration in DBus +const API_DISABLE_TIMEOUT_MS: Duration = Duration::from_millis(100); // The maximum ACL disconnect timeout is 3.5s defined by BTA_DM_DISABLE_TIMER_MS // and BTA_DM_DISABLE_TIMER_RETRIAL_MS const STACK_TURN_OFF_TIMEOUT_MS: Duration = Duration::from_millis(4000); @@ -115,6 +116,8 @@ fn main() -> Result<(), Box<dyn Error>> { enabled_notify: Condvar::new(), thread_attached: Mutex::new(false), thread_notify: Condvar::new(), + api_enabled: Mutex::new(false), + api_notify: Condvar::new(), }); // This needs to be built before any |topstack::get_runtime()| call! @@ -148,8 +151,14 @@ fn main() -> Result<(), Box<dyn Error>> { signal::SaFlags::empty(), signal::SigSet::empty(), ); + let sig_action_usr1 = signal::SigAction::new( + signal::SigHandler::Handler(handle_sigusr1), + signal::SaFlags::empty(), + signal::SigSet::empty(), + ); unsafe { signal::sigaction(signal::SIGTERM, &sig_action_term).unwrap(); + signal::sigaction(signal::SIGUSR1, &sig_action_usr1).unwrap(); } // Construct btstack profiles. @@ -241,11 +250,11 @@ fn main() -> Result<(), Box<dyn Error>> { tokio::spawn(interface_manager::InterfaceManager::dispatch( api_rx, - tx.clone(), virt_index, conn, conn_join_handle, disconnect_watcher.clone(), + sig_notifier.clone(), bluetooth.clone(), bluetooth_admin.clone(), bluetooth_gatt.clone(), @@ -267,37 +276,63 @@ fn main() -> Result<(), Box<dyn Error>> { /// Data needed for signal handling. static SIG_DATA: Mutex<Option<(Sender<Message>, Arc<SigData>)>> = Mutex::new(None); -extern "C" fn handle_sigterm(_signum: i32) { - let guard = SIG_DATA.lock().unwrap(); - if let Some((tx, notifier)) = guard.as_ref() { - log::debug!("Handling SIGTERM by disabling the adapter!"); - let txl = tx.clone(); - topstack::get_runtime().spawn(async move { - // Send the shutdown message here. - let _ = txl.send(Message::InterfaceShutdown).await; - }); +/// Try to cleanup the whole stack. Returns whether to clean up. +extern "C" fn try_cleanup_stack(abort: bool) -> bool { + let lock = SIG_DATA.try_lock(); + + // If SIG_DATA is locked, it is likely the cleanup procedure is ongoing. No + // need to do anything here. + if lock.is_err() { + return false; + } + + if let Some((tx, notifier)) = lock.unwrap().as_ref() { + log::info!("Cleanup stack: disabling the adapter!"); + + // Remove the API first to prevent clients calling while shutting down. + let guard = notifier.api_enabled.lock().unwrap(); + if *guard { + let txl = tx.clone(); + topstack::get_runtime().spawn(async move { + // Remove the API first to prevent clients calling while shutting down. + let _ = txl.send(Message::InterfaceShutdown).await; + }); + log::info!( + "Cleanup stack: Waiting for API shutdown to complete for {:?}", + API_DISABLE_TIMEOUT_MS + ); + let _ = notifier.api_notify.wait_timeout(guard, API_DISABLE_TIMEOUT_MS); + } let guard = notifier.enabled.lock().unwrap(); if *guard { - log::debug!("Waiting for stack to turn off for {:?}", STACK_TURN_OFF_TIMEOUT_MS); + let txl = tx.clone(); + topstack::get_runtime().spawn(async move { + let _ = txl.send(Message::AdapterShutdown(abort)).await; + }); + log::info!( + "Cleanup stack: Waiting for stack to turn off for {:?}", + STACK_TURN_OFF_TIMEOUT_MS + ); let _ = notifier.enabled_notify.wait_timeout(guard, STACK_TURN_OFF_TIMEOUT_MS); } - log::debug!("SIGTERM cleaning up the stack."); - let txl = tx.clone(); - topstack::get_runtime().spawn(async move { - // Clean up the profiles first as some of them might require main thread to clean up. - let _ = txl.send(Message::CleanupProfiles).await; - // Currently there is no good way to know when the profile is cleaned. - // Simply add a small delay here. - tokio::time::sleep(STACK_CLEANUP_PROFILES_TIMEOUT_MS).await; - // Send the cleanup message to clean up the main thread. - let _ = txl.send(Message::Cleanup).await; - }); - let guard = notifier.thread_attached.lock().unwrap(); if *guard { - log::debug!("Waiting for stack to clean up for {:?}", STACK_CLEANUP_TIMEOUT_MS); + let txl = tx.clone(); + topstack::get_runtime().spawn(async move { + // Clean up the profiles first as some of them might require main thread to clean up. + let _ = txl.send(Message::CleanupProfiles).await; + // Currently there is no good way to know when the profile is cleaned. + // Simply add a small delay here. + tokio::time::sleep(STACK_CLEANUP_PROFILES_TIMEOUT_MS).await; + // Send the cleanup message to clean up the main thread. + let _ = txl.send(Message::Cleanup).await; + }); + log::info!( + "Cleanup stack: Waiting for libbluetooth stack to clean up for {:?}", + STACK_CLEANUP_TIMEOUT_MS + ); let _ = notifier.thread_notify.wait_timeout(guard, STACK_CLEANUP_TIMEOUT_MS); } @@ -305,7 +340,26 @@ extern "C" fn handle_sigterm(_signum: i32) { // finishing btif cleanup. std::thread::sleep(EXTRA_WAIT_BEFORE_KILL_MS); } + return true; +} - log::debug!("Sigterm completed"); +extern "C" fn handle_sigterm(_signum: i32) { + log::info!("SIGTERM received"); + if !try_cleanup_stack(false) { + log::info!("Skipped to handle SIGTERM"); + return; + } + log::info!("SIGTERM completed"); + std::process::exit(0); +} + +/// Used to indicate controller needs reset +extern "C" fn handle_sigusr1(_signum: i32) { + log::info!("SIGUSR1 received"); + if !try_cleanup_stack(true) { + log::info!("Skipped to handle SIGUSR1"); + return; + } + log::info!("SIGUSR1 completed"); std::process::exit(0); } diff --git a/system/gd/rust/linux/stack/src/bluetooth.rs b/system/gd/rust/linux/stack/src/bluetooth.rs index bac9c4a1a9..ade91229c4 100644 --- a/system/gd/rust/linux/stack/src/bluetooth.rs +++ b/system/gd/rust/linux/stack/src/bluetooth.rs @@ -503,6 +503,9 @@ pub struct SigData { pub thread_attached: Mutex<bool>, pub thread_notify: Condvar, + + pub api_enabled: Mutex<bool>, + pub api_notify: Condvar, } /// The interface for adapter callbacks registered through `IBluetooth::register_callback`. @@ -818,6 +821,21 @@ impl Bluetooth { self.connection_callbacks.remove_callback(id); } + pub fn shutdown_adapter(&mut self, abort: bool) -> bool { + self.disabling = true; + + if !abort { + if !self.set_discoverable(BtDiscMode::NonDiscoverable, 0) { + warn!("set_discoverable failed on disabling"); + } + if !self.set_connectable_internal(false) { + warn!("set_connectable_internal failed on disabling"); + } + } + + self.intf.lock().unwrap().disable() == 0 + } + fn get_remote_device_property( &self, device: &BluetoothDevice, @@ -2240,14 +2258,7 @@ impl IBluetooth for Bluetooth { } fn disable(&mut self) -> bool { - self.disabling = true; - if !self.set_discoverable(BtDiscMode::NonDiscoverable, 0) { - warn!("set_discoverable failed on disabling"); - } - if !self.set_connectable_internal(false) { - warn!("set_connectable_internal failed on disabling"); - } - self.intf.lock().unwrap().disable() == 0 + self.shutdown_adapter(false) } fn cleanup(&mut self) { diff --git a/system/gd/rust/linux/stack/src/lib.rs b/system/gd/rust/linux/stack/src/lib.rs index d9f97bfa32..4f49a186b4 100644 --- a/system/gd/rust/linux/stack/src/lib.rs +++ b/system/gd/rust/linux/stack/src/lib.rs @@ -66,7 +66,9 @@ pub enum Message { /// Remove the DBus API. Call it before other AdapterShutdown. InterfaceShutdown, /// Disable the adapter by calling btif disable. - AdapterShutdown, + /// Param: bool to indicate abort(true) or graceful shutdown(false). + /// Use abort when we believe adapter is already in a bad state. + AdapterShutdown(bool), /// Clean up the adapter by calling btif cleanup. Cleanup, /// Clean up the media by calling profile cleanup. @@ -287,9 +289,9 @@ impl Stack { }); } - Message::AdapterShutdown => { + Message::AdapterShutdown(abort) => { bluetooth_gatt.lock().unwrap().enable(false); - bluetooth.lock().unwrap().disable(); + bluetooth.lock().unwrap().shutdown_adapter(abort); } Message::Cleanup => { diff --git a/system/gd/rust/topshim/controller/controller_shim.cc b/system/gd/rust/topshim/controller/controller_shim.cc index b47065f440..4b587d79b3 100644 --- a/system/gd/rust/topshim/controller/controller_shim.cc +++ b/system/gd/rust/topshim/controller/controller_shim.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/classic_device.cc b/system/gd/storage/classic_device.cc index f2104a9c07..e49e6b214e 100644 --- a/system/gd/storage/classic_device.cc +++ b/system/gd/storage/classic_device.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/classic_device.h b/system/gd/storage/classic_device.h index 155b44d8d8..dec4ebceda 100644 --- a/system/gd/storage/classic_device.h +++ b/system/gd/storage/classic_device.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/classic_device_test.cc b/system/gd/storage/classic_device_test.cc index ae26587d7a..2dbe9df5d6 100644 --- a/system/gd/storage/classic_device_test.cc +++ b/system/gd/storage/classic_device_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache.cc b/system/gd/storage/config_cache.cc index f2517be128..c506c3dcae 100644 --- a/system/gd/storage/config_cache.cc +++ b/system/gd/storage/config_cache.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache.h b/system/gd/storage/config_cache.h index 238660170c..25a3a1b6c3 100644 --- a/system/gd/storage/config_cache.h +++ b/system/gd/storage/config_cache.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_helper.cc b/system/gd/storage/config_cache_helper.cc index 485ed61508..7c2eb7d630 100644 --- a/system/gd/storage/config_cache_helper.cc +++ b/system/gd/storage/config_cache_helper.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_helper.h b/system/gd/storage/config_cache_helper.h index e4f5c23a57..2f02c0e0e4 100644 --- a/system/gd/storage/config_cache_helper.h +++ b/system/gd/storage/config_cache_helper.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_helper_test.cc b/system/gd/storage/config_cache_helper_test.cc index e149c3777c..5ad20e6be0 100644 --- a/system/gd/storage/config_cache_helper_test.cc +++ b/system/gd/storage/config_cache_helper_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_test.cc b/system/gd/storage/config_cache_test.cc index c129e8841b..3aa0bc493d 100644 --- a/system/gd/storage/config_cache_test.cc +++ b/system/gd/storage/config_cache_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/device.cc b/system/gd/storage/device.cc index 7210a110fe..b84f360477 100644 --- a/system/gd/storage/device.cc +++ b/system/gd/storage/device.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/device.h b/system/gd/storage/device.h index 03311d1504..40ca990080 100644 --- a/system/gd/storage/device.h +++ b/system/gd/storage/device.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/device_test.cc b/system/gd/storage/device_test.cc index 01754cfd7e..ab8d399db0 100644 --- a/system/gd/storage/device_test.cc +++ b/system/gd/storage/device_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/le_device.cc b/system/gd/storage/le_device.cc index 3cbbb7839f..bf6475faa8 100644 --- a/system/gd/storage/le_device.cc +++ b/system/gd/storage/le_device.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/le_device.h b/system/gd/storage/le_device.h index 835519929e..aa5c4d8815 100644 --- a/system/gd/storage/le_device.h +++ b/system/gd/storage/le_device.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/le_device_test.cc b/system/gd/storage/le_device_test.cc index b18b4e2fb7..c32c94f3d3 100644 --- a/system/gd/storage/le_device_test.cc +++ b/system/gd/storage/le_device_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/legacy_config_file.cc b/system/gd/storage/legacy_config_file.cc index 0bee52af03..29f09da9bd 100644 --- a/system/gd/storage/legacy_config_file.cc +++ b/system/gd/storage/legacy_config_file.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/legacy_config_file.h b/system/gd/storage/legacy_config_file.h index 2a5a8bf9b0..0bfa1651b6 100644 --- a/system/gd/storage/legacy_config_file.h +++ b/system/gd/storage/legacy_config_file.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/legacy_config_file_test.cc b/system/gd/storage/legacy_config_file_test.cc index b52891793f..1c11ea8ba0 100644 --- a/system/gd/storage/legacy_config_file_test.cc +++ b/system/gd/storage/legacy_config_file_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation.cc b/system/gd/storage/mutation.cc index e091344f36..097357a668 100644 --- a/system/gd/storage/mutation.cc +++ b/system/gd/storage/mutation.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation.h b/system/gd/storage/mutation.h index 4f24e7725b..ec801f13ee 100644 --- a/system/gd/storage/mutation.h +++ b/system/gd/storage/mutation.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation_entry.cc b/system/gd/storage/mutation_entry.cc index 5d610e70ef..a3b99afd09 100644 --- a/system/gd/storage/mutation_entry.cc +++ b/system/gd/storage/mutation_entry.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation_entry.h b/system/gd/storage/mutation_entry.h index cc1a3d09ed..00ce85bc6c 100644 --- a/system/gd/storage/mutation_entry.h +++ b/system/gd/storage/mutation_entry.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation_test.cc b/system/gd/storage/mutation_test.cc index 1a1a3e82ff..c99b3d754f 100644 --- a/system/gd/storage/mutation_test.cc +++ b/system/gd/storage/mutation_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/serializable.h b/system/gd/storage/serializable.h index ef26d3a4f4..0b617e0d3d 100644 --- a/system/gd/storage/serializable.h +++ b/system/gd/storage/serializable.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/storage_module.cc b/system/gd/storage/storage_module.cc index 9a59caf4f6..5e3459e109 100644 --- a/system/gd/storage/storage_module.cc +++ b/system/gd/storage/storage_module.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/storage_module.h b/system/gd/storage/storage_module.h index 8899423697..de47e71e25 100644 --- a/system/gd/storage/storage_module.h +++ b/system/gd/storage/storage_module.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/storage_module_test.cc b/system/gd/storage/storage_module_test.cc index 488eda0a53..7eaf3ae3fa 100644 --- a/system/gd/storage/storage_module_test.cc +++ b/system/gd/storage/storage_module_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/sysprops/sysprops_module.cc b/system/gd/sysprops/sysprops_module.cc index 0cdcaa2efa..b994bcf52c 100644 --- a/system/gd/sysprops/sysprops_module.cc +++ b/system/gd/sysprops/sysprops_module.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/sysprops/sysprops_module.h b/system/gd/sysprops/sysprops_module.h index d1050bd660..eaeb648941 100644 --- a/system/gd/sysprops/sysprops_module.h +++ b/system/gd/sysprops/sysprops_module.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/sysprops/sysprops_module_test.cc b/system/gd/sysprops/sysprops_module_test.cc index e427db3831..e4f90b9068 100644 --- a/system/gd/sysprops/sysprops_module_test.cc +++ b/system/gd/sysprops/sysprops_module_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/include/hardware/bluetooth_headset_interface.h b/system/include/hardware/bluetooth_headset_interface.h index b2b98ffe1f..396c2b2880 100644 --- a/system/include/hardware/bluetooth_headset_interface.h +++ b/system/include/hardware/bluetooth_headset_interface.h @@ -97,9 +97,10 @@ public: /** * Start voice recognition * @param bd_addr remote device address + * @param sendResult whether a BVRA response should be sent * @return BT_STATUS_SUCCESS on success */ - virtual bt_status_t StartVoiceRecognition(RawAddress* bd_addr) = 0; + virtual bt_status_t StartVoiceRecognition(RawAddress* bd_addr, bool sendResult) = 0; /** * Stop voice recognition diff --git a/system/linux_include/log/log.h b/system/linux_include/log/log.h deleted file mode 100644 index 037649312c..0000000000 --- a/system/linux_include/log/log.h +++ /dev/null @@ -1,24 +0,0 @@ -/****************************************************************************** - * - * Copyright 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#pragma once - -#ifndef __ANDROID__ - -#include <cstdint> - -#endif diff --git a/system/main/shim/stack.cc b/system/main/shim/stack.cc index bb8994aee0..14447d75b3 100644 --- a/system/main/shim/stack.cc +++ b/system/main/shim/stack.cc @@ -169,11 +169,8 @@ void Stack::Stop() { log::assert_that(is_running_, "Gd stack not running"); is_running_ = false; - if (!com::android::bluetooth::flags::same_handler_for_all_modules()) { - // Clear the handler only if the flag is not defined, otherwise it will be cleared by the - // registry - stack_handler_->Clear(); - } + stack_handler_->Clear(); + WakelockManager::Get().Acquire(); std::promise<void> promise; @@ -195,14 +192,7 @@ void Stack::Stop() { delete management_handler_; delete management_thread_; - if (!com::android::bluetooth::flags::same_handler_for_all_modules()) { - // delete the handler only if the flag is not defined, otherwise it will be deleted by the - // registry - delete stack_handler_; - } - - // stack_handler_ is already deleted by the registry in handle_shut_down, just set it to nullptr - // to avoid any potential use-after-free + delete stack_handler_; stack_handler_ = nullptr; stack_thread_->Stop(); diff --git a/system/main/test/main_shim_test.cc b/system/main/test/main_shim_test.cc index 2f4056a381..c66024cabb 100644 --- a/system/main/test/main_shim_test.cc +++ b/system/main/test/main_shim_test.cc @@ -332,8 +332,10 @@ protected: thread_ = new os::Thread("acl_thread", os::Thread::Priority::NORMAL); handler_ = new os::Handler(thread_); - /* extern */ test::mock_controller_ = new bluetooth::hci::testing::MockControllerInterface(); - /* extern */ test::mock_acl_manager_ = new bluetooth::hci::testing::MockAclManager(); + /* extern */ test::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + /* extern */ test::mock_acl_manager_ = + std::make_unique<bluetooth::hci::testing::MockAclManager>(); /* extern */ test::mock_le_scanning_manager_ = new bluetooth::hci::testing::MockLeScanningManager(); /* extern */ test::mock_le_advertising_manager_ = @@ -342,10 +344,8 @@ protected: new bluetooth::hci::testing::MockDistanceMeasurementManager(); } void TearDown() override { - delete test::mock_controller_; - test::mock_controller_ = nullptr; - delete test::mock_acl_manager_; - test::mock_acl_manager_ = nullptr; + test::mock_controller_.reset(); + test::mock_acl_manager_.release(); delete test::mock_le_advertising_manager_; test::mock_le_advertising_manager_ = nullptr; delete test::mock_le_scanning_manager_; @@ -567,7 +567,6 @@ TEST_F(MainShimTest, DISABLED_BleScannerInterfaceImpl_OnScanResult) { bluetooth::shim::get_ble_scanner_instance()); EXPECT_CALL(*hci::testing::mock_le_scanning_manager_, RegisterScanningCallback(_)).Times(1); - ; bluetooth::shim::init_scanning_manager(); TestScanningCallbacks cb; diff --git a/system/osi/BUILD.gn b/system/osi/BUILD.gn index 5bdf04c1e9..fa47062f52 100644 --- a/system/osi/BUILD.gn +++ b/system/osi/BUILD.gn @@ -43,7 +43,6 @@ static_library("osi") { include_dirs = [ "//bt/system/", - "//bt/system/linux_include", "//bt/system/osi/include_internal", "//bt/system/stack/include", ] diff --git a/system/pdl/hci/hci_packets.pdl b/system/pdl/hci/hci_packets.pdl index fcdd255b99..838b1fa586 100644 --- a/system/pdl/hci/hci_packets.pdl +++ b/system/pdl/hci/hci_packets.pdl @@ -4949,7 +4949,8 @@ struct CsOptionalNadmRandomCapability { struct CsOptionalCsSyncPhysSupported { le_2m_phy : 1, - _reserved_ : 7, + le_2m_2bt_phy : 1, + _reserved_ : 6, } struct CsOptionalSubfeaturesSupported { @@ -5151,6 +5152,7 @@ enum CsConfigRttType : 8 { enum CsSyncPhy : 8 { LE_1M_PHY = 0x01, LE_2M_PHY = 0x02, + LE_2M_2BT_PHY = 0x03, } enum CsChannelSelectionType : 8 { diff --git a/system/stack/Android.bp b/system/stack/Android.bp index ebab1ff5f4..78af467a76 100644 --- a/system/stack/Android.bp +++ b/system/stack/Android.bp @@ -48,7 +48,6 @@ cc_library_static { "hid", "include", "l2cap", - "metrics", "pan", "sdp", "smp", @@ -183,7 +182,6 @@ cc_library_static { "l2cap/l2c_main.cc", "l2cap/l2c_utils.cc", "l2cap/l2cap_api.cc", - "metrics/stack_metrics_logging.cc", "pan/pan_api.cc", "pan/pan_main.cc", "pan/pan_utils.cc", @@ -374,9 +372,9 @@ cc_fuzz { ":TestFakeOsi", ":TestMockBtif", ":TestMockDevice", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", "fuzzers/sdp_fuzzer.cc", ], static_libs: [ @@ -414,6 +412,7 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockSrvcDis", ":TestMockStackAcl", @@ -421,7 +420,6 @@ cc_fuzz { ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "fuzzers/rfcomm_fuzzer.cc", "rfcomm/*.cc", @@ -465,6 +463,7 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockSrvcDis", ":TestMockStackAcl", @@ -473,7 +472,6 @@ cc_fuzz { ":TestMockStackConnMgr", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "ais/*.cc", "eatt/*.cc", @@ -517,12 +515,12 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", "fuzzers/smp_fuzzer.cc", "smp/*.cc", // add other sources files (p256 related) under smp into this test ], @@ -563,12 +561,12 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", "bnep/*.cc", "fuzzers/bnep_fuzzer.cc", ], @@ -601,12 +599,12 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "avct/*.cc", "avrc/*.cc", @@ -648,11 +646,11 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", - ":TestMockStackMetrics", "fuzzers/l2cap_fuzzer.cc", "l2cap/*.cc", ], @@ -809,10 +807,10 @@ cc_test { ":TestCommonMockFunctions", ":TestMockHci", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", ":TestMockStackL2capInterface", - ":TestMockStackMetrics", ":TestMockStackRfcommMetrics", "rfcomm/port_api.cc", "rfcomm/port_rfc.cc", @@ -903,12 +901,12 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", "smp/p_256_curvepara.cc", "smp/p_256_ecc_pp.cc", "smp/p_256_multprecision.cc", @@ -1006,9 +1004,9 @@ cc_test { ":TestCommonMainHandler", ":TestCommonMockFunctions", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", - ":TestMockStackMetrics", "connection_manager/connection_manager.cc", "test/connection_manager_test.cc", ], @@ -1419,10 +1417,10 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackConnMgr", ":TestMockStackL2cap", - ":TestMockStackMetrics", "gatt/gatt_db.cc", "gatt/gatt_sr_hash.cc", "gatt/gatt_utils.cc", @@ -1675,7 +1673,6 @@ cc_test { "btm/hfp_msbc_decoder.cc", "btm/hfp_msbc_encoder.cc", "btm/security_event_parser.cc", - "metrics/stack_metrics_logging.cc", "test/btm/peer_packet_types_test.cc", "test/btm/sco_hci_test.cc", "test/btm/sco_pkt_status_test.cc", @@ -1813,9 +1810,9 @@ cc_test { ], srcs: [ ":TestCommonMockFunctions", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "hid/hidd_api.cc", "hid/hidd_conn.cc", @@ -1887,12 +1884,12 @@ cc_test { ":TestMockBtif", ":TestMockHci", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSmp", "btu/btu_hcif.cc", "btu/main_thread.cc", @@ -1964,12 +1961,12 @@ cc_test { ":TestMockBtif", ":TestMockHci", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockSrvcDis", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", ":TestMockStackSmp", "ais/ais_ble.cc", @@ -2165,6 +2162,7 @@ cc_test { ":TestMockHci", ":TestMockLegacyHciInterface", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", ":TestMockStackBtu", @@ -2172,7 +2170,6 @@ cc_test { ":TestMockStackGatt", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", ":TestMockStackSmp", "acl/*.cc", @@ -2349,9 +2346,9 @@ cc_test { ":TestFakeOsi", ":TestMockBta", ":TestMockBtif", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", "test/sdp/stack_sdp_api_test.cc", "test/sdp/stack_sdp_db_test.cc", "test/sdp/stack_sdp_parse_test.cc", diff --git a/system/stack/BUILD.gn b/system/stack/BUILD.gn index d078d1bc14..f06a098bd5 100644 --- a/system/stack/BUILD.gn +++ b/system/stack/BUILD.gn @@ -149,7 +149,6 @@ source_set("stack") { "l2cap/l2c_main.cc", "l2cap/l2c_utils.cc", "l2cap/l2cap_api.cc", - "metrics/stack_metrics_logging.cc", "pan/pan_api.cc", "pan/pan_main.cc", "pan/pan_utils.cc", @@ -210,7 +209,6 @@ source_set("stack") { "//bt/system/ctrlr/include", "//bt/system/gd", "//bt/system/hcis", - "//bt/system/linux_include", "//bt/system/rpc/include", "//bt/system/udrv/include", "//bt/system/vnd/ble", @@ -367,7 +365,6 @@ if (defined(use.android) && use.android) { include_dirs = [ "//bt/system/", - "//bt/system/linux_include", "//bt/system/bta/include", "//bt/system/bta/sys", "//bt/system/embdrv/sbc/encoder/include", diff --git a/system/stack/btm/btm_ble_sec.cc b/system/stack/btm/btm_ble_sec.cc index b7db7fa130..cef553c79e 100644 --- a/system/stack/btm/btm_ble_sec.cc +++ b/system/stack/btm/btm_ble_sec.cc @@ -1621,8 +1621,16 @@ void btm_ble_connection_established(const RawAddress& bda) { !p_dev_rec->sec_rec.is_le_link_key_known())) { // Unknown device if (p_dev_rec->dev_class == kDevClassEmpty || p_dev_rec->dev_class == kDevClassUnclassified) { - // Class of device not known, read appearance characteristic - btm_ble_read_remote_cod(bda); + // Class of device not known, read appearance characteristic ... + // Unless it is one of those devices which don't respond to this request + BD_NAME remote_name = {}; + if (p_dev_rec->sec_rec.is_name_known() && BTM_GetRemoteDeviceName(bda, remote_name) && + interop_match_name(INTEROP_DISABLE_READ_LE_APPEARANCE, (const char*)remote_name)) { + log::warn("Name {} matches IOP database, not reading appearance for {}", + (const char*)remote_name, bda); + } else { + btm_ble_read_remote_cod(bda); + } } } } diff --git a/system/stack/btm/btm_sco.cc b/system/stack/btm/btm_sco.cc index c48b321448..82182135eb 100644 --- a/system/stack/btm/btm_sco.cc +++ b/system/stack/btm/btm_sco.cc @@ -44,6 +44,7 @@ #include "internal_include/bt_target.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "osi/include/properties.h" #include "osi/include/stack_power_telemetry.h" #include "stack/btm/btm_int_types.h" @@ -60,7 +61,6 @@ #include "stack/include/main_thread.h" #include "stack/include/sco_hci_link_interface.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "types/raw_address.h" extern tBTM_CB btm_cb; @@ -1298,7 +1298,8 @@ static void btm_sco_on_disconnected(uint16_t hci_handle, tHCI_REASON reason) { if (fill_plc_stats(&num_decoded_frames, &packet_loss_ratio)) { const int16_t codec_id = sco_codec_type_to_id(codec_type); const std::string codec = sco_codec_type_text(codec_type); - log_hfp_audio_packet_loss_stats(bd_addr, num_decoded_frames, packet_loss_ratio, codec_id); + bluetooth::shim::LogMetricHfpPacketLossStats(bd_addr, num_decoded_frames, packet_loss_ratio, + codec_id); log::debug( "Stopped SCO codec:{}, num_decoded_frames:{}, " "packet_loss_ratio:{:f}", diff --git a/system/stack/btm/btm_sec.cc b/system/stack/btm/btm_sec.cc index b00b779eee..439fa7bc0f 100644 --- a/system/stack/btm/btm_sec.cc +++ b/system/stack/btm/btm_sec.cc @@ -47,6 +47,7 @@ #include "main/shim/acl_api.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "metrics/bluetooth_event.h" #include "osi/include/allocator.h" #include "osi/include/properties.h" @@ -75,7 +76,6 @@ #include "stack/include/main_thread.h" #include "stack/include/rnr_interface.h" #include "stack/include/smp_api.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -1923,7 +1923,7 @@ static void btm_sec_bond_cancel_complete(void) { void btm_create_conn_cancel_complete(uint8_t status, const RawAddress bd_addr) { log::verbose("btm_create_conn_cancel_complete(): in State: {} status:{}", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state), status); - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( &bd_addr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, android::bluetooth::hci::CMD_CREATE_CONNECTION_CANCEL, @@ -2440,8 +2440,7 @@ void btm_io_capabilities_req(RawAddress p) { /* If device is bonded, and encrypted it's upgrading security and it's ok. * If it's bonded and not encrypted, it's remote missing keys scenario */ - if (!p_dev_rec->sec_rec.is_device_encrypted() && - com::android::bluetooth::flags::key_missing_classic_device()) { + if (!p_dev_rec->sec_rec.is_device_encrypted()) { log::warn("Incoming bond request, but {} is already bonded (notifying user)", p); bta_dm_remote_key_missing(p); btm_sec_disconnect(p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE, @@ -2632,8 +2631,7 @@ void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data) { /* If device is bonded, and encrypted it's upgrading security and it's ok. * If it's bonded and not encrypted, it's remote missing keys scenario */ - if (btm_sec_is_a_bonded_dev(evt_data.bd_addr) && !p_dev_rec->sec_rec.is_device_encrypted() && - com::android::bluetooth::flags::key_missing_classic_device()) { + if (btm_sec_is_a_bonded_dev(evt_data.bd_addr) && !p_dev_rec->sec_rec.is_device_encrypted()) { log::warn("Incoming bond request, but {} is already bonded (notifying user)", evt_data.bd_addr); bta_dm_remote_key_missing(evt_data.bd_addr); btm_sec_disconnect(p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE, @@ -3031,8 +3029,7 @@ void btm_sec_auth_complete(uint16_t handle, tHCI_STATUS status) { p_dev_rec->sec_rec.classic_link, p_dev_rec->bd_addr, reinterpret_cast<char const*>(p_dev_rec->sec_bd_name)); - if (status == HCI_ERR_KEY_MISSING && - com::android::bluetooth::flags::key_missing_classic_device()) { + if (status == HCI_ERR_KEY_MISSING) { log::warn("auth_complete KEY_MISSING {} is already bonded (notifying user)", p_dev_rec->bd_addr); bta_dm_remote_key_missing(p_dev_rec->bd_addr); @@ -3321,10 +3318,8 @@ void btm_sec_encrypt_change(uint16_t handle, tHCI_STATUS status, uint8_t encr_en if (status == HCI_ERR_KEY_MISSING) { log::info("Remote key missing - will report"); bta_dm_remote_key_missing(p_dev_rec->ble.pseudo_addr); - if (com::android::bluetooth::flags::sec_disconnect_on_le_key_missing()) { - btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_HOST_REJECT_SECURITY, - p_dev_rec->ble_hci_handle, "encryption_change:key_missing"); - } + btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_HOST_REJECT_SECURITY, + p_dev_rec->ble_hci_handle, "encryption_change:key_missing"); return; } diff --git a/system/stack/btm/security_event_parser.cc b/system/stack/btm/security_event_parser.cc index 84d7005d16..deba84b67f 100644 --- a/system/stack/btm/security_event_parser.cc +++ b/system/stack/btm/security_event_parser.cc @@ -25,10 +25,10 @@ #include "common/metrics.h" #include "hci/hci_packets.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "stack/include/btm_sec_api_types.h" #include "stack/include/hci_error_code.h" #include "stack/include/sec_hci_link_interface.h" -#include "stack/include/stack_metrics_logging.h" #include "types/raw_address.h" using namespace bluetooth; @@ -46,8 +46,8 @@ static void log_address_and_status(const Address& bda, EventCode event_code, uint16_t reason = android::bluetooth::hci::STATUS_UNKNOWN; uint16_t handle = bluetooth::common::kUnknownConnectionHandle; int64_t value = 0; - log_classic_pairing_event(ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), - status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent( + ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), status, reason, value); } static void log_address(const Address& bda, EventCode event_code) { uint32_t cmd = android::bluetooth::hci::CMD_UNKNOWN; @@ -55,8 +55,8 @@ static void log_address(const Address& bda, EventCode event_code) { uint16_t reason = android::bluetooth::hci::STATUS_UNKNOWN; uint16_t handle = bluetooth::common::kUnknownConnectionHandle; int64_t value = 0; - log_classic_pairing_event(ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), - status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent( + ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), status, reason, value); } static void parse_encryption_change(const EventView event) { auto change_opt = EncryptionChangeView::CreateOptional(event); @@ -69,7 +69,7 @@ static void parse_encryption_change(const EventView event) { btm_sec_encryption_change_evt(handle, static_cast<tHCI_STATUS>(status), static_cast<uint8_t>(encr_enable), 0); - log_classic_pairing_event( + bluetooth::shim::LogMetricClassicPairingEvent( ToRawAddress(Address::kEmpty), handle, android::bluetooth::hci::CMD_UNKNOWN, static_cast<uint32_t>(change.GetEventCode()), static_cast<uint16_t>(status), android::bluetooth::hci::STATUS_UNKNOWN, 0); @@ -86,7 +86,7 @@ static void parse_encryption_change_v2(const EventView event) { btm_sec_encryption_change_evt(handle, static_cast<tHCI_STATUS>(status), static_cast<uint8_t>(encr_enable), key_size); - log_classic_pairing_event( + bluetooth::shim::LogMetricClassicPairingEvent( ToRawAddress(Address::kEmpty), handle, android::bluetooth::hci::CMD_UNKNOWN, static_cast<uint32_t>(change.GetEventCode()), static_cast<uint16_t>(status), android::bluetooth::hci::STATUS_UNKNOWN, 0); @@ -96,7 +96,7 @@ static void parse_change_connection_link_key_complete(const EventView event) { log::assert_that(complete_opt.has_value(), "assert failed: complete_opt.has_value()"); auto complete = complete_opt.value(); - log_classic_pairing_event( + bluetooth::shim::LogMetricClassicPairingEvent( ToRawAddress(Address::kEmpty), complete.GetConnectionHandle(), android::bluetooth::hci::CMD_UNKNOWN, static_cast<uint32_t>(complete.GetEventCode()), static_cast<uint16_t>(complete.GetStatus()), android::bluetooth::hci::STATUS_UNKNOWN, 0); diff --git a/system/stack/btu/btu_hcif.cc b/system/stack/btu/btu_hcif.cc index 7a4b6d1256..ee3c9757a5 100644 --- a/system/stack/btu/btu_hcif.cc +++ b/system/stack/btu/btu_hcif.cc @@ -40,6 +40,7 @@ #include "common/metrics.h" #include "internal_include/bt_target.h" #include "main/shim/hci_layer.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "stack/include/acl_api.h" #include "stack/include/acl_hci_link_interface.h" @@ -59,7 +60,6 @@ #include "stack/include/sco_hci_link_interface.h" #include "stack/include/sec_hci_link_interface.h" #include "stack/include/smp_api.h" -#include "stack/include/stack_metrics_logging.h" #include "types/hci_role.h" #include "types/raw_address.h" @@ -125,25 +125,29 @@ static void btu_hcif_log_event_metrics(uint8_t evt_code, const uint8_t* p_event) case HCI_KEYPRESS_NOTIFY_EVT: case HCI_REMOTE_OOB_DATA_REQUEST_EVT: STREAM_TO_BDADDR(bda, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + value); break; case HCI_SIMPLE_PAIRING_COMPLETE_EVT: STREAM_TO_UINT8(status, p_event); STREAM_TO_BDADDR(bda, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + value); break; case HCI_AUTHENTICATION_COMP_EVT: STREAM_TO_UINT8(status, p_event); STREAM_TO_UINT16(handle, p_event); handle = HCID_GET_HANDLE(handle); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + value); break; case HCI_ENCRYPTION_CHANGE_EVT: { uint8_t encryption_enabled; STREAM_TO_UINT8(status, p_event); STREAM_TO_UINT16(handle, p_event); STREAM_TO_UINT8(encryption_enabled, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, encryption_enabled); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + encryption_enabled); break; } case HCI_ENCRYPTION_CHANGE_EVT_V2: { @@ -153,7 +157,8 @@ static void btu_hcif_log_event_metrics(uint8_t evt_code, const uint8_t* p_event) STREAM_TO_UINT16(handle, p_event); STREAM_TO_UINT8(encryption_enabled, p_event); STREAM_TO_UINT8(key_size, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, encryption_enabled); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + encryption_enabled); break; } case HCI_ESCO_CONNECTION_COMP_EVT: { @@ -163,18 +168,19 @@ static void btu_hcif_log_event_metrics(uint8_t evt_code, const uint8_t* p_event) STREAM_TO_BDADDR(bda, p_event); STREAM_TO_UINT8(link_type, p_event); handle = HCID_GET_HANDLE(handle); - log_link_layer_connection_event(&bda, handle, android::bluetooth::DIRECTION_UNKNOWN, - link_type, cmd, evt_code, - android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + &bda, handle, android::bluetooth::DIRECTION_UNKNOWN, link_type, cmd, evt_code, + android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); break; } case HCI_ESCO_CONNECTION_CHANGED_EVT: { STREAM_TO_UINT8(status, p_event); STREAM_TO_UINT16(handle, p_event); handle = HCID_GET_HANDLE(handle); - log_link_layer_connection_event(nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, - android::bluetooth::LINK_TYPE_UNKNOWN, cmd, evt_code, - android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, + android::bluetooth::LINK_TYPE_UNKNOWN, cmd, evt_code, + android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); break; } // Ignore these events @@ -368,7 +374,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_CREATE_CONNECTION: case HCI_CREATE_CONNECTION_CANCEL: STREAM_TO_BDADDR(bd_addr, p_cmd); - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( &bd_addr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -376,23 +382,24 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_DISCONNECT: STREAM_TO_UINT16(handle, p_cmd); STREAM_TO_UINT8(reason, p_cmd); - log_link_layer_connection_event(nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, - android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, - kUnknownBleEvt, cmd_status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, + android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, kUnknownBleEvt, cmd_status, + reason); break; case HCI_SETUP_ESCO_CONNECTION: case HCI_ENH_SETUP_ESCO_CONNECTION: STREAM_TO_UINT16(handle, p_cmd); - log_link_layer_connection_event(nullptr, handle, android::bluetooth::DIRECTION_OUTGOING, - android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, - kUnknownBleEvt, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + nullptr, handle, android::bluetooth::DIRECTION_OUTGOING, + android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, kUnknownBleEvt, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN); break; case HCI_ACCEPT_CONNECTION_REQUEST: case HCI_ACCEPT_ESCO_CONNECTION: case HCI_ENH_ACCEPT_ESCO_CONNECTION: STREAM_TO_BDADDR(bd_addr, p_cmd); - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( &bd_addr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_INCOMING, android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -401,10 +408,10 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_REJECT_ESCO_CONNECTION: STREAM_TO_BDADDR(bd_addr, p_cmd); STREAM_TO_UINT8(reason, p_cmd); - log_link_layer_connection_event(&bd_addr, bluetooth::common::kUnknownConnectionHandle, - android::bluetooth::DIRECTION_INCOMING, - android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, - kUnknownBleEvt, cmd_status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + &bd_addr, bluetooth::common::kUnknownConnectionHandle, + android::bluetooth::DIRECTION_INCOMING, android::bluetooth::LINK_TYPE_UNKNOWN, opcode, + hci_event, kUnknownBleEvt, cmd_status, reason); break; // BLE Commands @@ -431,7 +438,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, // Selectively log to avoid log spam due to acceptlist connections: // - When doing non-acceptlist connection // - When there is an error in command status - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( bd_addr_p, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -456,7 +463,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, // Selectively log to avoid log spam due to acceptlist connections: // - When doing non-acceptlist connection // - When there is an error in command status - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( bd_addr_p, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -466,7 +473,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_BLE_CREATE_CONN_CANCEL: if (cmd_status != HCI_SUCCESS && !is_cmd_status) { // Only log errors to prevent log spam due to acceptlist connections - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( nullptr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -474,46 +481,48 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, break; case HCI_READ_LOCAL_OOB_DATA: case HCI_READ_LOCAL_OOB_EXTENDED_DATA: - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, 0); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, + cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, 0); break; case HCI_WRITE_SIMPLE_PAIRING_MODE: { uint8_t simple_pairing_mode; STREAM_TO_UINT8(simple_pairing_mode, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, simple_pairing_mode); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, + cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, simple_pairing_mode); break; } case HCI_WRITE_SECURE_CONNS_SUPPORT: { uint8_t secure_conn_host_support; STREAM_TO_UINT8(secure_conn_host_support, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, secure_conn_host_support); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, + cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, secure_conn_host_support); break; } case HCI_AUTHENTICATION_REQUESTED: STREAM_TO_UINT16(handle, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, handle, opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, 0); + bluetooth::shim::LogMetricClassicPairingEvent(RawAddress::kEmpty, handle, opcode, hci_event, + cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, 0); break; case HCI_SET_CONN_ENCRYPTION: { STREAM_TO_UINT16(handle, p_cmd); uint8_t encryption_enable; STREAM_TO_UINT8(encryption_enable, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, handle, opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, encryption_enable); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, handle, opcode, hci_event, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, encryption_enable); break; } case HCI_DELETE_STORED_LINK_KEY: { uint8_t delete_all_flag; STREAM_TO_BDADDR(bd_addr, p_cmd); STREAM_TO_UINT8(delete_all_flag, p_cmd); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, - delete_all_flag); + bluetooth::shim::LogMetricClassicPairingEvent( + bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, delete_all_flag); break; } case HCI_RMT_NAME_REQUEST: @@ -528,14 +537,16 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_REM_OOB_DATA_REQ_REPLY: case HCI_REM_OOB_DATA_REQ_NEG_REPLY: STREAM_TO_BDADDR(bd_addr, p_cmd); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, 0); + bluetooth::shim::LogMetricClassicPairingEvent( + bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, 0); break; case HCI_IO_CAP_REQ_NEG_REPLY: STREAM_TO_BDADDR(bd_addr, p_cmd); STREAM_TO_UINT8(reason, p_cmd); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, cmd_status, reason, 0); + bluetooth::shim::LogMetricClassicPairingEvent(bd_addr, + bluetooth::common::kUnknownConnectionHandle, + opcode, hci_event, cmd_status, reason, 0); break; } } @@ -599,8 +610,9 @@ static void btu_hcif_log_command_complete_metrics(uint16_t opcode, const uint8_t case HCI_WRITE_SIMPLE_PAIRING_MODE: case HCI_WRITE_SECURE_CONNS_SUPPORT: STREAM_TO_UINT8(status, p_return_params); - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, status, reason, 0); + bluetooth::shim::LogMetricClassicPairingEvent(RawAddress::kEmpty, + bluetooth::common::kUnknownConnectionHandle, + opcode, hci_event, status, reason, 0); break; case HCI_READ_ENCR_KEY_SIZE: { uint16_t handle; @@ -608,8 +620,8 @@ static void btu_hcif_log_command_complete_metrics(uint16_t opcode, const uint8_t STREAM_TO_UINT8(status, p_return_params); STREAM_TO_UINT16(handle, p_return_params); STREAM_TO_UINT8(key_size, p_return_params); - log_classic_pairing_event(RawAddress::kEmpty, handle, opcode, hci_event, status, reason, - key_size); + bluetooth::shim::LogMetricClassicPairingEvent(RawAddress::kEmpty, handle, opcode, hci_event, + status, reason, key_size); break; } case HCI_LINK_KEY_REQUEST_REPLY: @@ -624,8 +636,9 @@ static void btu_hcif_log_command_complete_metrics(uint16_t opcode, const uint8_t case HCI_REM_OOB_DATA_REQ_NEG_REPLY: STREAM_TO_UINT8(status, p_return_params); STREAM_TO_BDADDR(bd_addr, p_return_params); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, status, reason, 0); + bluetooth::shim::LogMetricClassicPairingEvent(bd_addr, + bluetooth::common::kUnknownConnectionHandle, + opcode, hci_event, status, reason, 0); break; } } diff --git a/system/stack/fuzzers/l2cap_fuzzer.cc b/system/stack/fuzzers/l2cap_fuzzer.cc index 6cb4d5170f..69243a67c4 100644 --- a/system/stack/fuzzers/l2cap_fuzzer.cc +++ b/system/stack/fuzzers/l2cap_fuzzer.cc @@ -121,26 +121,30 @@ public: GetInterfaceToProfiles()->profileSpecific_HACK->GetHearingAidDeviceCount = []() { return 1; }; - ON_CALL(controller_, GetLeSuggestedDefaultDataLength).WillByDefault(Return(512)); + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetLeSuggestedDefaultDataLength) + .WillByDefault(Return(512)); bluetooth::hci::LeBufferSize iso_size; iso_size.le_data_packet_length_ = 512; iso_size.total_num_le_packets_ = 6; - ON_CALL(controller_, GetControllerIsoBufferSize).WillByDefault(Return(iso_size)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetControllerIsoBufferSize) + .WillByDefault(Return(iso_size)); bluetooth::hci::LeBufferSize le_size; le_size.le_data_packet_length_ = 512; le_size.total_num_le_packets_ = 6; - ON_CALL(controller_, GetLeBufferSize).WillByDefault(Return(le_size)); - ON_CALL(controller_, SupportsBle).WillByDefault(Return(true)); - ON_CALL(controller_, GetAclPacketLength).WillByDefault(Return(512)); - bluetooth::hci::testing::mock_controller_ = &controller_; + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetLeBufferSize) + .WillByDefault(Return(le_size)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsBle).WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetAclPacketLength) + .WillByDefault(Return(512)); } ~FakeBtStack() { test::mock::stack_acl::acl_send_data_packet_br_edr = {}; test::mock::stack_acl::acl_send_data_packet_ble = {}; - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class Fakes { diff --git a/system/stack/gatt/gatt_api.cc b/system/stack/gatt/gatt_api.cc index 1b60132b00..7b1a425f5e 100644 --- a/system/stack/gatt/gatt_api.cc +++ b/system/stack/gatt/gatt_api.cc @@ -34,6 +34,7 @@ #include "internal_include/bt_target.h" #include "internal_include/stack_config.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "os/system_properties.h" #include "osi/include/allocator.h" #include "stack/arbiter/acl_arbiter.h" @@ -48,7 +49,6 @@ #include "stack/include/l2cap_interface.h" #include "stack/include/l2cdefs.h" #include "stack/include/sdp_api.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bluetooth/uuid.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -1476,7 +1476,8 @@ bool GATT_Connect(tGATT_IF gatt_if, const RawAddress& bd_addr, tBLE_ADDR_TYPE ad return true; } - log_le_connection_lifecycle(ToGdAddress(bd_addr), true /* is_connect */, is_direct); + bluetooth::shim::LogMetricLeConnectionLifecycle(ToGdAddress(bd_addr), true /* is_connect */, + is_direct); bool ret = false; if (is_direct) { @@ -1618,8 +1619,8 @@ tGATT_STATUS GATT_Disconnect(tCONN_ID conn_id) { return GATT_ILLEGAL_PARAMETER; } - log_le_connection_lifecycle(ToGdAddress(p_tcb->peer_bda), true /* is_connect */, - false /* is_direct */); + bluetooth::shim::LogMetricLeConnectionLifecycle(ToGdAddress(p_tcb->peer_bda), + true /* is_connect */, false /* is_direct */); tGATT_IF gatt_if = gatt_get_gatt_if(conn_id); gatt_update_app_use_link_flag(gatt_if, p_tcb, false, true); diff --git a/system/stack/hid/hidd_api.cc b/system/stack/hid/hidd_api.cc index 169868bbfc..58d9bdc07a 100644 --- a/system/stack/hid/hidd_api.cc +++ b/system/stack/hid/hidd_api.cc @@ -38,13 +38,13 @@ #include "hidd_int.h" #include "hiddefs.h" #include "internal_include/bt_target.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "stack/include/bt_psm_types.h" #include "stack/include/bt_types.h" #include "stack/include/bt_uuid16.h" #include "stack/include/sdp_api.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/sdp/sdp_discovery_db.h" #include "types/raw_address.h" @@ -83,12 +83,14 @@ tHID_STATUS HID_DevRegister(tHID_DEV_HOST_CALLBACK* host_cback) { log::verbose(""); if (hd_cb.reg_flag) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_REGISTERED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_REGISTERED, 1); return HID_ERR_ALREADY_REGISTERED; } if (host_cback == NULL) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_HOST_CALLBACK_NULL, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_HOST_CALLBACK_NULL, 1); return HID_ERR_INVALID_PARAM; } @@ -122,7 +124,7 @@ tHID_STATUS HID_DevDeregister(void) { log::verbose(""); if (!hd_cb.reg_flag) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_DEREGISTER, 1); return HID_ERR_NOT_REGISTERED; } @@ -263,9 +265,10 @@ tHID_STATUS HID_DevAddRecord(uint32_t handle, char* p_name, char* p_description, if (desc_len > HIDD_APP_DESCRIPTOR_LEN) { log::error("descriptor length = {}, larger than max {}", desc_len, HIDD_APP_DESCRIPTOR_LEN); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum:: - HIDD_ERR_NOT_REGISTERED_DUE_TO_DESCRIPTOR_LENGTH, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDD_ERR_NOT_REGISTERED_DUE_TO_DESCRIPTOR_LENGTH, + 1); return HID_ERR_NOT_REGISTERED; }; @@ -273,9 +276,10 @@ tHID_STATUS HID_DevAddRecord(uint32_t handle, char* p_name, char* p_description, if (p_buf == NULL) { log::error("Buffer allocation failure for size = {}", buf_len); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum:: - HIDD_ERR_NOT_REGISTERED_DUE_TO_BUFFER_ALLOCATION, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDD_ERR_NOT_REGISTERED_DUE_TO_BUFFER_ALLOCATION, + 1); return HID_ERR_NOT_REGISTERED; } @@ -346,8 +350,8 @@ tHID_STATUS HID_DevAddRecord(uint32_t handle, char* p_name, char* p_description, if (!result) { log::error("failed to complete SDP record"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_SDP, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_SDP, 1); return HID_ERR_NOT_REGISTERED; } @@ -376,7 +380,7 @@ tHID_STATUS HID_DevSendReport(uint8_t channel, uint8_t type, uint8_t id, uint16_ return hidd_conn_send_data(HID_CHANNEL_INTR, HID_TRANS_DATA, HID_PAR_REP_TYPE_INPUT, id, len, p_data); } - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_INVALID_PARAM_SEND_REPORT, 1); return HID_ERR_INVALID_PARAM; } @@ -444,19 +448,20 @@ tHID_STATUS HID_DevUnplugDevice(const RawAddress& addr) { ******************************************************************************/ tHID_STATUS HID_DevConnect(void) { if (!hd_cb.reg_flag) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_CONNECT, 1); return HID_ERR_NOT_REGISTERED; } if (!hd_cb.device.in_use) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DEVICE_NOT_IN_USE_AT_CONNECT, 1); return HID_ERR_INVALID_PARAM; } if (hd_cb.device.state != HIDD_DEV_NO_CONN) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_CONN, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_CONN, 1); return HID_ERR_ALREADY_CONN; } @@ -474,13 +479,13 @@ tHID_STATUS HID_DevConnect(void) { ******************************************************************************/ tHID_STATUS HID_DevDisconnect(void) { if (!hd_cb.reg_flag) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_DISCONNECT, 1); return HID_ERR_NOT_REGISTERED; } if (!hd_cb.device.in_use) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DEVICE_NOT_IN_USE_AT_DISCONNECT, 1); return HID_ERR_INVALID_PARAM; @@ -492,10 +497,11 @@ tHID_STATUS HID_DevDisconnect(void) { tHID_STATUS ret = hidd_conn_disconnect(); hd_cb.device.conn.conn_state = HID_CONN_STATE_UNUSED; hd_cb.callback(hd_cb.device.addr, HID_DHOST_EVT_CLOSE, HID_ERR_DISCONNECTING, NULL); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DISCONNECTING, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DISCONNECTING, 1); return ret; } - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_CONNECTION_AT_DISCONNECT, 1); return HID_ERR_NO_CONNECTION; } @@ -565,7 +571,7 @@ tHID_STATUS HID_DevGetDevice(RawAddress* addr) { if (hd_cb.device.in_use) { *addr = hd_cb.device.addr; } else { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_GET_DEVICE, 1); return HID_ERR_NOT_REGISTERED; } diff --git a/system/stack/hid/hidd_conn.cc b/system/stack/hid/hidd_conn.cc index 7276af8acd..5f94c1c870 100644 --- a/system/stack/hid/hidd_conn.cc +++ b/system/stack/hid/hidd_conn.cc @@ -37,13 +37,13 @@ #include "hiddefs.h" #include "internal_include/bt_target.h" #include "l2cap_types.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "stack/hid/hidd_int.h" #include "stack/include/bt_hdr.h" #include "stack/include/bt_psm_types.h" #include "stack/include/l2cap_interface.h" #include "stack/include/l2cdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -300,7 +300,7 @@ static void hidd_l2cif_config_cfm(uint16_t cid, uint16_t /* initiator */, tL2CAP log::warn("could not start L2CAP connection for INTR"); hd_cb.callback(hd_cb.device.addr, HID_DHOST_EVT_CLOSE, HID_ERR_L2CAP_FAILED, NULL); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_NOT_STARTED_INCOMING, 1); return; } else { @@ -577,8 +577,8 @@ tHID_STATUS hidd_conn_reg(void) { HID_PSM_CONTROL, dev_reg_info, false /* enable_snoop */, nullptr, HID_DEV_MTU_SIZE, 0, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { log::error("HID Control (device) registration failed"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_CONTROL, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_CONTROL, 1); return HID_ERR_L2CAP_FAILED; } @@ -587,8 +587,8 @@ tHID_STATUS hidd_conn_reg(void) { 0, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { stack::l2cap::get_interface().L2CA_Deregister(HID_PSM_CONTROL); log::error("HID Interrupt (device) registration failed"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INTERRUPT, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INTERRUPT, 1); return HID_ERR_L2CAP_FAILED; } @@ -627,14 +627,15 @@ tHID_STATUS hidd_conn_initiate(void) { if (!p_dev->in_use) { log::warn("no virtual cable established"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_INITIATE, 1); return HID_ERR_NOT_REGISTERED; } if (p_dev->conn.conn_state != HID_CONN_STATE_UNUSED) { log::warn("connection already in progress"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONN_IN_PROCESS, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONN_IN_PROCESS, 1); return HID_ERR_CONN_IN_PROCESS; } @@ -649,8 +650,8 @@ tHID_STATUS hidd_conn_initiate(void) { HID_PSM_CONTROL, p_dev->addr, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) == 0) { log::warn("could not start L2CAP connection"); hd_cb.callback(hd_cb.device.addr, HID_DHOST_EVT_CLOSE, HID_ERR_L2CAP_FAILED, NULL); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INITIATE, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INITIATE, 1); } else { p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_CTRL; } @@ -723,7 +724,7 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param tHID_CONN* p_hcon = &hd_cb.device.conn; if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONGESTED_AT_FLAG_CHECK, 1); return HID_ERR_CONGESTED; } @@ -744,13 +745,15 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param } break; default: - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_INVALID_PARAM, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_INVALID_PARAM, 1); return HID_ERR_INVALID_PARAM; } p_buf = (BT_HDR*)osi_malloc(buf_size); if (p_buf == NULL) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_RESOURCES, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_RESOURCES, 1); return HID_ERR_NO_RESOURCES; } @@ -792,7 +795,7 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param return HID_SUCCESS; } - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_CONNECTION_AT_SEND_DATA, 1); return HID_ERR_NO_CONNECTION; } @@ -800,7 +803,7 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param log::verbose("report sent"); if (stack::l2cap::get_interface().L2CA_DataWrite(cid, p_buf) == tL2CAP_DW_RESULT::FAILED) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONGESTED_AT_DATA_WRITE, 1); return HID_ERR_CONGESTED; } diff --git a/system/stack/hid/hidh_api.cc b/system/stack/hid/hidh_api.cc index 97d811ed5b..1ab5ba2a6a 100644 --- a/system/stack/hid/hidh_api.cc +++ b/system/stack/hid/hidh_api.cc @@ -37,6 +37,7 @@ #include "hiddefs.h" #include "hidh_int.h" #include "internal_include/bt_target.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "sdp_api.h" @@ -44,7 +45,6 @@ #include "stack/include/bt_hdr.h" #include "stack/include/bt_uuid16.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/sdp/sdp_discovery_db.h" #include "types/bluetooth/uuid.h" #include "types/raw_address.h" @@ -69,7 +69,8 @@ static void hidh_search_callback(const RawAddress& bd_addr, tSDP_RESULT sdp_resu tHID_STATUS HID_HostGetSDPRecord(const RawAddress& addr, tSDP_DISCOVERY_DB* p_db, uint32_t db_len, tHID_HOST_SDP_CALLBACK* sdp_cback) { if (hh_cb.sdp_busy) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_SDP_BUSY, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_SDP_BUSY, 1); return HID_ERR_SDP_BUSY; } @@ -87,7 +88,8 @@ tHID_STATUS HID_HostGetSDPRecord(const RawAddress& addr, tSDP_DISCOVERY_DB* p_db return HID_SUCCESS; } else { log::warn("Unable to start SDP service search request peer:{}", addr); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_RESOURCES_SDP, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_RESOURCES_SDP, 1); return HID_ERR_NO_RESOURCES; } } @@ -289,12 +291,13 @@ tHID_STATUS HID_HostRegister(tHID_HOST_DEV_CALLBACK* dev_cback) { tHID_STATUS st; if (hh_cb.reg_flag) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_REGISTERED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_REGISTERED, 1); return HID_ERR_ALREADY_REGISTERED; } if (dev_cback == NULL) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_REGISTER, 1); return HID_ERR_INVALID_PARAM; } @@ -392,7 +395,7 @@ tHID_STATUS HID_HostAddDev(const RawAddress& addr, uint16_t attr_mask, uint8_t* } if (i == HID_HOST_MAX_DEVICES) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_RESOURCES_ADD_DEVICE, 1); return HID_ERR_NO_RESOURCES; } @@ -427,7 +430,7 @@ tHID_STATUS HID_HostRemoveDev(uint8_t dev_handle) { } if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_REMOVE_DEV, 1); return HID_ERR_INVALID_PARAM; @@ -457,13 +460,14 @@ tHID_STATUS HID_HostOpenDev(uint8_t dev_handle) { } if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_OPEN_DEV, 1); return HID_ERR_INVALID_PARAM; } if (hh_cb.devices[dev_handle].state != HID_DEV_NO_CONN) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_CONN, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_CONN, 1); return HID_ERR_ALREADY_CONN; } @@ -494,13 +498,13 @@ tHID_STATUS HID_HostWriteDev(uint8_t dev_handle, uint8_t t_type, uint8_t param, if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { log::error("HID_ERR_INVALID_PARAM"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_WRITE_DEV, 1); status = HID_ERR_INVALID_PARAM; } else if (hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED) { log::error("HID_ERR_NO_CONNECTION dev_handle {}", dev_handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_CONNECTION_AT_HOST_WRITE_DEV, 1); status = HID_ERR_NO_CONNECTION; @@ -530,14 +534,14 @@ tHID_STATUS HID_HostCloseDev(uint8_t dev_handle) { } if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_CLOSE_DEV, 1); return HID_ERR_INVALID_PARAM; } if (hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_CONNECTION_AT_HOST_CLOSE_DEV, 1); return HID_ERR_NO_CONNECTION; diff --git a/system/stack/hid/hidh_conn.cc b/system/stack/hid/hidh_conn.cc index cdc7906d16..71785478a1 100644 --- a/system/stack/hid/hidh_conn.cc +++ b/system/stack/hid/hidh_conn.cc @@ -39,6 +39,7 @@ #include "internal_include/bt_target.h" #include "l2cap_types.h" #include "l2cdefs.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "osi/include/osi.h" @@ -48,7 +49,6 @@ #include "stack/include/btm_client_interface.h" #include "stack/include/btm_log_history.h" #include "stack/include/l2cap_interface.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -119,7 +119,7 @@ tHID_STATUS hidh_conn_reg(void) { HID_PSM_CONTROL, hst_reg_info, false /* enable_snoop */, nullptr, HID_HOST_MTU, 0, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { log::error("HID-Host Control Registration failed"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_L2CAP_FAILED_AT_REGISTER_CONTROL, 1); return HID_ERR_L2CAP_FAILED; @@ -129,7 +129,7 @@ tHID_STATUS hidh_conn_reg(void) { BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { stack::l2cap::get_interface().L2CA_Deregister(HID_PSM_CONTROL); log::error("HID-Host Interrupt Registration failed"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_L2CAP_FAILED_AT_REGISTER_INTERRUPT, 1); return HID_ERR_L2CAP_FAILED; @@ -549,7 +549,8 @@ static void hidh_l2cif_disconnect_ind(uint16_t l2cap_cid, bool ack_needed) { (disc_res == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || (disc_res == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || (disc_res == HCI_ERR_REPEATED_ATTEMPTS)) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_AUTH_FAILED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_AUTH_FAILED, 1); hid_close_evt_reason = HID_ERR_AUTH_FAILED; } @@ -771,14 +772,14 @@ tHID_STATUS hidh_conn_snd_data(uint8_t dhandle, uint8_t trans_type, uint8_t para if (!get_btm_client_interface().peer.BTM_IsAclConnectionUp(hh_cb.devices[dhandle].addr, BT_TRANSPORT_BR_EDR)) { osi_free(buf); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_CONNECTION_AT_SEND_DATA, 1); return HID_ERR_NO_CONNECTION; } if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) { osi_free(buf); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONGESTED_AT_FLAG_CHECK, 1); return HID_ERR_CONGESTED; } @@ -799,7 +800,7 @@ tHID_STATUS hidh_conn_snd_data(uint8_t dhandle, uint8_t trans_type, uint8_t para buf_size = HID_INTERRUPT_BUF_SIZE; break; default: - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_SEND_DATA, 1); return HID_ERR_INVALID_PARAM; } @@ -860,7 +861,7 @@ tHID_STATUS hidh_conn_snd_data(uint8_t dhandle, uint8_t trans_type, uint8_t para /* Send the buffer through L2CAP */ if ((p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) || (stack::l2cap::get_interface().L2CA_DataWrite(cid, p_buf) == tL2CAP_DW_RESULT::FAILED)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONGESTED_AT_SEND_DATA, 1); return HID_ERR_CONGESTED; } @@ -889,7 +890,8 @@ tHID_STATUS hidh_conn_initiate(uint8_t dhandle) { tHID_HOST_DEV_CTB* p_dev = &hh_cb.devices[dhandle]; if (p_dev->conn.conn_state != HID_CONN_STATE_UNUSED) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONN_IN_PROCESS, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONN_IN_PROCESS, 1); return HID_ERR_CONN_IN_PROCESS; } @@ -908,7 +910,7 @@ tHID_STATUS hidh_conn_initiate(uint8_t dhandle) { log::warn("HID-Host Originate failed"); hh_cb.callback(dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, HID_ERR_L2CAP_FAILED, NULL); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_L2CAP_FAILED_AT_INITIATE, 1); } else { /* Transition to the next appropriate state, waiting for connection confirm diff --git a/system/stack/include/stack_metrics_logging.h b/system/stack/include/stack_metrics_logging.h deleted file mode 100644 index 9a0a80baa4..0000000000 --- a/system/stack/include/stack_metrics_logging.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include <cstdint> - -#include "hci/address.h" -#include "hci/hci_packets.h" -#include "types/raw_address.h" - -void log_classic_pairing_event(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value); - -void log_link_layer_connection_event(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, - uint16_t link_type, uint32_t hci_cmd, uint16_t hci_event, - uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code); - -void log_smp_pairing_event(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason); - -void log_sdp_attribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value); - -void log_manufacturer_info(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version); - -void log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum key, int64_t value); - -void log_hfp_audio_packet_loss_stats(const RawAddress& address, int num_decoded_frames, - double packet_loss_ratio, uint16_t codec_type); - -void log_mmc_transcode_rtt_stats(int maximum_rtt, double mean_rtt, int num_requests, - int codec_type); - -void log_le_pairing_fail(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing); - -void log_le_connection_status(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason); - -void log_le_device_in_accept_list(bluetooth::hci::Address address, bool is_add); - -void log_le_connection_lifecycle(bluetooth::hci::Address address, bool is_connect, bool is_direct); - -void log_le_connection_completion(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated); diff --git a/system/stack/l2cap/l2c_ble.cc b/system/stack/l2cap/l2c_ble.cc index 49dca969dc..d964271002 100644 --- a/system/stack/l2cap/l2c_ble.cc +++ b/system/stack/l2cap/l2c_ble.cc @@ -1443,7 +1443,7 @@ tL2CAP_LE_RESULT_CODE l2ble_sec_access_req(const RawAddress& bd_addr, uint16_t p * constraints. For example, when there is at least one Hearing Aid device * bonded, the minimum interval is raised. On return, min_interval and * max_interval are updated. */ -void L2CA_AdjustConnectionIntervals(uint16_t* min_interval, uint16_t* max_interval, +void L2CA_AdjustConnectionIntervals(uint16_t* /* min_interval */, uint16_t* max_interval, uint16_t floor_interval) { // Allow for customization by systemprops for mainline uint16_t phone_min_interval = floor_interval; @@ -1462,13 +1462,6 @@ void L2CA_AdjustConnectionIntervals(uint16_t* min_interval, uint16_t* max_interv log::verbose("Have Hearing Aids. Min. interval is set to {}", phone_min_interval); } - if (!com::android::bluetooth::flags::l2cap_le_do_not_adjust_min_interval() && - *min_interval < phone_min_interval) { - log::verbose("requested min_interval={} too small. Set to {}", *min_interval, - phone_min_interval); - *min_interval = phone_min_interval; - } - // While this could result in connection parameters that fall // outside fo the range requested, this will allow the connection // to remain established. diff --git a/system/stack/metrics/stack_metrics_logging.cc b/system/stack/metrics/stack_metrics_logging.cc deleted file mode 100644 index 398a72ce33..0000000000 --- a/system/stack/metrics/stack_metrics_logging.cc +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "stack/include/stack_metrics_logging.h" - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "common/metrics.h" -#include "main/shim/metrics_api.h" -#include "main/shim/shim.h" -#include "types/raw_address.h" - -void log_classic_pairing_event(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value) { - bluetooth::shim::LogMetricClassicPairingEvent(address, handle, hci_cmd, hci_event, cmd_status, - reason_code, event_value); -} - -void log_link_layer_connection_event(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, - uint16_t link_type, uint32_t hci_cmd, uint16_t hci_event, - uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code) { - bluetooth::shim::LogMetricLinkLayerConnectionEvent(address, connection_handle, direction, - link_type, hci_cmd, hci_event, hci_ble_event, - cmd_status, reason_code); -} - -void log_smp_pairing_event(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason) { - bluetooth::shim::LogMetricSmpPairingEvent(address, smp_cmd, direction, smp_fail_reason); -} - -void log_sdp_attribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - bluetooth::shim::LogMetricSdpAttribute(address, protocol_uuid, attribute_id, attribute_size, - attribute_value); -} - -void log_manufacturer_info(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - bluetooth::shim::LogMetricManufacturerInfo(address, address_type, source_type, source_name, - manufacturer, model, hardware_version, - software_version); -} - -void log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - bluetooth::shim::CountCounterMetrics(key, value); -} - -void log_hfp_audio_packet_loss_stats(const RawAddress& address, int num_decoded_frames, - double packet_loss_ratio, uint16_t codec_type) { - bluetooth::shim::LogMetricHfpPacketLossStats(address, num_decoded_frames, packet_loss_ratio, - codec_type); -} - -void log_mmc_transcode_rtt_stats(int maximum_rtt, double mean_rtt, int num_requests, - int codec_type) { - bluetooth::shim::LogMetricMmcTranscodeRttStats(maximum_rtt, mean_rtt, num_requests, codec_type); -} - -void log_le_pairing_fail(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing) { - bluetooth::shim::LogMetricLePairingFail(raw_address, failure_reason, is_outgoing); -} - -void log_le_connection_status(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason) { - bluetooth::shim::LogMetricLeConnectionStatus(address, is_connect, reason); -} - -void log_le_device_in_accept_list(bluetooth::hci::Address address, bool is_add) { - bluetooth::shim::LogMetricLeDeviceInAcceptList(address, is_add); -} - -void log_le_connection_lifecycle(bluetooth::hci::Address address, bool is_connect, bool is_direct) { - bluetooth::shim::LogMetricLeConnectionLifecycle(address, is_connect, is_direct); -} - -void log_le_connection_completion(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated) { - bluetooth::shim::LogMetricLeConnectionCompletion(address, reason, is_locally_initiated); -} diff --git a/system/stack/mmc/metrics/mmc_rtt_logger.cc b/system/stack/mmc/metrics/mmc_rtt_logger.cc index 761d825b44..c95566f0cb 100644 --- a/system/stack/mmc/metrics/mmc_rtt_logger.cc +++ b/system/stack/mmc/metrics/mmc_rtt_logger.cc @@ -20,7 +20,7 @@ #include <cmath> #include <string> -#include "stack/include/stack_metrics_logging.h" +#include "main/shim/metrics_api.h" namespace mmc { @@ -43,7 +43,8 @@ void MmcRttLogger::UploadTranscodeRttStatics() { if (num_requests_ == 0) { return; } - log_mmc_transcode_rtt_stats(maximum_rtt_, rtt_sum_ / num_requests_, num_requests_, codec_type_); + bluetooth::shim::LogMetricMmcTranscodeRttStats(maximum_rtt_, rtt_sum_ / num_requests_, + num_requests_, codec_type_); num_requests_ = 0; rtt_sum_ = 0; maximum_rtt_ = 0; diff --git a/system/stack/rfcomm/port_api.cc b/system/stack/rfcomm/port_api.cc index a78f3ea890..6ab7cdccea 100644 --- a/system/stack/rfcomm/port_api.cc +++ b/system/stack/rfcomm/port_api.cc @@ -1229,7 +1229,9 @@ int PORT_GetChannelInfo(uint16_t handle, uint16_t* local_mtu, uint16_t* remote_m return PORT_NOT_OPENED; } - if (p_port->line_status) { + if (p_port->rfc.p_mcb == nullptr || p_port->line_status) { + log::warn("PORT_LINE_ERR - p_port->rfc.p_mcb == nullptr:{} p_port->line_status:{}", + (p_port->rfc.p_mcb == nullptr) ? "T" : "F", p_port->line_status); return PORT_LINE_ERR; } diff --git a/system/stack/rfcomm/port_rfc.cc b/system/stack/rfcomm/port_rfc.cc index 860fdf0450..c1518665d9 100644 --- a/system/stack/rfcomm/port_rfc.cc +++ b/system/stack/rfcomm/port_rfc.cc @@ -36,12 +36,12 @@ #include "internal_include/bt_target.h" #include "internal_include/bt_trace.h" #include "main/shim/entry.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/mutex.h" #include "stack/include/bt_hdr.h" #include "stack/include/bt_uuid16.h" #include "stack/include/rfc_metrics.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/l2cap/l2c_int.h" #include "stack/rfcomm/port_int.h" #include "stack/rfcomm/rfc_int.h" @@ -186,7 +186,8 @@ void port_start_close(tPORT* p_port) { * clear tPort */ if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_CLOSED, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_CLOSE, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_CLOSE, 1); } port_release_port(p_port); @@ -230,7 +231,7 @@ void PORT_StartCnf(tRFC_MCB* p_mcb, uint16_t result) { if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_START_FAILED, p_port->handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_CNF_FAILED, 1); } port_release_port(p_port); @@ -457,14 +458,14 @@ void PORT_DlcEstablishInd(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu) { if (p_port->rfc_cfg_info.data_path != BTSOCK_DATA_PATH_HARDWARE_OFFLOAD && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, 1); } } else { if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, 1); } } @@ -493,7 +494,8 @@ void PORT_DlcEstablishCnf(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu, uint16_t if (result != RFCOMM_SUCCESS) { log::warn("Unable to establish configuration dlci:{} result:{}", dlci, result); port_rfc_closed(p_port, PORT_START_FAILED); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_FAILED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_FAILED, 1); return; } @@ -513,14 +515,14 @@ void PORT_DlcEstablishCnf(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu, uint16_t if (p_port->rfc_cfg_info.data_path != BTSOCK_DATA_PATH_HARDWARE_OFFLOAD && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, 1); } } else { if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, 1); } } @@ -590,7 +592,8 @@ void PORT_PortNegCnf(tRFC_MCB* p_mcb, uint8_t dlci, PortSettings* /* p_settings RFCOMM_DlcReleaseReq(p_mcb, p_port->dlci); port_rfc_closed(p_port, PORT_PORT_NEG_FAILED); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_NEG_FAILED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_NEG_FAILED, 1); return; } @@ -661,7 +664,7 @@ void PORT_ControlInd(tRFC_MCB* p_mcb, uint8_t dlci, tPORT_CTRL* p_pars) { if (p_port->rfc_cfg_info.data_path == BTSOCK_DATA_PATH_HARDWARE_OFFLOAD) { if (p_port->port_ctrl == PORT_CTRL_SETUP_COMPLETED && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, 1); } } @@ -708,7 +711,7 @@ void PORT_ControlCnf(tRFC_MCB* p_mcb, uint8_t dlci, tPORT_CTRL* /* p_pars */) { if (p_port->rfc_cfg_info.data_path == BTSOCK_DATA_PATH_HARDWARE_OFFLOAD) { if (p_port->port_ctrl == PORT_CTRL_SETUP_COMPLETED && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, 1); } } @@ -767,7 +770,8 @@ void PORT_DlcReleaseInd(tRFC_MCB* p_mcb, uint8_t dlci) { return; } port_rfc_closed(p_port, PORT_CLOSED); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_CLOSED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_CLOSED, 1); } /******************************************************************************* @@ -788,7 +792,7 @@ void PORT_CloseInd(tRFC_MCB* p_mcb) { for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { if (p_port->rfc.p_mcb == p_mcb) { port_rfc_closed(p_port, PORT_PEER_CONNECTION_FAILED); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_PEER_CONNECTION_FAILED, 1); } } @@ -813,7 +817,8 @@ void PORT_TimeOutCloseMux(tRFC_MCB* p_mcb) { for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { if (p_port->rfc.p_mcb == p_mcb) { port_rfc_closed(p_port, PORT_PEER_TIMEOUT); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_PEER_TIMEOUT, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_PEER_TIMEOUT, 1); } } } diff --git a/system/stack/rfcomm/rfc_l2cap_if.cc b/system/stack/rfcomm/rfc_l2cap_if.cc index 5b7fc00185..10826d235a 100644 --- a/system/stack/rfcomm/rfc_l2cap_if.cc +++ b/system/stack/rfcomm/rfc_l2cap_if.cc @@ -91,28 +91,26 @@ void rfcomm_l2cap_if_init(void) { void RFCOMM_ConnectInd(const RawAddress& bd_addr, uint16_t lcid, uint16_t /* psm */, uint8_t id) { tRFC_MCB* p_mcb = rfc_alloc_multiplexer_channel(bd_addr, false); - if ((p_mcb) && (p_mcb->state != RFC_MX_STATE_IDLE)) { - /* if this is collision case */ - if ((p_mcb->is_initiator) && (p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF)) { - p_mcb->pending_lcid = lcid; - - /* wait random timeout (2 - 12) to resolve collision */ - /* if peer gives up then local device rejects incoming connection and - * continues as initiator */ - /* if timeout, local device disconnects outgoing connection and continues - * as acceptor */ - log::verbose( - "RFCOMM_ConnectInd start timer for collision, initiator's " - "LCID(0x{:x}), acceptor's LCID(0x{:x})", - p_mcb->lcid, p_mcb->pending_lcid); - - rfc_timer_start(p_mcb, (uint16_t)(bluetooth::common::time_get_os_boottime_ms() % 10 + 2)); - return; - } else { - /* we cannot accept connection request from peer at this state */ - /* don't update lcid */ - p_mcb = nullptr; - } + if (p_mcb != nullptr && p_mcb->is_initiator && p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF) { + p_mcb->pending_lcid = lcid; + + /* wait random timeout (2 - 12) to resolve collision */ + /* if peer gives up then local device rejects incoming connection and + * continues as initiator */ + /* if timeout, local device disconnects outgoing connection and continues + * as acceptor */ + log::verbose( + "RFCOMM_ConnectInd start timer for collision, initiator's " + "LCID(0x{:x}), acceptor's LCID(0x{:x})", + p_mcb->lcid, p_mcb->pending_lcid); + + rfc_timer_start(p_mcb, (uint16_t)(bluetooth::common::time_get_os_boottime_ms() % 10 + 2)); + return; + } + if (p_mcb != nullptr && p_mcb->is_initiator && p_mcb->state != RFC_MX_STATE_IDLE) { + /* we cannot accept connection request from peer at this state */ + /* don't update lcid */ + p_mcb = nullptr; } else { /* store mcb even if null */ rfc_save_lcid_mcb(p_mcb, lcid); @@ -141,7 +139,7 @@ void RFCOMM_ConnectInd(const RawAddress& bd_addr, uint16_t lcid, uint16_t /* psm void RFCOMM_ConnectCnf(uint16_t lcid, tL2CAP_CONN result) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_ConnectCnf LCID:0x{:x}", lcid); return; } @@ -188,7 +186,7 @@ void RFCOMM_ConfigInd(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_ConfigInd LCID:0x{:x}", lcid); for (auto& [cid, mcb] : rfc_lcid_mcb) { if (mcb != nullptr && mcb->pending_lcid == lcid) { @@ -218,7 +216,7 @@ void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t /* initiator */, tL2CAP_CFG_INFO* tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_ConfigCnf no MCB LCID:0x{:x}", lcid); return; } @@ -237,7 +235,7 @@ void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t /* initiator */, tL2CAP_CFG_INFO* void RFCOMM_DisconnectInd(uint16_t lcid, bool is_conf_needed) { log::verbose("lcid:0x{:x}, is_conf_needed:{}", lcid, is_conf_needed); tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::warn("no mcb for lcid 0x{:x}", lcid); return; } @@ -257,7 +255,7 @@ void RFCOMM_DisconnectInd(uint16_t lcid, bool is_conf_needed) { void RFCOMM_BufDataInd(uint16_t lcid, BT_HDR* p_buf) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::warn("Cannot find RFCOMM multiplexer for lcid 0x{:x}", lcid); osi_free(p_buf); return; @@ -351,7 +349,7 @@ void RFCOMM_BufDataInd(uint16_t lcid, BT_HDR* p_buf) { void RFCOMM_CongestionStatusInd(uint16_t lcid, bool is_congested) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_CongestionStatusInd dropped LCID:0x{:x}", lcid); return; } else { diff --git a/system/stack/sdp/sdp_utils.cc b/system/stack/sdp/sdp_utils.cc index 2fb4f4622b..324f4dd06e 100644 --- a/system/stack/sdp/sdp_utils.cc +++ b/system/stack/sdp/sdp_utils.cc @@ -39,6 +39,7 @@ #include "device/include/interop.h" #include "internal_include/bt_target.h" #include "internal_include/bt_trace.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/properties.h" #include "stack/include/avrc_api.h" @@ -50,7 +51,6 @@ #include "stack/include/btm_sec_api_types.h" #include "stack/include/l2cap_interface.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/sdp/internal/sdp_api.h" #include "stack/sdp/sdpint.h" #include "storage/config_keys.h" @@ -184,15 +184,15 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } // Log the existence of a profile role // This can be different from Bluetooth Profile Descriptor List - log_sdp_attribute(bda, service_uuid, 0, 0, nullptr); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, 0, 0, nullptr); // Log profile version from Bluetooth Profile Descriptor List auto uuid_version_array = sdpu_find_profile_version(p_rec); for (const auto& uuid_version_pair : uuid_version_array) { uint16_t profile_uuid = uuid_version_pair.first; uint16_t version = uuid_version_pair.second; auto version_array = to_little_endian_array(version); - log_sdp_attribute(bda, profile_uuid, ATTR_ID_BT_PROFILE_DESC_LIST, version_array.size(), - version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, profile_uuid, ATTR_ID_BT_PROFILE_DESC_LIST, + version_array.size(), version_array.data()); } // Log protocol version from Protocol Descriptor List uint16_t protocol_uuid = 0; @@ -217,8 +217,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) if (protocol_elements.num_params >= 1) { uint16_t version = protocol_elements.params[0]; auto version_array = to_little_endian_array(version); - log_sdp_attribute(bda, protocol_uuid, ATTR_ID_PROTOCOL_DESC_LIST, version_array.size(), - version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, protocol_uuid, ATTR_ID_PROTOCOL_DESC_LIST, + version_array.size(), version_array.data()); } } } @@ -238,8 +238,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } uint16_t supported_features = p_attr->attr_value.v.u16; auto version_array = to_little_endian_array(supported_features); - log_sdp_attribute(bda, service_uuid, ATTR_ID_SUPPORTED_FEATURES, version_array.size(), - version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, ATTR_ID_SUPPORTED_FEATURES, + version_array.size(), version_array.data()); break; } case UUID_SERVCLASS_MESSAGE_NOTIFICATION: @@ -251,8 +251,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } uint32_t map_supported_features = p_attr->attr_value.v.u32; auto features_array = to_little_endian_array(map_supported_features); - log_sdp_attribute(bda, service_uuid, ATTR_ID_MAP_SUPPORTED_FEATURES, features_array.size(), - features_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, ATTR_ID_MAP_SUPPORTED_FEATURES, + features_array.size(), features_array.data()); break; } case UUID_SERVCLASS_PBAP_PCE: @@ -264,8 +264,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } uint32_t pbap_supported_features = p_attr->attr_value.v.u32; auto features_array = to_little_endian_array(pbap_supported_features); - log_sdp_attribute(bda, service_uuid, ATTR_ID_PBAP_SUPPORTED_FEATURES, features_array.size(), - features_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, ATTR_ID_PBAP_SUPPORTED_FEATURES, + features_array.size(), features_array.data()); break; } } @@ -278,15 +278,17 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) tSDP_DI_GET_RECORD di_record = {}; if (SDP_GetDiRecord(1, &di_record, p_db) == tSDP_STATUS::SDP_SUCCESS) { auto version_array = to_little_endian_array(di_record.spec_id); - log_sdp_attribute(bda, UUID_SERVCLASS_PNP_INFORMATION, ATTR_ID_SPECIFICATION_ID, - version_array.size(), version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, UUID_SERVCLASS_PNP_INFORMATION, + ATTR_ID_SPECIFICATION_ID, version_array.size(), + version_array.data()); std::stringstream ss; // [N - native]::SDP::[DIP - Device ID Profile] ss << "N:SDP::DIP::" << loghex(di_record.rec.vendor_id_source); - log_manufacturer_info(bda, android::bluetooth::AddressTypeEnum::ADDRESS_TYPE_PUBLIC, - android::bluetooth::DeviceInfoSrcEnum::DEVICE_INFO_INTERNAL, ss.str(), - loghex(di_record.rec.vendor), loghex(di_record.rec.product), - loghex(di_record.rec.version), ""); + bluetooth::shim::LogMetricManufacturerInfo( + bda, android::bluetooth::AddressTypeEnum::ADDRESS_TYPE_PUBLIC, + android::bluetooth::DeviceInfoSrcEnum::DEVICE_INFO_INTERNAL, ss.str(), + loghex(di_record.rec.vendor), loghex(di_record.rec.product), + loghex(di_record.rec.version), ""); std::string bda_string = bda.ToString(); // write manufacturer, model, HW version to config diff --git a/system/stack/smp/smp_l2c.cc b/system/stack/smp/smp_l2c.cc index 219cb723f7..69591b10e5 100644 --- a/system/stack/smp/smp_l2c.cc +++ b/system/stack/smp/smp_l2c.cc @@ -263,13 +263,6 @@ static void smp_br_connect_callback(uint16_t /* channel */, const RawAddress& bd log::info("BDA:{} pairing_bda:{}, connected:{}", bd_addr, p_cb->pairing_bda, connected); if (bd_addr != p_cb->pairing_bda) { - if (!com::android::bluetooth::flags::smp_state_machine_stuck_after_disconnection_fix()) { - log::info( - "If your pairing failed, get a build with " - "smp_state_machine_stuck_after_disconnection_fix and try again :)"); - return; - } - tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); /* When pairing was initiated to RPA, and connection was on LE transport first using RPA, then * we must check record pseudo address, it might be same device */ diff --git a/system/stack/smp/smp_utils.cc b/system/stack/smp/smp_utils.cc index e5aefe3c6a..9be3de7db1 100644 --- a/system/stack/smp/smp_utils.cc +++ b/system/stack/smp/smp_utils.cc @@ -35,6 +35,7 @@ #include "internal_include/stack_config.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "metrics/bluetooth_event.h" #include "osi/include/allocator.h" #include "p_256_ecc_pp.h" @@ -51,7 +52,6 @@ #include "stack/include/l2cap_interface.h" #include "stack/include/l2cdefs.h" #include "stack/include/smp_status.h" -#include "stack/include/stack_metrics_logging.h" #include "types/raw_address.h" #define SMP_PAIRING_REQ_SIZE 7 @@ -320,7 +320,7 @@ void smp_log_metrics(const RawAddress& bd_addr, bool is_outgoing, const uint8_t* uint8_t failure_reason = 0; if (raw_cmd == SMP_OPCODE_PAIRING_FAILED && buf_len >= 1) { STREAM_TO_UINT8(failure_reason, p_buf); - log_le_pairing_fail(bd_addr, failure_reason, is_outgoing); + bluetooth::shim::LogMetricLePairingFail(bd_addr, failure_reason, is_outgoing); } if (smp_cb.is_pair_cancel) { failure_reason = SMP_USER_CANCELLED; // Tracking pairing cancellations @@ -330,7 +330,8 @@ void smp_log_metrics(const RawAddress& bd_addr, bool is_outgoing, const uint8_t* android::bluetooth::DirectionEnum direction = is_outgoing ? android::bluetooth::DirectionEnum::DIRECTION_OUTGOING : android::bluetooth::DirectionEnum::DIRECTION_INCOMING; - log_smp_pairing_event(bd_addr, metric_cmd, direction, static_cast<uint16_t>(failure_reason)); + bluetooth::shim::LogMetricSmpPairingEvent(bd_addr, metric_cmd, direction, + static_cast<uint16_t>(failure_reason)); } /******************************************************************************* @@ -1011,7 +1012,8 @@ void smp_proc_pairing_cmpl(tSMP_CB* p_cb) { if (metric_status > SMP_MAX_FAIL_RSN_PER_SPEC) { metric_status |= SMP_METRIC_STATUS_INTERNAL_FLAG; } - log_smp_pairing_event(p_cb->pairing_bda, metric_cmd, direction, metric_status); + bluetooth::shim::LogMetricSmpPairingEvent(p_cb->pairing_bda, metric_cmd, direction, + metric_status); } if (p_cb->status == SMP_SUCCESS && p_cb->smp_over_br) { diff --git a/system/stack/test/btm/stack_btm_power_mode_test.cc b/system/stack/test/btm/stack_btm_power_mode_test.cc index a3376d8649..ad7b27a71a 100644 --- a/system/stack/test/btm/stack_btm_power_mode_test.cc +++ b/system/stack/test/btm/stack_btm_power_mode_test.cc @@ -49,8 +49,10 @@ std::deque<power_mode_callback> power_mode_callback_queue; class StackBtmPowerMode : public testing::Test { protected: void SetUp() override { - ON_CALL(controller_, SupportsSniffMode).WillByDefault(Return(true)); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsSniffMode) + .WillByDefault(Return(true)); power_mode_callback_queue.clear(); reset_mock_function_count_map(); ASSERT_EQ(tBTM_STATUS::BTM_SUCCESS, @@ -71,10 +73,9 @@ protected: BTM_PmRegister(BTM_PM_DEREG, &pm_id_, [](const RawAddress& /* p_bda */, tBTM_PM_STATUS /* status */, uint16_t /* value */, tHCI_STATUS /* hci_status */) {})); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; uint8_t pm_id_{0}; }; diff --git a/system/stack/test/btm/stack_btm_sec_test.cc b/system/stack/test/btm/stack_btm_sec_test.cc index 58317afc29..62226e2750 100644 --- a/system/stack/test/btm/stack_btm_sec_test.cc +++ b/system/stack/test/btm/stack_btm_sec_test.cc @@ -69,7 +69,8 @@ protected: down_thread_ = new bluetooth::os::Thread("down_thread", bluetooth::os::Thread::Priority::NORMAL); down_handler_ = new bluetooth::os::Handler(down_thread_); - bluetooth::hci::testing::mock_hci_layer_ = &mock_hci_; + bluetooth::hci::testing::mock_hci_layer_ = + std::make_unique<bluetooth::hci::testing::MockHciLayer>(); bluetooth::hci::testing::mock_gd_shim_handler_ = up_handler_; } void TearDown() override { @@ -79,10 +80,10 @@ protected: down_handler_->Clear(); delete down_handler_; delete down_thread_; + bluetooth::hci::testing::mock_hci_layer_.reset(); StackBtmSecTest::TearDown(); } bluetooth::common::BidiQueue<bluetooth::hci::ScoView, bluetooth::hci::ScoBuilder> sco_queue_{10}; - bluetooth::hci::testing::MockHciLayer mock_hci_; bluetooth::os::Thread* up_thread_; bluetooth::os::Handler* up_handler_; bluetooth::os::Thread* down_thread_; diff --git a/system/stack/test/btm/stack_btm_test.cc b/system/stack/test/btm/stack_btm_test.cc index 7471d4faca..2341b21677 100644 --- a/system/stack/test/btm/stack_btm_test.cc +++ b/system/stack/test/btm/stack_btm_test.cc @@ -63,13 +63,13 @@ public: protected: void SetUp() override { BtmWithMocksTest::SetUp(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); } void TearDown() override { - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); BtmWithMocksTest::TearDown(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class StackBtmWithQueuesTest : public StackBtmTest { @@ -82,11 +82,12 @@ protected: down_thread_ = new bluetooth::os::Thread("down_thread", bluetooth::os::Thread::Priority::NORMAL); down_handler_ = new bluetooth::os::Handler(down_thread_); - bluetooth::hci::testing::mock_hci_layer_ = &mock_hci_; + bluetooth::hci::testing::mock_hci_layer_ = + std::make_unique<bluetooth::hci::testing::MockHciLayer>(); bluetooth::hci::testing::mock_gd_shim_handler_ = up_handler_; bluetooth::legacy::hci::testing::SetMock(legacy_hci_mock_); - EXPECT_CALL(mock_hci_, RegisterForScoConnectionRequests(_)); - EXPECT_CALL(mock_hci_, RegisterForDisconnects(_)); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, RegisterForScoConnectionRequests(_)); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, RegisterForDisconnects(_)); } void TearDown() override { up_handler_->Clear(); @@ -95,10 +96,10 @@ protected: down_handler_->Clear(); delete down_handler_; delete down_thread_; + bluetooth::hci::testing::mock_hci_layer_.release(); StackBtmTest::TearDown(); } bluetooth::common::BidiQueue<bluetooth::hci::ScoView, bluetooth::hci::ScoBuilder> sco_queue_{10}; - bluetooth::hci::testing::MockHciLayer mock_hci_; bluetooth::legacy::hci::testing::MockInterface legacy_hci_mock_; bluetooth::os::Thread* up_thread_; bluetooth::os::Handler* up_handler_; @@ -111,7 +112,8 @@ public: protected: void SetUp() override { StackBtmWithQueuesTest::SetUp(); - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); btm_cb.Init(); btm_sec_cb.Init(BTM_SEC_MODE_SC); } @@ -123,7 +125,8 @@ protected: }; TEST_F(StackBtmWithQueuesTest, GlobalLifecycle) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); get_btm_client_interface().lifecycle.btm_free(); } @@ -134,20 +137,23 @@ TEST_F(StackBtmTest, DynamicLifecycle) { } TEST_F(StackBtmWithQueuesTest, InitFree) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); btm_cb.Init(); btm_cb.Free(); } TEST_F(StackBtmWithQueuesTest, tSCO_CB) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); tSCO_CB* p_sco = &btm_cb.sco_cb; p_sco->Init(); p_sco->Free(); } TEST_F(StackBtmWithQueuesTest, InformClientOnConnectionSuccess) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); RawAddress bda({0x11, 0x22, 0x33, 0x44, 0x55, 0x66}); @@ -159,7 +165,8 @@ TEST_F(StackBtmWithQueuesTest, InformClientOnConnectionSuccess) { } TEST_F(StackBtmWithQueuesTest, NoInformClientOnConnectionFail) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); RawAddress bda({0x11, 0x22, 0x33, 0x44, 0x55, 0x66}); @@ -171,7 +178,8 @@ TEST_F(StackBtmWithQueuesTest, NoInformClientOnConnectionFail) { } TEST_F(StackBtmWithQueuesTest, default_packet_type) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); btm_cb.acl_cb_.SetDefaultPacketTypeMask(0x4321); @@ -181,7 +189,8 @@ TEST_F(StackBtmWithQueuesTest, default_packet_type) { } TEST_F(StackBtmWithQueuesTest, change_packet_type) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); uint16_t handle = 0x123; diff --git a/system/stack/test/btm_iso_test.cc b/system/stack/test/btm_iso_test.cc index 40453f703d..b44f6fe094 100644 --- a/system/stack/test/btm_iso_test.cc +++ b/system/stack/test/btm_iso_test.cc @@ -134,7 +134,8 @@ protected: bluetooth::shim::SetMockIsoInterface(&iso_interface_); hcic::SetMockHcicInterface(&hcic_interface_); bluetooth::shim::testing::hci_layer_set_interface(&bluetooth::shim::interface); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); big_callbacks_.reset(new MockBigCallbacks()); cig_callbacks_.reset(new MockCigCallbacks()); @@ -142,7 +143,8 @@ protected: iso_sizes_.total_num_le_packets_ = 6; iso_sizes_.le_data_packet_length_ = 1024; - ON_CALL(controller_, GetControllerIsoBufferSize()).WillByDefault(Return(iso_sizes_)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetControllerIsoBufferSize()) + .WillByDefault(Return(iso_sizes_)); InitIsoManager(); } @@ -156,7 +158,7 @@ protected: bluetooth::shim::SetMockIsoInterface(nullptr); hcic::SetMockHcicInterface(nullptr); bluetooth::shim::testing::hci_layer_set_interface(nullptr); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } virtual void InitIsoManager() { @@ -312,7 +314,6 @@ protected: IsoManager* manager_instance_; bluetooth::shim::MockIsoInterface iso_interface_; hcic::MockHcicInterface hcic_interface_; - bluetooth::hci::testing::MockControllerInterface controller_; bluetooth::hci::LeBufferSize iso_sizes_; std::unique_ptr<MockBigCallbacks> big_callbacks_; @@ -2207,7 +2208,8 @@ TEST_F(IsoManagerTest, SendIsoDataBigValid) { } TEST_F(IsoManagerTest, SendIsoDataNoCredits) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; std::vector<uint8_t> data_vec(108, 0); // Check on CIG @@ -2254,7 +2256,8 @@ TEST_F(IsoManagerTest, SendIsoDataNoCredits) { } TEST_F(IsoManagerTest, SendIsoDataCreditsReturned) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; std::vector<uint8_t> data_vec(108, 0); // Check on CIG @@ -2323,7 +2326,8 @@ TEST_F(IsoManagerTest, SendIsoDataCreditsReturned) { } TEST_F(IsoManagerTest, SendIsoDataCreditsReturnedByDisconnection) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; std::vector<uint8_t> data_vec(108, 0); // Check on CIG @@ -2542,7 +2546,8 @@ TEST_F(IsoManagerDeathTestNoCleanup, HandleLateArivingEventHandleDisconnect) { * is already stopped. */ TEST_F(IsoManagerDeathTestNoCleanup, HandleLateArivingEventHandleNumComplDataPkts) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; IsoManager::GetInstance()->CreateCig(volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); diff --git a/system/stack/test/connection_manager_test.cc b/system/stack/test/connection_manager_test.cc index 1a06158ca0..db2908c76b 100644 --- a/system/stack/test/connection_manager_test.cc +++ b/system/stack/test/connection_manager_test.cc @@ -70,9 +70,10 @@ namespace connection_manager { class BleConnectionManager : public testing::Test { void SetUp() override { localConnTimeoutMock = std::make_unique<MockConnTimeout>(); - /* extern */ test::mock_acl_manager_ = new bluetooth::hci::testing::MockAclManager(); + /* extern */ test::mock_acl_manager_ = + std::make_unique<bluetooth::hci::testing::MockAclManager>(); /* extern */ test::mock_controller_ = - new testing::NiceMock<bluetooth::hci::testing::MockControllerInterface>(); + std::make_unique<testing::NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); ON_CALL(*test::mock_controller_, GetLeFilterAcceptListSize()).WillByDefault(Return(16)); auto alarm_mock = AlarmMock::Get(); @@ -92,8 +93,8 @@ class BleConnectionManager : public testing::Test { void TearDown() override { connection_manager::reset(true); AlarmMock::Reset(); - delete test::mock_controller_; - delete test::mock_acl_manager_; + test::mock_controller_.reset(); + test::mock_acl_manager_.reset(); localConnTimeoutMock.reset(); } }; @@ -106,7 +107,7 @@ TEST_F(BleConnectionManager, test_background_connection_add_remove) { EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); std::set<tAPP_ID> apps = get_apps_connecting_to(address1); EXPECT_EQ(apps.size(), 1UL); @@ -119,7 +120,7 @@ TEST_F(BleConnectionManager, test_background_connection_add_remove) { EXPECT_EQ(get_apps_connecting_to(address1).size(), 0UL); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify that multiple clients adding same device multiple times, result in @@ -136,7 +137,7 @@ TEST_F(BleConnectionManager, test_background_connection_multiple_clients) { EXPECT_EQ(get_apps_connecting_to(address1).size(), 3UL); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(_, _)).Times(0); @@ -153,7 +154,7 @@ TEST_F(BleConnectionManager, test_background_connection_multiple_clients) { EXPECT_EQ(get_apps_connecting_to(address1).size(), 0UL); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify adding/removing device to direct connection. */ @@ -173,7 +174,7 @@ TEST_F(BleConnectionManager, test_direct_connection_client) { // Client that don't do direct connection should fail attempt to stop it EXPECT_FALSE(direct_connect_remove(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); @@ -183,7 +184,7 @@ TEST_F(BleConnectionManager, test_direct_connection_client) { // acceptlist is in use, i.e. next connection attempt EXPECT_TRUE(direct_connect_remove(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify direct connection timeout does remove device from acceptlist, and @@ -201,7 +202,7 @@ TEST_F(BleConnectionManager, test_direct_connect_timeout) { // Start direct connect attempt... EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_CALL(*localConnTimeoutMock, OnConnectionTimedOut(CLIENT1, address1)).Times(1); @@ -210,7 +211,7 @@ TEST_F(BleConnectionManager, test_direct_connect_timeout) { // simulate timeout seconds passed, alarm executing alarm_callback(alarm_data); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify that we properly handle successfull direct connection */ @@ -222,7 +223,7 @@ TEST_F(BleConnectionManager, test_direct_connection_success) { // Start direct connect attempt... EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(address1_hci)).Times(1); EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); @@ -230,7 +231,7 @@ TEST_F(BleConnectionManager, test_direct_connection_success) { // successfully. on_connection_complete(address1); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify that we properly handle application unregistration */ @@ -244,23 +245,23 @@ TEST_F(BleConnectionManager, test_app_unregister) { EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address1_hci, true)).Times(1); EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address2_hci, false)).Times(1); EXPECT_TRUE(background_connect_add(CLIENT1, address2)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address2_hci, true)).Times(1); EXPECT_TRUE(direct_connect_add(CLIENT2, address2)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(address1_hci)).Times(1); on_app_deregistered(CLIENT1); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(address2_hci)).Times(1); on_app_deregistered(CLIENT2); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify adding device to both direct connection and background connection. */ @@ -273,7 +274,7 @@ TEST_F(BleConnectionManager, test_direct_and_background_connect) { EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); // not removing from acceptlist yet, as the background connection is still @@ -284,7 +285,7 @@ TEST_F(BleConnectionManager, test_direct_and_background_connect) { EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_TRUE(background_connect_remove(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_target_announement_connect) { @@ -302,7 +303,7 @@ TEST_F(BleConnectionManager, test_add_targeted_announement_when_allow_list_used) EXPECT_TRUE(background_connect_add(CLIENT1, address1)); EXPECT_TRUE(background_connect_targeted_announcement_add(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_add_background_connect_when_targeted_announcement_are_enabled) { @@ -315,7 +316,7 @@ TEST_F(BleConnectionManager, test_add_background_connect_when_targeted_announcem EXPECT_TRUE(background_connect_targeted_announcement_add(CLIENT2, address1)); EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_re_add_background_connect_to_allow_list) { @@ -325,7 +326,7 @@ TEST_F(BleConnectionManager, test_re_add_background_connect_to_allow_list) { EXPECT_TRUE(background_connect_targeted_announcement_add(CLIENT2, address1)); EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); /* Now remove app using targeted announcement and expect device * to be added to white list @@ -335,11 +336,11 @@ TEST_F(BleConnectionManager, test_re_add_background_connect_to_allow_list) { EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address1_hci, false)).Times(1); EXPECT_TRUE(background_connect_remove(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_TRUE(background_connect_remove(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multiple_clients) { @@ -352,7 +353,7 @@ TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multip EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*AlarmMock::Get(), AlarmSetOnMloop(_, _, _, _)) .Times(1) @@ -360,7 +361,7 @@ TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multip // Start direct connect attempt... EXPECT_TRUE(direct_connect_add(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); // simulate timeout seconds passed, alarm executing EXPECT_CALL(*localConnTimeoutMock, OnConnectionTimedOut(CLIENT2, address1)).Times(1); @@ -369,7 +370,7 @@ TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multip EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); alarm_callback(alarm_data); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } } // namespace connection_manager diff --git a/system/stack/test/eatt/eatt_test.cc b/system/stack/test/eatt/eatt_test.cc index 130893a0a5..5d7a2eeea8 100644 --- a/system/stack/test/eatt/eatt_test.cc +++ b/system/stack/test/eatt/eatt_test.cc @@ -219,11 +219,13 @@ protected: le_buffer_size_.le_data_packet_length_ = 128; le_buffer_size_.total_num_le_packets_ = 24; - EXPECT_CALL(controller_, GetLeBufferSize).WillRepeatedly(Return(le_buffer_size_)); + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + EXPECT_CALL(*bluetooth::hci::testing::mock_controller_, GetLeBufferSize) + .WillRepeatedly(Return(le_buffer_size_)); bluetooth::l2cap::SetMockInterface(&l2cap_interface_); bluetooth::manager::SetMockBtmApiInterface(&btm_api_interface_); bluetooth::gatt::SetMockGattInterface(&gatt_interface_); - bluetooth::hci::testing::mock_controller_ = &controller_; // Clear the static memory for each test case memset(&test_tcb, 0, sizeof(test_tcb)); @@ -258,7 +260,7 @@ protected: bluetooth::l2cap::SetMockInterface(nullptr); bluetooth::testing::stack::l2cap::reset_interface(); bluetooth::manager::SetMockBtmApiInterface(nullptr); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); Test::TearDown(); } @@ -269,7 +271,6 @@ protected: bluetooth::l2cap::MockL2capInterface l2cap_interface_; bluetooth::testing::stack::l2cap::Mock mock_stack_l2cap_interface_; bluetooth::gatt::MockGattInterface gatt_interface_; - bluetooth::hci::testing::MockControllerInterface controller_; bluetooth::hci::LeBufferSize le_buffer_size_; tL2CAP_APPL_INFO l2cap_app_info_; diff --git a/system/stack/test/stack_acl_test.cc b/system/stack/test/stack_acl_test.cc index b08a45cb80..bd0b153b9f 100644 --- a/system/stack/test/stack_acl_test.cc +++ b/system/stack/test/stack_acl_test.cc @@ -48,12 +48,12 @@ class StackAclTest : public testing::Test { protected: void SetUp() override { reset_mock_function_count_map(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); } - void TearDown() override { bluetooth::hci::testing::mock_controller_ = nullptr; } + void TearDown() override { bluetooth::hci::testing::mock_controller_.reset(); } tBTM_SEC_DEV_REC device_record_; - bluetooth::hci::testing::MockControllerInterface controller_; }; TEST_F(StackAclTest, nop) {} diff --git a/system/stack/test/stack_l2cap_test.cc b/system/stack/test/stack_l2cap_test.cc index ffe78055bc..204900b462 100644 --- a/system/stack/test/stack_l2cap_test.cc +++ b/system/stack/test/stack_l2cap_test.cc @@ -49,23 +49,23 @@ constexpr uint16_t kAclBufferSizeBle = 45; class StackL2capTest : public ::testing::Test { protected: void SetUp() override { - bluetooth::hci::testing::mock_controller_ = &controller_interface_; - ON_CALL(controller_interface_, GetNumAclPacketBuffers) + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetNumAclPacketBuffers) .WillByDefault(Return(kAclBufferCountClassic)); bluetooth::hci::LeBufferSize le_sizes; le_sizes.total_num_le_packets_ = kAclBufferCountBle; le_sizes.le_data_packet_length_ = kAclBufferSizeBle; - ON_CALL(controller_interface_, GetLeBufferSize).WillByDefault(Return(le_sizes)); - ON_CALL(controller_interface_, SupportsBle).WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetLeBufferSize) + .WillByDefault(Return(le_sizes)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsBle).WillByDefault(Return(true)); l2c_init(); } void TearDown() override { l2c_free(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - - bluetooth::hci::testing::MockControllerInterface controller_interface_; }; TEST_F(StackL2capTest, l2cble_process_data_length_change_event) { diff --git a/system/test/Android.bp b/system/test/Android.bp index c35931ea17..106dedb7bd 100644 --- a/system/test/Android.bp +++ b/system/test/Android.bp @@ -450,13 +450,6 @@ filegroup { } filegroup { - name: "TestMockStackMetrics", - srcs: [ - "mock/mock_stack_metrics*.cc", - ], -} - -filegroup { name: "TestMockStackGap", srcs: [ "mock/mock_stack_gap*.cc", diff --git a/system/test/README.md b/system/test/README.md deleted file mode 100644 index 1f43e952ef..0000000000 --- a/system/test/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Fluoride Bluetooth Tests - -This document refers to the tests in the packages/modules/Bluetooth/system/test directory. - -The tests are designed to be run when the Android runtime is not running. From a terminal, run: - -## Before you run tests -```sh -adb shell stop -``` - -## After you're done -```sh -adb shell start -``` - -## Running tests -Then see what options the test script provides: - -```sh -./run_unit_tests.sh --help -``` - -But for the impatient, run specific groups of tests like this: - -```sh -./run_unit_tests.sh net_test_bluetooth -``` - -a single test: - -```sh -./run_unit_tests.sh net_test_bluetooth.BluetoothTest.AdapterRepeatedEnableDisable -``` - -## Sample Output - -packages/modules/Bluetooth/system/test$ ./run_unit_tests.sh net_test_bluetooth ---- net_test_bluetooth --- -pushing... -/tbd/aosp-master/out/target/product/bullhead/data/nativetest/n...st_bluetooth: 1 file pushed. 9.2 MB/s (211832 bytes in 0.022s) -running... - -Running main() from gtest_main.cc -[==========] Running 11 tests from 2 test cases. -[----------] Global test environment set-up. -[----------] 6 tests from BluetoothTest -[ RUN ] BluetoothTest.AdapterEnableDisable -[ OK ] BluetoothTest.AdapterEnableDisable (2538 ms) -[ RUN ] BluetoothTest.AdapterRepeatedEnableDisable -[ OK ] BluetoothTest.AdapterRepeatedEnableDisable (11384 ms) -[ RUN ] BluetoothTest.AdapterSetGetName -[ OK ] BluetoothTest.AdapterSetGetName (2378 ms) -[ RUN ] BluetoothTest.AdapterStartDiscovery -[ OK ] BluetoothTest.AdapterStartDiscovery (2397 ms) -[ RUN ] BluetoothTest.AdapterCancelDiscovery -[ OK ] BluetoothTest.AdapterCancelDiscovery (2401 ms) -[ RUN ] BluetoothTest.AdapterDisableDuringBonding -[ OK ] BluetoothTest.AdapterDisableDuringBonding (11689 ms) -[----------] 6 tests from BluetoothTest (32789 ms total) - -[----------] 5 tests from GattTest -[ RUN ] GattTest.GattClientRegister -[ OK ] GattTest.GattClientRegister (2370 ms) -[ RUN ] GattTest.GattClientScanRemoteDevice -[ OK ] GattTest.GattClientScanRemoteDevice (2273 ms) -[ RUN ] GattTest.GattClientAdvertise -[ OK ] GattTest.GattClientAdvertise (2236 ms) -[ RUN ] GattTest.GattServerRegister -[ OK ] GattTest.GattServerRegister (2391 ms) -[ RUN ] GattTest.GattServerBuild -[ OK ] GattTest.GattServerBuild (2435 ms) -[----------] 5 tests from GattTest (11706 ms total) - -[----------] Global test environment tear-down -[==========] 11 tests from 2 test cases ran. (44495 ms total) -[ PASSED ] 11 tests. - -## Troubleshooting: Your phone is bricked! -Probably not. See [After you're done](#After-you're-done) - diff --git a/system/test/mock/mock_main_shim_entry.cc b/system/test/mock/mock_main_shim_entry.cc index 5d68f11b9d..3cdc714eaf 100644 --- a/system/test/mock/mock_main_shim_entry.cc +++ b/system/test/mock/mock_main_shim_entry.cc @@ -38,9 +38,9 @@ namespace bluetooth { namespace hci { namespace testing { -MockAclManager* mock_acl_manager_{nullptr}; -MockControllerInterface* mock_controller_{nullptr}; -HciInterface* mock_hci_layer_{nullptr}; +std::unique_ptr<MockAclManager> mock_acl_manager_; +std::unique_ptr<MockControllerInterface> mock_controller_; +std::unique_ptr<MockHciLayer> mock_hci_layer_; os::Handler* mock_gd_shim_handler_{nullptr}; MockLeAdvertisingManager* mock_le_advertising_manager_{nullptr}; MockLeScanningManager* mock_le_scanning_manager_{nullptr}; @@ -58,9 +58,9 @@ class Dumpsys; namespace shim { -hci::AclManager* GetAclManager() { return hci::testing::mock_acl_manager_; } -hci::ControllerInterface* GetController() { return hci::testing::mock_controller_; } -hci::HciInterface* GetHciLayer() { return hci::testing::mock_hci_layer_; } +hci::AclManager* GetAclManager() { return hci::testing::mock_acl_manager_.get(); } +hci::ControllerInterface* GetController() { return hci::testing::mock_controller_.get(); } +hci::HciInterface* GetHciLayer() { return hci::testing::mock_hci_layer_.get(); } hci::LeAdvertisingManager* GetAdvertising() { return hci::testing::mock_le_advertising_manager_; } hci::LeScanningManager* GetScanning() { return hci::testing::mock_le_scanning_manager_; } hci::DistanceMeasurementManager* GetDistanceMeasurementManager() { diff --git a/system/test/mock/mock_main_shim_entry.h b/system/test/mock/mock_main_shim_entry.h index ca84a27193..5d427fd963 100644 --- a/system/test/mock/mock_main_shim_entry.h +++ b/system/test/mock/mock_main_shim_entry.h @@ -15,11 +15,12 @@ */ #include <functional> +#include <memory> #include "hci/acl_manager_mock.h" #include "hci/controller_interface_mock.h" #include "hci/distance_measurement_manager_mock.h" -#include "hci/hci_interface.h" +#include "hci/hci_layer_mock.h" #include "hci/le_advertising_manager_mock.h" #include "hci/le_scanning_manager_mock.h" #include "storage/storage_module.h" @@ -28,9 +29,9 @@ namespace bluetooth { namespace hci { namespace testing { -extern MockAclManager* mock_acl_manager_; -extern MockControllerInterface* mock_controller_; -extern HciInterface* mock_hci_layer_; +extern std::unique_ptr<MockAclManager> mock_acl_manager_; +extern std::unique_ptr<MockControllerInterface> mock_controller_; +extern std::unique_ptr<MockHciLayer> mock_hci_layer_; extern os::Handler* mock_gd_shim_handler_; extern MockLeAdvertisingManager* mock_le_advertising_manager_; extern MockLeScanningManager* mock_le_scanning_manager_; diff --git a/system/test/mock/mock_stack_metrics_logging.cc b/system/test/mock/mock_stack_metrics_logging.cc deleted file mode 100644 index ff2cee4472..0000000000 --- a/system/test/mock/mock_stack_metrics_logging.cc +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Generated mock file from original source file - * Functions generated:5 - * - * mockcify.pl ver 0.2 - */ -// Mock include file to share data between tests and mock -#include "test/mock/mock_stack_metrics_logging.h" - -#include <string> - -// Original included files, if any -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "stack/include/stack_metrics_logging.h" -#include "test/common/mock_functions.h" -#include "types/raw_address.h" - -// Mocked compile conditionals, if any -// Mocked internal structures, if any - -namespace test { -namespace mock { -namespace stack_metrics_logging { - -// Function state capture and return values, if needed -struct log_classic_pairing_event log_classic_pairing_event; -struct log_link_layer_connection_event log_link_layer_connection_event; -struct log_smp_pairing_event log_smp_pairing_event; -struct log_le_pairing_fail log_le_pairing_fail; -struct log_sdp_attribute log_sdp_attribute; -struct log_manufacturer_info log_manufacturer_info; -struct log_counter_metrics log_counter_metrics; -struct log_hfp_audio_packet_loss_stats log_hfp_audio_packet_loss_stats; -struct log_mmc_transcode_rtt_stats log_mmc_transcode_rtt_stats; -struct log_le_connection_status log_le_connection_status; -struct log_le_device_in_accept_list log_le_device_in_accept_list; -struct log_le_connection_lifecycle log_le_connection_lifecycle; -struct log_le_connection_completion log_le_connection_completion; - -} // namespace stack_metrics_logging -} // namespace mock -} // namespace test - -// Mocked functions, if any -void log_classic_pairing_event(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_classic_pairing_event( - address, handle, hci_cmd, hci_event, cmd_status, reason_code, event_value); -} -void log_link_layer_connection_event(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, - uint16_t link_type, uint32_t hci_cmd, uint16_t hci_event, - uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_link_layer_connection_event( - address, connection_handle, direction, link_type, hci_cmd, hci_event, hci_ble_event, - cmd_status, reason_code); -} -void log_smp_pairing_event(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_smp_pairing_event(address, smp_cmd, direction, - smp_fail_reason); -} - -void log_le_pairing_fail(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_pairing_fail(raw_address, failure_reason, is_outgoing); -} - -void log_sdp_attribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_sdp_attribute(address, protocol_uuid, attribute_id, - attribute_size, attribute_value); -} -void log_manufacturer_info(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_manufacturer_info(address, address_type, source_type, - source_name, manufacturer, model, - hardware_version, software_version); -} - -void log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_counter_metrics(key, value); -} - -void log_hfp_audio_packet_loss_stats(const RawAddress& address, int num_decoded_frames, - double packet_loss_ratio, uint16_t codec_type) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_hfp_audio_packet_loss_stats(address, num_decoded_frames, - packet_loss_ratio, codec_type); -} - -void log_mmc_transcode_rtt_stats(int maximum_rtt, double mean_rtt, int num_requests, - int codec_type) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_mmc_transcode_rtt_stats(maximum_rtt, mean_rtt, - num_requests, codec_type); -} - -void log_le_connection_status(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_connection_status(address, is_connect, reason); -} - -void log_le_device_in_accept_list(bluetooth::hci::Address address, bool is_add) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_device_in_accept_list(address, is_add); -} - -void log_le_connection_lifecycle(bluetooth::hci::Address address, bool is_connect, bool is_direct) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_connection_lifecycle(address, is_connect, is_direct); -} - -void log_le_connection_completion(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_connection_completion(address, reason, - is_locally_initiated); -} -// END mockcify generation diff --git a/system/test/mock/mock_stack_metrics_logging.h b/system/test/mock/mock_stack_metrics_logging.h deleted file mode 100644 index 40212e60ea..0000000000 --- a/system/test/mock/mock_stack_metrics_logging.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Generated mock file from original source file - * Functions generated:5 - * - * mockcify.pl ver 0.2 - */ - -#include <string> - -// Original included files, if any -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "hci/address.h" -#include "hci/hci_packets.h" -#include "types/raw_address.h" - -// Mocked compile conditionals, if any - -namespace test { -namespace mock { -namespace stack_metrics_logging { - -// Shared state between mocked functions and tests -// Name: log_classic_pairing_event -// Params: const RawAddress& address, uint16_t handle, uint32_t hci_cmd, -// uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, int64_t -// event_value Returns: void -struct log_classic_pairing_event { - std::function<void(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value)> - body{[](const RawAddress& /* address */, uint16_t /* handle */, uint32_t /* hci_cmd */, - uint16_t /* hci_event */, uint16_t /* cmd_status */, uint16_t /* reason_code */, - int64_t /* event_value */) {}}; - void operator()(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, uint16_t hci_event, - uint16_t cmd_status, uint16_t reason_code, int64_t event_value) { - body(address, handle, hci_cmd, hci_event, cmd_status, reason_code, event_value); - } -}; -extern struct log_classic_pairing_event log_classic_pairing_event; -// Name: log_link_layer_connection_event -// Params: const RawAddress* address, uint32_t connection_handle, -// android::bluetooth::DirectionEnum direction, uint16_t link_type, uint32_t -// hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, uint16_t cmd_status, -// uint16_t reason_code Returns: void -struct log_link_layer_connection_event { - std::function<void(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, - uint32_t hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, - uint16_t cmd_status, uint16_t reason_code)> - body{[](const RawAddress* /* address */, uint32_t /* connection_handle */, - android::bluetooth::DirectionEnum /* direction */, uint16_t /* link_type */, - uint32_t /* hci_cmd */, uint16_t /* hci_event */, uint16_t /* hci_ble_event */, - uint16_t /* cmd_status */, uint16_t /* reason_code */) {}}; - void operator()(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, uint32_t hci_cmd, - uint16_t hci_event, uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code) { - body(address, connection_handle, direction, link_type, hci_cmd, hci_event, hci_ble_event, - cmd_status, reason_code); - } -}; -extern struct log_link_layer_connection_event log_link_layer_connection_event; -// Name: log_smp_pairing_event -// Params: const RawAddress& address, uint16_t smp_cmd, -// android::bluetooth::DirectionEnum direction, uint8_t smp_fail_reason Returns: -// void -struct log_smp_pairing_event { - std::function<void(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason)> - body{[](const RawAddress& /* address */, uint16_t /* smp_cmd */, - android::bluetooth::DirectionEnum /* direction */, - uint16_t /* smp_fail_reason */) {}}; - void operator()(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason) { - body(address, smp_cmd, direction, smp_fail_reason); - } -}; -extern struct log_smp_pairing_event log_smp_pairing_event; - -// Name: log_le_pairing_fail -// Params: const RawAddress& raw_address, uint8_t failure_reason, bool -// is_outgoing Returns: -// void -// Name: log_sdp_attribute -// Params: const RawAddress& address, uint16_t protocol_uuid, uint16_t -// attribute_id, size_t attribute_size, const char* attribute_value Returns: -// void -struct log_le_pairing_fail { - std::function<void(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing)> body{ - [](const RawAddress& /* address */, uint8_t /* failure reason */, - bool /* is_outgoing */) {}}; - void operator()(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing) { - body(raw_address, failure_reason, is_outgoing); - } -}; -extern struct log_le_pairing_fail log_le_pairing_fail; - -struct log_sdp_attribute { - std::function<void(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value)> - body{[](const RawAddress& /* address */, uint16_t /* protocol_uuid */, - uint16_t /* attribute_id */, size_t /* attribute_size */, - const char* /* attribute_value */) {}}; - void operator()(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - body(address, protocol_uuid, attribute_id, attribute_size, attribute_value); - } -}; -extern struct log_sdp_attribute log_sdp_attribute; -// Name: log_manufacturer_info -// Params: const RawAddress& address, android::bluetooth::DeviceInfoSrcEnum -// source_type, const std::string& source_name, const std::string& manufacturer, -// const std::string& model, const std::string& hardware_version, const -// std::string& software_version Returns: void -struct log_manufacturer_info { - std::function<void(const RawAddress& address, android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version)> - body2{[](const RawAddress& /* address */, - android::bluetooth::AddressTypeEnum /* address_type */, - android::bluetooth::DeviceInfoSrcEnum /* source_type */, - const std::string& /* source_name */, const std::string& /* manufacturer */, - const std::string& /* model */, const std::string& /* hardware_version */, - const std::string& /* software_version */) {}}; - void operator()(const RawAddress& address, android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, const std::string& source_name, - const std::string& manufacturer, const std::string& model, - const std::string& hardware_version, const std::string& software_version) { - body2(address, address_type, source_type, source_name, manufacturer, model, hardware_version, - software_version); - } - std::function<void(const RawAddress& address, android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version)> - body{[](const RawAddress& /* address */, - android::bluetooth::DeviceInfoSrcEnum /* source_type */, - const std::string& /* source_name */, const std::string& /* manufacturer */, - const std::string& /* model */, const std::string& /* hardware_version */, - const std::string& /* software_version */) {}}; - void operator()(const RawAddress& address, android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - body(address, source_type, source_name, manufacturer, model, hardware_version, - software_version); - } -}; -extern struct log_manufacturer_info log_manufacturer_info; - -// Name: log_counter_metrics -struct log_counter_metrics { - std::function<void(android::bluetooth::CodePathCounterKeyEnum key, int64_t value)> body{ - [](android::bluetooth::CodePathCounterKeyEnum /* key */, int64_t /* value */) {}}; - void operator()(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - body(key, value); - } -}; -extern struct log_counter_metrics log_counter_metrics; - -// Name: log_hfp_audio_packet_loss_stats -struct log_hfp_audio_packet_loss_stats { - std::function<void(const RawAddress& address, int num_decoded_frames, double packet_loss_ratio, - uint16_t codec_type)> - body{[](const RawAddress& /* address */, int /* num_decoded_frames */, - double /* packet_loss_ratio */, uint16_t /* codec_type */) {}}; - void operator()(const RawAddress& address, int num_decoded_frames, double packet_loss_ratio, - uint16_t codec_type) { - body(address, num_decoded_frames, packet_loss_ratio, codec_type); - } -}; -extern struct log_hfp_audio_packet_loss_stats log_hfp_audio_packet_loss_stats; - -// Name: log_mmc_transcode_rtt_stats -struct log_mmc_transcode_rtt_stats { - std::function<void(int maximum_rtt, double mean_rtt, int num_requests, int codec_type)> body{ - [](int /* maximum_rtt */, double /* mean_rtt */, int /* num_requests */, - int /* codec_type */) {}}; - void operator()(int maximum_rtt, double mean_rtt, int num_requests, int codec_type) { - body(maximum_rtt, mean_rtt, num_requests, codec_type); - } -}; -extern struct log_mmc_transcode_rtt_stats log_mmc_transcode_rtt_stats; - -// Name: log_le_connection_status -struct log_le_connection_status { - std::function<void(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason)> - body{[](bluetooth::hci::Address /* address */, bool /* is_connect */, - bluetooth::hci::ErrorCode /* reason */) {}}; - void operator()(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason) { - body(address, is_connect, reason); - } -}; -extern struct log_le_connection_status log_le_connection_status; - -// Name: log_le_device_in_accept_list -struct log_le_device_in_accept_list { - std::function<void(bluetooth::hci::Address address, bool is_add)> body{ - [](bluetooth::hci::Address /* address */, bool /* is_add */) {}}; - void operator()(bluetooth::hci::Address address, bool is_add) { body(address, is_add); } -}; -extern struct log_le_device_in_accept_list log_le_device_in_accept_list; - -// Name: log_le_connection_lifecycle -struct log_le_connection_lifecycle { - std::function<void(bluetooth::hci::Address address, bool is_connect, bool is_direct)> body{ - [](bluetooth::hci::Address /* address */, bool /* is_connect */, bool /* is_direct */) { - }}; - void operator()(bluetooth::hci::Address address, bool is_connect, bool is_direct) { - body(address, is_connect, is_direct); - } -}; -extern struct log_le_device_in_accept_list log_le_device_in_accept_list; - -// Name: log_le_connection_completion -struct log_le_connection_completion { - std::function<void(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated)> - body{[](bluetooth::hci::Address /* address */, bluetooth::hci::ErrorCode /* reason */, - bool /* is locally initiated */) {}}; - void operator()(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated) { - body(address, reason, is_locally_initiated); - } -}; -extern struct log_le_connection_completion log_le_connection_completion; - -} // namespace stack_metrics_logging -} // namespace mock -} // namespace test - -// END mockcify generation |