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
diff --git a/btif/include/btif_api.h b/btif/include/btif_api.h
index e066b83..9eb64d8 100644
--- a/btif/include/btif_api.h
+++ b/btif/include/btif_api.h
@@ -105,6 +105,18 @@
 
 /*******************************************************************************
  *
+ * 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 9885117..87acbfe 100644
--- a/btif/src/bluetooth.cc
+++ b/btif/src/bluetooth.cc
@@ -75,6 +75,7 @@
 
 bt_callbacks_t* bt_hal_cbacks = NULL;
 bool restricted_mode = false;
+bool is_local_device_atv = false;
 
 /*******************************************************************************
  *  Externs
@@ -131,7 +132,7 @@
  *
  ****************************************************************************/
 
-static int init(bt_callbacks_t* callbacks) {
+static int init(bt_callbacks_t* callbacks, bool is_atv) {
   LOG_INFO(LOG_TAG, "%s", __func__);
 
   if (interface_ready()) return BT_STATUS_DONE;
@@ -141,6 +142,7 @@
 #endif
 
   bt_hal_cbacks = callbacks;
+  is_local_device_atv = is_atv;
   stack_manager_get_interface()->init_stack();
   btif_debug_init();
   return BT_STATUS_SUCCESS;
@@ -168,6 +170,8 @@
 
 bool is_restricted_mode() { return restricted_mode; }
 
+bool is_atv_device() { return is_local_device_atv; }
+
 static int get_adapter_properties(void) {
   /* sanity check */
   if (interface_ready() == false) return BT_STATUS_NOT_READY;
diff --git a/service/hal/bluetooth_interface.cc b/service/hal/bluetooth_interface.cc
index cf55afd..2a17485 100644
--- a/service/hal/bluetooth_interface.cc
+++ b/service/hal/bluetooth_interface.cc
@@ -258,7 +258,7 @@
 
     // Initialize the Bluetooth interface. Set up the adapter (Bluetooth DM) API
     // callbacks.
-    status = hal_iface_->init(&bt_callbacks);
+    status = hal_iface_->init(&bt_callbacks, 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 b140557..09dc33c 100644
--- a/stack/smp/smp_act.cc
+++ b/stack/smp/smp_act.cc
@@ -18,6 +18,7 @@
 
 #include <log/log.h>
 #include <string.h>
+#include "btif_api.h"
 #include "btif_common.h"
 #include "device/include/interop.h"
 #include "include/bt_target.h"
@@ -1260,8 +1261,9 @@
         p = (tSMP_INT_DATA*)&failure;
         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;
@@ -1612,8 +1614,9 @@
       }
 
       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/suite/adapter/adapter_unittest.cc b/test/suite/adapter/adapter_unittest.cc
index f53de32..6670e7f 100644
--- a/test/suite/adapter/adapter_unittest.cc
+++ b/test/suite/adapter/adapter_unittest.cc
@@ -178,7 +178,7 @@
   ASSERT_TRUE(bt_callbacks != nullptr);
 
   for (int i = 0; i < kTestRepeatCount; ++i) {
-    bt_interface()->init(bt_callbacks);
+    bt_interface()->init(bt_callbacks, false);
     EXPECT_EQ(bt_interface()->enable(false), BT_STATUS_SUCCESS);
     semaphore_wait(adapter_state_changed_callback_sem_);
     EXPECT_EQ(GetState(), BT_STATE_ON) << "Adapter did not turn on.";