From e198eb931d834a3117005f31ece43a83ecc0cd60 Mon Sep 17 00:00:00 2001 From: Rahul Sabnis Date: Fri, 31 Jul 2020 19:44:27 -0700 Subject: [PATCH] Check whether local device is an ATV device to determine whether to show the consent dialog for BLE pairing in JUSTWORKS and ENCRYPTION_ONLY mode Tag: #feature Bug: 157038281 Test: Manual Merged-In: I6d06f5996da71e5a1407e544b0023d82924aa56f Change-Id: I6d06f5996da71e5a1407e544b0023d82924aa56f --- btif/include/btif_api.h | 12 ++++++++++++ btif/src/bluetooth.cc | 6 +++++- include/hardware/bluetooth.h | 3 ++- service/hal/bluetooth_interface.cc | 2 +- stack/smp/smp_act.cc | 11 +++++++---- test/headless/headless.cc | 2 +- test/suite/adapter/adapter_unittest.cc | 2 +- 7 files changed, 29 insertions(+), 9 deletions(-) diff --git a/btif/include/btif_api.h b/btif/include/btif_api.h index 31c5e776a..f9b888691 100644 --- a/btif/include/btif_api.h +++ b/btif/include/btif_api.h @@ -134,6 +134,18 @@ int get_niap_config_compare_result(void); /******************************************************************************* * + * Function is_atv_device + * + * Description Returns true if the local device is an Android TV + * device, false if it is not. + * + * Returns bool + * + ******************************************************************************/ +bool is_atv_device(void); + +/******************************************************************************* + * * Function btif_get_adapter_properties * * Description Fetches all local adapter properties diff --git a/btif/src/bluetooth.cc b/btif/src/bluetooth.cc index 0187b1dc7..a00c0c662 100644 --- a/btif/src/bluetooth.cc +++ b/btif/src/bluetooth.cc @@ -88,6 +88,7 @@ bool restricted_mode = false; bool niap_mode = false; const int CONFIG_COMPARE_ALL_PASS = 0b11; int niap_config_compare_result = CONFIG_COMPARE_ALL_PASS; +bool is_local_device_atv = false; /******************************************************************************* * Externs @@ -140,7 +141,7 @@ static bool is_profile(const char* p1, const char* p2) { ****************************************************************************/ static int init(bt_callbacks_t* callbacks, bool start_restricted, - bool is_niap_mode, int config_compare_result) { + bool is_niap_mode, int config_compare_result, bool is_atv) { LOG_INFO(LOG_TAG, "%s: start restricted = %d ; niap = %d, config compare result = %d", __func__, start_restricted, is_niap_mode, config_compare_result); @@ -161,6 +162,7 @@ static int init(bt_callbacks_t* callbacks, bool start_restricted, restricted_mode = start_restricted; niap_mode = is_niap_mode; niap_config_compare_result = config_compare_result; + is_local_device_atv = is_atv; stack_manager_get_interface()->init_stack(); btif_debug_init(); @@ -191,6 +193,8 @@ int get_niap_config_compare_result() { return niap_mode ? niap_config_compare_result : CONFIG_COMPARE_ALL_PASS; } +bool is_atv_device() { return is_local_device_atv; } + static int get_adapter_properties(void) { /* sanity check */ if (!interface_ready()) return BT_STATUS_NOT_READY; diff --git a/include/hardware/bluetooth.h b/include/hardware/bluetooth.h index 8ac32b2d2..425100516 100644 --- a/include/hardware/bluetooth.h +++ b/include/hardware/bluetooth.h @@ -473,9 +473,10 @@ typedef struct { * The |is_niap_mode| flag inits the adapter in NIAP mode. * The |config_compare_result| flag show the config checksum check result if * is in NIAP mode. + * The |is_atv| flag indicates whether the local device is an Android TV */ int (*init)(bt_callbacks_t* callbacks, bool guest_mode, bool is_niap_mode, - int config_compare_result); + int config_compare_result, bool is_atv); /** Enable Bluetooth. */ int (*enable)(); diff --git a/service/hal/bluetooth_interface.cc b/service/hal/bluetooth_interface.cc index 8043785dc..42eeb002a 100644 --- a/service/hal/bluetooth_interface.cc +++ b/service/hal/bluetooth_interface.cc @@ -254,7 +254,7 @@ class BluetoothInterfaceImpl : public BluetoothInterface { // Initialize the Bluetooth interface. Set up the adapter (Bluetooth DM) API // callbacks. - status = hal_iface_->init(&bt_callbacks, false, false, 0); + status = hal_iface_->init(&bt_callbacks, false, false, 0, false); if (status != BT_STATUS_SUCCESS) { LOG(ERROR) << "Failed to initialize Bluetooth stack"; return false; diff --git a/stack/smp/smp_act.cc b/stack/smp/smp_act.cc index 123954222..22d99588c 100644 --- a/stack/smp/smp_act.cc +++ b/stack/smp/smp_act.cc @@ -19,6 +19,7 @@ #include #include #include +#include "btif_api.h" #include "btif_common.h" #include "btif_storage.h" #include "device/include/interop.h" @@ -1301,8 +1302,9 @@ void smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { smp_int_data.status = SMP_PAIR_AUTH_FAIL; int_evt = SMP_AUTH_CMPL_EVT; } else { - if (p_cb->local_io_capability != SMP_IO_CAP_NONE && - p_cb->local_io_capability != SMP_IO_CAP_IN) { + if (!is_atv_device() && + (p_cb->local_io_capability == SMP_IO_CAP_IO || + p_cb->local_io_capability == SMP_IO_CAP_KBDISP)) { /* display consent dialog if this device has a display */ SMP_TRACE_DEBUG("ENCRYPTION_ONLY showing Consent Dialog"); p_cb->cb_evt = SMP_CONSENT_REQ_EVT; @@ -1656,8 +1658,9 @@ void smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { } if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) { - if (p_cb->local_io_capability != SMP_IO_CAP_NONE && - p_cb->local_io_capability != SMP_IO_CAP_IN) { + if (!is_atv_device() && + (p_cb->local_io_capability == SMP_IO_CAP_IO || + p_cb->local_io_capability == SMP_IO_CAP_KBDISP)) { /* display consent dialog */ SMP_TRACE_DEBUG("JUST WORKS showing Consent Dialog"); p_cb->cb_evt = SMP_CONSENT_REQ_EVT; diff --git a/test/headless/headless.cc b/test/headless/headless.cc index 4eadcb636..9083e9c42 100644 --- a/test/headless/headless.cc +++ b/test/headless/headless.cc @@ -141,7 +141,7 @@ bt_os_callouts_t bt_os_callouts{ void HeadlessStack::SetUp() { LOG(INFO) << __func__ << " Entry"; - int status = bluetoothInterface.init(&bt_callbacks, false, false, 0); + int status = bluetoothInterface.init(&bt_callbacks, false, false, 0, false); (status == BT_STATUS_SUCCESS) ? LOG(INFO) << __func__ << " Initialized bluetooth callbacks" : LOG(FATAL) << "Failed to initialize Bluetooth stack"; diff --git a/test/suite/adapter/adapter_unittest.cc b/test/suite/adapter/adapter_unittest.cc index d68ad0f67..85549b0d5 100644 --- a/test/suite/adapter/adapter_unittest.cc +++ b/test/suite/adapter/adapter_unittest.cc @@ -179,7 +179,7 @@ TEST_F(BluetoothTest, AdapterCleanupDuringDiscovery) { ASSERT_TRUE(bt_callbacks != nullptr); for (int i = 0; i < kTestRepeatCount; ++i) { - bt_interface()->init(bt_callbacks, false, false, 0); + bt_interface()->init(bt_callbacks, false, false, 0, false); EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS); semaphore_wait(adapter_state_changed_callback_sem_); EXPECT_EQ(GetState(), BT_STATE_ON) << "Adapter did not turn on."; -- 2.11.0