AVRCP: Cover-Art fixes wrt Player & Peer features (1/2)

Disallow sending cover-art attributes in GetFolderItems
and GetItemAttribute (NPL/VFS scope) response if player
and remote features don't support cover-art feature.

Change-Id: Id6f241004b843d9cfba9109677b836914c9d9e4f
diff --git a/packages_apps_bluetooth_ext/src/avrcp/AddressedMediaPlayer_ext.java b/packages_apps_bluetooth_ext/src/avrcp/AddressedMediaPlayer_ext.java
index a650069..4dd8e2e 100644
--- a/packages_apps_bluetooth_ext/src/avrcp/AddressedMediaPlayer_ext.java
+++ b/packages_apps_bluetooth_ext/src/avrcp/AddressedMediaPlayer_ext.java
@@ -506,10 +506,11 @@
                     break;
 
                 case AvrcpConstants_ext.ATTRID_COVER_ART:
-                    if (mAvrcp != null) {
+                    if (mAvrcp != null && mAvrcp.isCoverArtFeatureSupported(bdaddr)) {
                         attrValue = mAvrcp.getImgHandleFromTitle(bdaddr,
                                 desc.getTitle().toString());
                     } else {
+                        attrValue = null;
                         if (DEBUG) Log.d(TAG, " mAvrcp null ");
                     }
                     break;
diff --git a/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java b/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
index a479189..9381d4c 100644
--- a/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
+++ b/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
@@ -198,7 +198,8 @@
     public static final int BTRC_FEAT_METADATA = 0x01;
     public static final int BTRC_FEAT_ABSOLUTE_VOLUME = 0x02;
     public static final int BTRC_FEAT_BROWSE = 0x04;
-    public static final int BTRC_FEAT_AVRC_UI_UPDATE = 0x08;
+    public static final int BTRC_FEAT_COVER_ART = 0x08;
+    public static final int BTRC_FEAT_AVRC_UI_UPDATE = 0x10;
 
     /* AVRC response codes, from avrc_defs */
     private static final int AVRC_RSP_NOT_IMPL = 8;
@@ -694,6 +695,30 @@
         Log.d(TAG, "Exit cleanup()");
     }
 
+    public boolean isCoverArtFeatureSupported(byte[] bdaddr) {
+        Log.w(TAG, "isCoverArtFeatureSupported");
+        String address = Utils.getAddressStringFromByte((byte[]) bdaddr);
+        BluetoothDevice device = mAdapter.getRemoteDevice(address);
+        if (device == null)
+            return false;
+        MediaPlayerInfo_ext player = mMediaPlayerInfoList.getOrDefault(mCurrAddrPlayerID, null);
+        int index = getIndexForDevice(device);
+        if ((index == INVALID_DEVICE_INDEX) || (player == null))
+            return false;
+
+        short[] featureBits = player.getFeatureBitMask();
+        boolean playerSupportsCA = false;
+        for (int i = 0; i < featureBits.length; i++) {
+            if (featureBits[i] == AvrcpConstants_ext.AVRC_PF_COVER_ART_BIT_NO) {
+                playerSupportsCA = true;
+                break;
+            }
+        }
+        boolean peerSupprtsCA = ((deviceFeatures[index].mFeatures & BTRC_FEAT_COVER_ART) != 0);
+        Log.w(TAG, "playersupportCA " + playerSupportsCA + " peersupportCA " + peerSupprtsCA);
+        return (peerSupprtsCA && playerSupportsCA);
+    }
+
     private class AudioManagerPlaybackListener extends AudioManager.AudioPlaybackCallback {
         @Override
         public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) {
@@ -4690,7 +4715,7 @@
             if (connList.containsKey(bdaddrStr)) {
                 mediaPlayer = connList.get(bdaddrStr);
             } else {
-                mediaPlayer = new BrowsedMediaPlayer_ext(bdaddr, mContext, mMediaInterface);
+                mediaPlayer = new BrowsedMediaPlayer_ext(bdaddr, mContext, mMediaInterface, mAvrcp);
                 connList.put(bdaddrStr, mediaPlayer);
             }
             return mediaPlayer;
diff --git a/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java b/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java
index 8f1801d..f8290f5 100644
--- a/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java
+++ b/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java
@@ -59,6 +59,7 @@
     private Context mContext;
     private AvrcpMediaRspInterface_ext mMediaInterface;
     private byte[] mBDAddr;
+    private Avrcp_ext mAvrcp = null;
 
     private String mCurrentBrowsePackage;
     private String mCurrentBrowseClass;
@@ -281,10 +282,11 @@
 
     /* Constructor */
     BrowsedMediaPlayer_ext(byte[] address, Context context,
-            AvrcpMediaRspInterface_ext mAvrcpMediaRspInterface) {
+            AvrcpMediaRspInterface_ext mAvrcpMediaRspInterface, Avrcp_ext mAvrcp_ext) {
         mContext = context;
         mMediaInterface = mAvrcpMediaRspInterface;
         mBDAddr = address;
+        mAvrcp = mAvrcp_ext;
     }
 
     /* initialize mediacontroller in order to communicate with media player. */
@@ -852,7 +854,7 @@
         mMediaInterface.folderItemsRsp(bdaddr, AvrcpConstants_ext.RSP_NO_ERROR, rspObj);
     }
 
-    public String getAttrValue(byte []bdaddr, int attr, MediaBrowser.MediaItem item) {
+    public String getAttrValue(byte[] bdaddr, int attr, MediaBrowser.MediaItem item) {
         String attrValue = null;
         try {
             MediaDescription desc = item.getDescription();
@@ -888,8 +890,12 @@
                     break;
 
                 case AvrcpConstants_ext.ATTRID_COVER_ART:
-                    attrValue = Avrcp_ext.getImgHandleFromTitle(bdaddr,
-                            desc.getTitle().toString());
+                    if (mAvrcp != null && mAvrcp.isCoverArtFeatureSupported(bdaddr)) {
+                        attrValue = Avrcp_ext.getImgHandleFromTitle(bdaddr,
+                                desc.getTitle().toString());
+                    } else {
+                        attrValue = null;
+                    }
                     break;
 
                 default: