Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1fc0d3a authored by Sal Savage's avatar Sal Savage Committed by Myles Watson
Browse files

Allow Java-land to request current track metadata through JNI

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
parent 197ed6d4
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -4635,6 +4635,28 @@ static bt_status_t get_player_app_setting_cmd(uint8_t num_attrib,
  return build_and_send_vendor_cmd(&avrc_cmd, AVRC_CMD_STATUS, p_dev);
}

/***************************************************************************
 *
 * 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
@@ -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,
+3 −0
Original line number Diff line number Diff line
@@ -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);