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

Commit 48d8e1e1 authored by Sal Savage's avatar Sal Savage Committed by Gerrit Code Review
Browse files

Merge changes from topic "avrcp-target-cover-art"

* changes:
  Add tests for the AVRCP Target Cover Art feature
  Add the AVRCP Target 1.6 cover art feature
  Get the AVRCP Version that the user has requested
  Add image member to Metadata object
  Add BIP Client status setting API to JNI interface
  Add the BIP Server registration API to the JNI interface
  Create a builder for audio_util Metadata and migrate off bundles
parents 242fb942 51536a87
Loading
Loading
Loading
Loading
+73 −0
Original line number Diff line number Diff line
@@ -225,6 +225,27 @@ static void initNative(JNIEnv* env, jobject object) {
  sServiceInterface->Init(&mAvrcpInterface, &mVolumeInterface);
}

static void registerBipServerNative(JNIEnv* env, jobject object,
                                    jint l2cap_psm) {
  ALOGD("%s: l2cap_psm=%d", __func__, (int)l2cap_psm);
  std::unique_lock<std::shared_timed_mutex> interface_lock(interface_mutex);
  if (sServiceInterface == nullptr) {
    ALOGW("%s: Service not loaded.", __func__);
    return;
  }
  sServiceInterface->RegisterBipServer((int)l2cap_psm);
}

static void unregisterBipServerNative(JNIEnv* env, jobject object) {
  ALOGD("%s", __func__);
  std::unique_lock<std::shared_timed_mutex> interface_lock(interface_mutex);
  if (sServiceInterface == nullptr) {
    ALOGW("%s: Service not loaded.", __func__);
    return;
  }
  sServiceInterface->UnregisterBipServer();
}

static void sendMediaUpdateNative(JNIEnv* env, jobject object,
                                  jboolean metadata, jboolean state,
                                  jboolean queue) {
@@ -316,6 +337,26 @@ static void sendMediaKeyEvent(int key, KeyState state) {
      state == KeyState::PUSHED ? JNI_TRUE : JNI_FALSE);
}

static std::string getImageHandleFromJavaObj(JNIEnv* env, jobject image) {
  std::string handle;

  if (image == nullptr) return handle;

  jclass class_image = env->GetObjectClass(image);
  jmethodID method_getImageHandle =
      env->GetMethodID(class_image, "getImageHandle", "()Ljava/lang/String;");
  jstring imageHandle = (jstring) env->CallObjectMethod(
      image, method_getImageHandle);
  if (imageHandle == nullptr) {
    return handle;
  }

  const char* value = env->GetStringUTFChars(imageHandle, nullptr);
  handle = std::string(value);
  env->ReleaseStringUTFChars(imageHandle, value);
  return handle;
}

static SongInfo getSongInfoFromJavaObj(JNIEnv* env, jobject metadata) {
  SongInfo info;

@@ -338,6 +379,8 @@ static SongInfo getSongInfoFromJavaObj(JNIEnv* env, jobject metadata) {
      env->GetFieldID(class_metadata, "genre", "Ljava/lang/String;");
  jfieldID field_playingTime =
      env->GetFieldID(class_metadata, "duration", "Ljava/lang/String;");
  jfieldID field_image =
      env->GetFieldID(class_metadata, "image", "Lcom/android/bluetooth/audio_util/Image;");

  jstring jstr = (jstring)env->GetObjectField(metadata, field_mediaId);
  if (jstr != nullptr) {
@@ -410,6 +453,13 @@ static SongInfo getSongInfoFromJavaObj(JNIEnv* env, jobject metadata) {
    env->DeleteLocalRef(jstr);
  }

  jobject object_image = env->GetObjectField(metadata, field_image);
  std::string imageHandle = getImageHandleFromJavaObj(env, object_image);
  if (!imageHandle.empty()) {
    info.attributes.insert(
        AttributeEntry(Attribute::DEFAULT_COVER_ART, imageHandle));
  }

  return info;
}

@@ -808,9 +858,30 @@ static void setVolume(int8_t volume) {
  sCallbackEnv->CallVoidMethod(mJavaInterface, method_setVolume, volume);
}

static void setBipClientStatusNative(JNIEnv* env, jobject object,
                                    jstring address, jboolean connected) {
  std::unique_lock<std::shared_timed_mutex> interface_lock(interface_mutex);
  if (mServiceCallbacks == nullptr) {
    ALOGW("%s: Service not loaded.", __func__);
    return;
  }

  const char* tmp_addr = env->GetStringUTFChars(address, 0);
  RawAddress bdaddr;
  bool success = RawAddress::FromString(tmp_addr, bdaddr);
  env->ReleaseStringUTFChars(address, tmp_addr);

  if (!success) return;

  bool status = (connected == JNI_TRUE);
  sServiceInterface->SetBipClientStatus(bdaddr, status);
}

static JNINativeMethod sMethods[] = {
    {"classInitNative", "()V", (void*)classInitNative},
    {"initNative", "()V", (void*)initNative},
    {"registerBipServerNative", "(I)V", (void*)registerBipServerNative},
    {"unregisterBipServerNative", "()V", (void*)unregisterBipServerNative},
    {"sendMediaUpdateNative", "(ZZZ)V", (void*)sendMediaUpdateNative},
    {"sendFolderUpdateNative", "(ZZZ)V", (void*)sendFolderUpdateNative},
    {"setBrowsedPlayerResponseNative", "(IZLjava/lang/String;I)V",
@@ -824,6 +895,8 @@ static JNINativeMethod sMethods[] = {
     (void*)disconnectDeviceNative},
    {"sendVolumeChangedNative", "(Ljava/lang/String;I)V",
     (void*)sendVolumeChangedNative},
    {"setBipClientStatusNative", "(Ljava/lang/String;Z)V",
     (void*)setBipClientStatusNative},
};

int register_com_android_bluetooth_avrcp_target(JNIEnv* env) {
+3 −0
Original line number Diff line number Diff line
@@ -102,6 +102,9 @@
    <integer name="a2dp_source_codec_priority_aptx_hd">4001</integer>
    <integer name="a2dp_source_codec_priority_ldac">5001</integer>

    <!-- For enabling the AVRCP Target Cover Artowrk feature-->
    <bool name="avrcp_target_enable_cover_art">false</bool>

    <!-- Package that is responsible for user interaction on pairing request,
         success or cancel.
         Receives:
+1 −1
Original line number Diff line number Diff line
@@ -429,7 +429,7 @@ class BrowsedPlayerWrapper {
                    Folder f = new Folder(item.getMediaId(), false, title);
                    return_list.add(new ListItem(f));
                } else {
                    return_list.add(new ListItem(Util.toMetadata(item)));
                    return_list.add(new ListItem(Util.toMetadata(mContext, item)));
                }
            }

+5 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.bluetooth.audio_util;

import android.content.Context;
import android.media.session.MediaSession;
import android.os.Looper;
import android.util.Log;
@@ -29,8 +30,8 @@ class GPMWrapper extends MediaPlayerWrapper {
    private static final String TAG = "AvrcpGPMWrapper";
    private static final boolean DEBUG = true;

    GPMWrapper(MediaController controller, Looper looper) {
        super(controller, looper);
    GPMWrapper(Context context, MediaController controller, Looper looper) {
        super(context, controller, looper);
    }

    @Override
@@ -50,8 +51,8 @@ class GPMWrapper extends MediaPlayerWrapper {
        }

        // Check if current playing song in Queue matches current Metadata
        Metadata qitem = Util.toMetadata(currItem);
        Metadata mdata = Util.toMetadata(getMetadata());
        Metadata qitem = Util.toMetadata(mContext, currItem);
        Metadata mdata = Util.toMetadata(mContext, getMetadata());
        if (currItem == null || !qitem.equals(mdata)) {
            if (DEBUG) {
                Log.d(TAG, "Metadata currently out of sync for Google Play Music");
+1 −0
Original line number Diff line number Diff line
@@ -503,6 +503,7 @@ public class MediaPlayerList {
        }

        MediaPlayerWrapper newPlayer = MediaPlayerWrapperFactory.wrap(
                mContext,
                controller,
                mLooper);

Loading