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: