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

Commit ab3212fc authored by William Escande's avatar William Escande
Browse files

AICS: description set/get/onChange implementation

Bug: 372328699
Flag: com.android.bluetooth.flags.aics_api
Test: atest CtsBluetoothTestCases
Change-Id: I2c1eff79008824d6b1ae4c5efc362e9b7e07df4c
parent 8b1e462f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -22,4 +22,5 @@ package android.bluetooth;
 * @hide
 */
oneway interface IAudioInputCallback {
    void onDescriptionChanged(in String description);
}
+7 −0
Original line number Diff line number Diff line
@@ -81,4 +81,11 @@ interface IBluetoothVolumeControl {
    void registerAudioInputControlCallback(in AttributionSource attributionSource, in BluetoothDevice device, int instanceId, in IAudioInputCallback callback);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    void unregisterAudioInputControlCallback(in AttributionSource attributionSource, in BluetoothDevice device, int instanceId, in IAudioInputCallback callback);

    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    String getAudioInputDescription(in AttributionSource attributionSource, in BluetoothDevice device, int instanceId);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    boolean isAudioInputDescriptionWritable(in AttributionSource attributionSource, in BluetoothDevice device, int instanceId);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    boolean setAudioInputDescription(in AttributionSource attributionSource, in BluetoothDevice device, int instanceId, in String description);
}
+7 −6
Original line number Diff line number Diff line
@@ -316,7 +316,7 @@ public:
  }

  void OnExtAudioInDescriptionChanged(const RawAddress& bd_addr, uint8_t ext_input_id,
                                      std::string descr) override {
                                      std::string description, bool is_writable) override {
    log::info("");

    std::shared_lock<std::shared_timed_mutex> lock(callbacks_mutex);
@@ -334,9 +334,10 @@ public:

    sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress),
                                     reinterpret_cast<const jbyte*>(&bd_addr));
    jstring description = sCallbackEnv->NewStringUTF(descr.c_str());
    jstring jdescription = sCallbackEnv->NewStringUTF(description.c_str());
    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExtAudioInDescriptionChanged,
                                 (jint)ext_input_id, description, addr.get());
                                 (jint)ext_input_id, jdescription, (jboolean)is_writable,
                                 addr.get());
  }
};

@@ -777,9 +778,9 @@ static jboolean setExtAudioInDescriptionNative(JNIEnv* env, jobject /* object */
  }

  RawAddress* tmpraw = reinterpret_cast<RawAddress*>(addr);
  sVolumeControlInterface->SetExtAudioInDescription(*tmpraw, ext_input_id, description);
  bool ret = sVolumeControlInterface->SetExtAudioInDescription(*tmpraw, ext_input_id, description);
  env->ReleaseByteArrayElements(address, addr, 0);
  return JNI_TRUE;
  return ret ? JNI_TRUE : JNI_FALSE;
}

static jboolean setExtAudioInGainSettingNative(JNIEnv* env, jobject /* object */,
@@ -911,7 +912,7 @@ int register_com_android_bluetooth_vc(JNIEnv* env) {
          {"onExtAudioInStatusChanged", "(II[B)V", &method_onExtAudioInStatusChanged},
          {"onExtAudioInTypeChanged", "(II[B)V", &method_onExtAudioInTypeChanged},
          {"onExtAudioInGainPropsChanged", "(IIII[B)V", &method_onExtAudioInGainPropsChanged},
          {"onExtAudioInDescriptionChanged", "(ILjava/lang/String;[B)V",
          {"onExtAudioInDescriptionChanged", "(ILjava/lang/String;Z[B)V",
           &method_onExtAudioInDescriptionChanged},
  };
  GET_JAVA_METHODS(env, "com/android/bluetooth/vc/VolumeControlNativeCallback", javaMethods);
+23 −4
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ class VolumeControlInputDescriptor {
        int mGainSettingsMin = 0;

        String mDescription = "";
        boolean mDescriptionIsWritable = false;

        private final RemoteCallbackList<IAudioInputCallback> mCallbacks =
                new RemoteCallbackList<>();
@@ -87,7 +88,6 @@ class VolumeControlInputDescriptor {
            mCallbacks.unregister(callback);
        }

        @SuppressWarnings("UnusedMethod")
        synchronized void broadcast(
                String logAction, RemoteExceptionIgnoringConsumer<IAudioInputCallback> action) {
            final int itemCount = mCallbacks.beginBroadcast();
@@ -131,9 +131,19 @@ class VolumeControlInputDescriptor {
        return mVolumeInputs[id].mStatus;
    }

    void setDescription(int id, String description) {
        if (!isValidId(id)) return;
        mVolumeInputs[id].mDescription = description;
    boolean isDescriptionWritable(int id) {
        if (!isValidId(id)) return false;
        return mVolumeInputs[id].mDescriptionIsWritable;
    }

    boolean setDescription(int id, String description) {
        if (!isValidId(id)) return false;

        if (!mVolumeInputs[id].mDescriptionIsWritable) {
            throw new IllegalStateException("Description is not writable");
        }

        return mNativeInterface.setExtAudioInDescription(mDevice, id, description);
    }

    String getDescription(int id) {
@@ -141,6 +151,15 @@ class VolumeControlInputDescriptor {
        return mVolumeInputs[id].mDescription;
    }

    void onDescriptionChanged(int id, String description, boolean isWritable) {
        if (!isValidId(id)) return;
        Descriptor desc = mVolumeInputs[id];

        desc.mDescription = description;
        desc.mDescriptionIsWritable = isWritable;
        desc.broadcast("onDescriptionChanged", c -> c.onDescriptionChanged(description));
    }

    void setType(int id, int type) {
        if (!isValidId(id)) return;
        mVolumeInputs[id].mType = type;
+6 −2
Original line number Diff line number Diff line
@@ -169,8 +169,12 @@ class VolumeControlNativeCallback {
    }

    @VisibleForTesting
    void onExtAudioInDescriptionChanged(int id, String descr, byte[] address) {
        sendMessageToService(s -> s.onExtAudioInDescriptionChanged(getDevice(address), id, descr));
    void onExtAudioInDescriptionChanged(
            int id, String description, boolean isWritable, byte[] address) {
        sendMessageToService(
                s ->
                        s.onExtAudioInDescriptionChanged(
                                getDevice(address), id, description, isWritable));
    }

    @VisibleForTesting
Loading