From a7fd72e69e39742ebc02506e1dcf63fe0e61d1dc Mon Sep 17 00:00:00 2001
From: Ted <tedwang@google.com>
Date: Fri, 17 Aug 2018 18:49:37 +0800
Subject: [PATCH] Fix "Disable Absolute Volume" Bluetooth developer option

Do not report device support absolute volume while
"Disable Absolute Volume" in developer option is enabled or
the remote device is listed in the interoperability database.

Test: manually adjust volume when Disable Absolute Volume is enabled
Bug: 112193362
Change-Id: Id63a22dba0d8a871035774fc86b66d32e9225b48
---
 system/device/Android.bp                   |  1 +
 system/profile/avrcp/Android.bp            |  3 +++
 system/profile/avrcp/connection_handler.cc | 24 ++++++++++++++++++++--
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/system/device/Android.bp b/system/device/Android.bp
index 60e9fef306f..409989841cc 100644
--- a/system/device/Android.bp
+++ b/system/device/Android.bp
@@ -3,6 +3,7 @@
 cc_library_static {
     name: "libbtdevice",
     defaults: ["fluoride_defaults"],
+    host_supported: true,
     local_include_dirs: [
         "include",
     ],
diff --git a/system/profile/avrcp/Android.bp b/system/profile/avrcp/Android.bp
index d1ce4088aed..00073f8511d 100644
--- a/system/profile/avrcp/Android.bp
+++ b/system/profile/avrcp/Android.bp
@@ -38,6 +38,9 @@ cc_test {
         "libgmock",
         "lib-bt-packets",
         "libosi",
+        "liblog",
+        "libcutils",
+        "libbtdevice",
         "avrcp-target-service",
     ],
     sanitize: {
diff --git a/system/profile/avrcp/connection_handler.cc b/system/profile/avrcp/connection_handler.cc
index 5fc3e7c5769..f6ed8495a21 100644
--- a/system/profile/avrcp/connection_handler.cc
+++ b/system/profile/avrcp/connection_handler.cc
@@ -28,7 +28,9 @@
 // TODO (apanicke): Remove dependency on this header once we cleanup feature
 // handling.
 #include "bta/include/bta_av_api.h"
+#include "device/include/interop.h"
 #include "osi/include/allocator.h"
+#include "osi/include/properties.h"
 
 namespace bluetooth {
 namespace avrcp {
@@ -41,6 +43,20 @@ ConnectionHandler* ConnectionHandler::Get() {
   return instance_;
 }
 
+bool IsAbsoluteVolumeEnabled(const RawAddress* bdaddr) {
+  char volume_disabled[PROPERTY_VALUE_MAX] = {0};
+  osi_property_get("persist.bluetooth.disableabsvol", volume_disabled, "false");
+  if (strncmp(volume_disabled, "true", 4) == 0) {
+    LOG(INFO) << "Absolute volume disabled by property";
+    return false;
+  }
+  if (interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, bdaddr)) {
+    LOG(INFO) << "Absolute volume disabled by IOP table";
+    return false;
+  }
+  return true;
+}
+
 bool ConnectionHandler::Initialize(const ConnectionCallback& callback,
                                    AvrcpInterface* avrcp, SdpInterface* sdp,
                                    VolumeInterface* vol) {
@@ -429,7 +445,9 @@ void ConnectionHandler::SdpCb(const RawAddress& bdaddr, SdpCallback cb,
           if (categories & AVRC_SUPF_CT_CAT2) {
             LOG(INFO) << __PRETTY_FUNCTION__ << ": Device " << bdaddr.ToString()
                       << " supports advanced control";
-            peer_features |= (BTA_AV_FEAT_ADV_CTRL);
+            if (IsAbsoluteVolumeEnabled(&bdaddr)) {
+              peer_features |= (BTA_AV_FEAT_ADV_CTRL);
+            }
           }
           if (categories & AVRC_SUPF_CT_BROWSE) {
             LOG(INFO) << __PRETTY_FUNCTION__ << ": Device " << bdaddr.ToString()
@@ -468,7 +486,9 @@ void ConnectionHandler::SdpCb(const RawAddress& bdaddr, SdpCallback cb,
           if (categories & AVRC_SUPF_CT_CAT2) {
             LOG(INFO) << __PRETTY_FUNCTION__ << ": Device " << bdaddr.ToString()
                       << " supports advanced control";
-            peer_features |= (BTA_AV_FEAT_ADV_CTRL);
+            if (IsAbsoluteVolumeEnabled(&bdaddr)) {
+              peer_features |= (BTA_AV_FEAT_ADV_CTRL);
+            }
           }
         }
       }
-- 
GitLab