OSDN Git Service

Allow Java-land to request current track metadata through JNI
authorSal Savage <salsavage@google.com>
Thu, 30 Apr 2020 22:10:08 +0000 (15:10 -0700)
committerMyles Watson <mylesgw@google.com>
Fri, 8 May 2020 22:35:26 +0000 (22:35 +0000)
AVRCP Targets are not supposed to give image handles over with metadata
until an AVRCP BIP client connects from a particular controller. Because
this connection can happen any time and there's nothing forcing a target
to send us a track changed notification to inform us of the new handle,
the best thing we can do to work with all devices is to request it when
we connect on BIP. Otherwise, we risk a race condition between the BIP
connection and any amount of track changed notifications that might
happen organically. Our JNI doesn't current support requesting current
track metadata.

This change adds/implements a get_current_track_metadata() method to the
JNI. This, paired with a change in /packages/apps/Bluetooth/, fixes the
above mentioned race condition and keeps us from missing out on possible
cover art image handles.

Bug: 152655644
Test: Build, flash, test with AVRCP target cover art devices
Change-Id: I9d1f28068b4fded61d5336da8d864fbd9ef34f98
Merged-In: I9d1f28068b4fded61d5336da8d864fbd9ef34f98

btif/src/btif_rc.cc
include/hardware/bt_rc.h

index 4ceae82..4e7141e 100755 (executable)
@@ -4637,6 +4637,28 @@ static bt_status_t get_player_app_setting_cmd(uint8_t num_attrib,
 
 /***************************************************************************
  *
+ * Function         get_current_metadata_cmd
+ *
+ * Description      Fetch the current track metadata for the device
+ *
+ * Returns          BT_STATUS_SUCCESS if command issued successfully otherwise
+ *                  BT_STATUS_FAIL.
+ *
+ **************************************************************************/
+static bt_status_t get_current_metadata_cmd(const RawAddress& bd_addr) {
+  BTIF_TRACE_DEBUG("%s", __func__);
+  btif_rc_device_cb_t* p_dev = btif_rc_get_device_by_bda(bd_addr);
+  if (p_dev == NULL) {
+    BTIF_TRACE_ERROR("%s: p_dev NULL", __func__);
+    return BT_STATUS_FAIL;
+  }
+  const uint32_t* attr_list = get_requested_attributes_list(p_dev);
+  const uint8_t attr_list_size = get_requested_attributes_list_size(p_dev);
+  return get_metadata_attribute_cmd(attr_list_size, attr_list, p_dev);
+}
+
+/***************************************************************************
+ *
  * Function         get_playback_state_cmd
  *
  * Description      Fetch the current playback state for the device
@@ -5313,6 +5335,7 @@ static const btrc_ctrl_interface_t bt_rc_ctrl_interface = {
     send_groupnavigation_cmd,
     change_player_app_setting,
     play_item_cmd,
+    get_current_metadata_cmd,
     get_playback_state_cmd,
     get_now_playing_list_cmd,
     get_folder_list_cmd,
index e842ec6..a4e349d 100755 (executable)
@@ -681,6 +681,9 @@ typedef struct {
   bt_status_t (*play_item_cmd)(const RawAddress& bd_addr, uint8_t scope,
                                uint8_t* uid, uint16_t uid_counter);
 
+  /** get the current track's media metadata */
+  bt_status_t (*get_current_metadata_cmd)(const RawAddress& bd_addr);
+
   /** get the playback state */
   bt_status_t (*get_playback_state_cmd)(const RawAddress& bd_addr);