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

Commit f0c72aec authored by Marie Janssen's avatar Marie Janssen
Browse files

AVRCP: Rework available media player handling

Instead of rebuilding the available player list every time a player
changes, only add and remove the players that have changed.

Add browsable players that don't have an active media session to the
available players.

Update browsable players as they are connected to and refresh the list
(and notify clients) when we are done.

This has an effect of removing a lot of log lines, and reduces churn
of the MediaController callback registration.

Update logging that remains to be much less verbose.

Test: connect to various carkits, verify browsing, updated logs
Bug: 34249902
Bug: 36497125
Bug: 36802046
Change-Id: I9783c682a3f8c22b8b79cfd9023fac6078b21b9f
(cherry picked from commit eef486e7e3145cc7b302ee1b00bbd317481cdabd)
parent fdde2593
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -949,9 +949,10 @@ static jboolean setVolumeNative(JNIEnv* env, jobject object, jint volume) {
/* native response for scope as Media player */
static jboolean mediaPlayerListRspNative(
    JNIEnv* env, jobject object, jbyteArray address, jint rspStatus,
    jint uidCounter, jbyte itemType, jint numItems, jbyteArray playerTypes,
    jintArray playerSubtypes, jbyteArray playStatusValues,
    jshortArray featureBitmask, jobjectArray textArray) {
    jint uidCounter, jbyte itemType, jint numItems, jintArray playerIds,
    jbyteArray playerTypes, jintArray playerSubtypes,
    jbyteArray playStatusValues, jshortArray featureBitmask,
    jobjectArray textArray) {
  if (!sBluetoothAvrcpInterface) {
    ALOGE("%s: sBluetoothAvrcpInterface is null", __func__);
    return JNI_FALSE;
@@ -965,18 +966,20 @@ static jboolean mediaPlayerListRspNative(

  jbyte *p_playerTypes = NULL, *p_PlayStatusValues = NULL;
  jshort* p_FeatBitMaskValues = NULL;
  jint* p_playerSubTypes = NULL;
  jint *p_playerIds = NULL, *p_playerSubTypes = NULL;
  btrc_folder_items_t* p_items = NULL;
  if (rspStatus == BTRC_STS_NO_ERROR) {
    /* allocate memory */
    p_playerIds = env->GetIntArrayElements(playerIds, NULL);
    p_playerTypes = env->GetByteArrayElements(playerTypes, NULL);
    p_playerSubTypes = env->GetIntArrayElements(playerSubtypes, NULL);
    p_PlayStatusValues = env->GetByteArrayElements(playStatusValues, NULL);
    p_FeatBitMaskValues = env->GetShortArrayElements(featureBitmask, NULL);
    p_items = new btrc_folder_items_t[numItems];
    /* deallocate memory and return if allocation failed */
    if (!p_playerTypes || !p_playerSubTypes || !p_PlayStatusValues ||
        !p_FeatBitMaskValues || !p_items) {
    if (!p_playerIds || !p_playerTypes || !p_playerSubTypes ||
        !p_PlayStatusValues || !p_FeatBitMaskValues || !p_items) {
      if (p_playerIds) env->ReleaseIntArrayElements(playerIds, p_playerIds, 0);
      if (p_playerTypes)
        env->ReleaseByteArrayElements(playerTypes, p_playerTypes, 0);
      if (p_playerSubTypes)
@@ -997,7 +1000,7 @@ static jboolean mediaPlayerListRspNative(
    /* copy list of media players along with other parameters */
    int itemIdx;
    for (itemIdx = 0; itemIdx < numItems; ++itemIdx) {
      p_items[itemIdx].player.player_id = (uint16_t)(itemIdx + 1);
      p_items[itemIdx].player.player_id = p_playerIds[itemIdx];
      p_items[itemIdx].player.major_type = p_playerTypes[itemIdx];
      p_items[itemIdx].player.sub_type = p_playerSubTypes[itemIdx];
      p_items[itemIdx].player.play_status = p_PlayStatusValues[itemIdx];
@@ -1415,7 +1418,7 @@ static JNINativeMethod sMethods[] = {
    {"setBrowsedPlayerRspNative", "([BIBI[Ljava/lang/String;)Z",
     (void*)setBrowsedPlayerRspNative},

    {"mediaPlayerListRspNative", "([BIIBI[B[I[B[S[Ljava/lang/String;)Z",
    {"mediaPlayerListRspNative", "([BIIBI[I[B[I[B[S[Ljava/lang/String;)Z",
     (void*)mediaPlayerListRspNative},

    {"getFolderItemsRspNative",
+252 −309

File changed.

Preview size limit exceeded, changes collapsed.

+41 −40
Original line number Diff line number Diff line
@@ -88,22 +88,22 @@ class MediaPlayerListRsp {
    byte mStatus;
    short mUIDCounter;
    byte itemType;
    int[] mPlayerIds;
    byte[] mPlayerTypes;
    int[] mPlayerSubTypes;
    byte[] mPlayStatusValues;
    short[] mFeatureBitMaskValues;
    String[] mPlayerNameList, mPackageNameList;
    List<MediaController> mControllersList;
    String[] mPlayerNameList;
    int mNumItems;

    public MediaPlayerListRsp(byte status, short UIDCounter, int numItems, byte itemType,
            byte[] playerTypes, int[] playerSubTypes, byte[] playStatusValues,
            short[] featureBitMaskValues, String[] playerNameList, String packageNameList[],
            List<MediaController> mediaControllerList) {
            int[] playerIds, byte[] playerTypes, int[] playerSubTypes, byte[] playStatusValues,
            short[] featureBitMaskValues, String[] playerNameList) {
        this.mStatus = status;
        this.mUIDCounter = UIDCounter;
        this.mNumItems = numItems;
        this.itemType = itemType;
        this.mPlayerIds = playerIds;
        this.mPlayerTypes = playerTypes;
        this.mPlayerSubTypes = new int[numItems];
        this.mPlayerSubTypes = playerSubTypes;
@@ -115,8 +115,6 @@ class MediaPlayerListRsp {
            this.mFeatureBitMaskValues[bitMaskIndex] = featureBitMaskValues[bitMaskIndex];
        }
        this.mPlayerNameList = playerNameList;
        this.mPackageNameList = packageNameList;
        this.mControllersList = mediaControllerList;
    }
}

@@ -182,7 +180,6 @@ class NowPlayingListManager {
/* stores information of Media Players in the system */
class MediaPlayerInfo {

    private String packageName;
    private byte majorType;
    private int subType;
    private byte playStatus;
@@ -190,21 +187,15 @@ class MediaPlayerInfo {
    private String displayableName;
    private MediaController mediaController;

    MediaPlayerInfo(String packageName, byte majorType, int subType, byte playStatus,
            short[] featureBitMask, String displayableName, MediaController mediaController) {
        this.setPackageName(packageName);
    MediaPlayerInfo(MediaController controller, byte majorType, int subType, byte playStatus,
            short[] featureBitMask, String displayableName) {
        this.setMajorType(majorType);
        this.setSubType(subType);
        this.playStatus = playStatus;

        // copying the FeatureBitMask array
        this.setFeatureBitMask(new short[featureBitMask.length]);
        for (int count = 0; count < featureBitMask.length; count++) {
            this.getFeatureBitMask()[count] = featureBitMask[count];
        }

        // store a copy the FeatureBitMask array
        this.featureBitMask = Arrays.copyOf(featureBitMask, featureBitMask.length);
        this.setDisplayableName(displayableName);
        this.setMediaController(mediaController);
        this.setMediaController(controller);
    }

    /* getters and setters */
@@ -225,11 +216,7 @@ class MediaPlayerInfo {
    }

    String getPackageName() {
        return packageName;
    }

    void setPackageName(String packageName) {
        this.packageName = packageName;
        return mediaController.getPackageName();
    }

    byte getMajorType() {
@@ -261,24 +248,38 @@ class MediaPlayerInfo {
    }

    void setFeatureBitMask(short[] featureBitMask) {
        this.featureBitMask = featureBitMask;
        synchronized (this) {
            this.featureBitMask = Arrays.copyOf(featureBitMask, featureBitMask.length);
        }
    }

    boolean isBrowseSupported() {
        synchronized (this) {
            if (this.featureBitMask == null) return false;
            for (short bit : this.featureBitMask) {
                if (bit == AvrcpConstants.AVRC_PF_BROWSE_BIT_NO) return true;
            }
        }
        return false;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("\n+++ MediaPlayerInfo: +++");
        sb.append("\nPlayer Package Name = " + getPackageName());
        sb.append("\nMajor Player Type = " + getMajorType());
        sb.append("\nPlayer SubType = " + getSubType());
        sb.append("\nPlay Status = " + playStatus);
        sb.append("\nFeatureBitMask:\n ");
        for (int count = 0; count < getFeatureBitMask().length; count++) {
            sb.append("\nFeature BitMask[" + count + "] = " + getFeatureBitMask()[count]);
        }
        sb.append("\nDisplayable Name = " + getDisplayableName());
        sb.append("\nMedia Controller = " + getMediaController().toString());

        sb.append("MediaPlayerInfo ");
        sb.append(getPackageName());
        sb.append(" (as '" + getDisplayableName() + "')");
        sb.append(" Type = " + getMajorType());
        sb.append(", SubType = " + getSubType());
        sb.append(", Status = " + playStatus);
        sb.append(" Feature Bits [");
        short[] bits = getFeatureBitMask();
        for (int i = 0; i < bits.length; i++) {
            if (i != 0) sb.append(" ");
            sb.append(bits[i]);
        }
        sb.append("] Controller: ");
        sb.append(getMediaController());
        return sb.toString();
    }
}
@@ -298,10 +299,10 @@ class BrowsePlayerInfo {
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("\n+++ BrowsePlayerInfo: +++");
        sb.append("\nPackage Name = " + packageName);
        sb.append("\nDisplayable Name = " + displayableName);
        sb.append("\nService Class = " + serviceClass);
        sb.append("BrowsePlayerInfo ");
        sb.append(packageName);
        sb.append(" ( as '" + displayableName + "')");
        sb.append(" service " + serviceClass);
        return sb.toString();
    }
}