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

Commit 2c12388a authored by Hansong Zhang's avatar Hansong Zhang
Browse files

Hearing Aid: Keep configuration after disconnect()

After disconnect(), the Hearing Aid service removes the device from the
white list, but retains the configuration. The Java Hearing Aid service
still knows the hiSyncId and capabilities, so it can connect() to
multiple devices at the same time

Bug: 69623109
Test: manual and unit test for Java service
Change-Id: Ic17b9be7e6a0577baecd520680abffbaf0a0dc47
parent 1ee98c25
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -259,8 +259,11 @@ class HearingAidImpl : public HearingAid {
                      uint8_t capabilities, uint16_t codecs,
                      uint16_t audio_control_point_handle,
                      uint16_t volume_handle, uint64_t hiSyncId,
                      uint16_t render_delay, uint16_t preparation_delay) {
    DVLOG(2) << __func__ << " " << address << ", hiSyncId=" << loghex(hiSyncId);
                      uint16_t render_delay, uint16_t preparation_delay,
                      uint16_t is_white_listed) {
    DVLOG(2) << __func__ << " " << address << ", hiSyncId=" << loghex(hiSyncId)
             << ", isWhiteListed=" << is_white_listed;
    if (is_white_listed) {
      hearingDevices.Add(HearingDevice(
          address, psm, capabilities, codecs, audio_control_point_handle,
          volume_handle, hiSyncId, render_delay, preparation_delay));
@@ -272,6 +275,7 @@ class HearingAidImpl : public HearingAid {
      /* add device into BG connection to accept remote initiated connection */
      BTA_GATTC_Open(gatt_if, address, false, GATT_TRANSPORT_LE, false);
      BTA_DmBleStartAutoConn();
    }

    callbacks->OnDeviceAvailable(capabilities, hiSyncId, address);
  }
@@ -1125,14 +1129,15 @@ void HearingAid::AddFromStorage(const RawAddress& address, uint16_t psm,
                                uint16_t audio_control_point_handle,
                                uint16_t volume_handle, uint64_t hiSyncId,
                                uint16_t render_delay,
                                uint16_t preparation_delay) {
                                uint16_t preparation_delay,
                                uint16_t is_white_listed) {
  if (!instance) {
    LOG(ERROR) << "Not initialized yet";
  }

  instance->AddFromStorage(address, psm, capabilities, codecs,
                           audio_control_point_handle, volume_handle, hiSyncId,
                           render_delay, preparation_delay);
                           render_delay, preparation_delay, is_white_listed);
};

void HearingAid::CleanUp() {
+2 −1
Original line number Diff line number Diff line
@@ -46,7 +46,8 @@ class HearingAid {
                             uint8_t capabilities, uint16_t codec,
                             uint16_t audioControlPointHandle,
                             uint16_t volumeHandle, uint64_t hiSyncId,
                             uint16_t render_delay, uint16_t preparation_delay);
                             uint16_t render_delay, uint16_t preparation_delay,
                             uint16_t is_white_listed);

  virtual void Connect(const RawAddress& address) = 0;
  virtual void Disconnect(const RawAddress& address) = 0;
+3 −0
Original line number Diff line number Diff line
@@ -201,6 +201,9 @@ void btif_storage_load_bonded_hearing_aids();
/** Deletes the bonded hearing aid device info from NVRAM */
void btif_storage_remove_hearing_aid(const RawAddress& address);

/** Remove the hearing aid device from white list */
void btif_storage_remove_hearing_aid_white_list(const RawAddress& address);

/*******************************************************************************
 *
 * Function         btif_storage_is_retricted_device
+2 −2
Original line number Diff line number Diff line
@@ -91,8 +91,8 @@ class HearingAidInterfaceImpl
    DVLOG(2) << __func__ << " address: " << address;
    do_in_bta_thread(FROM_HERE, Bind(&HearingAid::Disconnect,
                                     Unretained(HearingAid::Get()), address));
    do_in_jni_thread(FROM_HERE,
                     Bind(&btif_storage_remove_hearing_aid, address));
    do_in_jni_thread(
        FROM_HERE, Bind(&btif_storage_remove_hearing_aid_white_list, address));
  }

  void SetVolume(int8_t volume) override {
+18 −3
Original line number Diff line number Diff line
@@ -1364,6 +1364,7 @@ constexpr char HEARING_AID_VOLUME_HANDLE[] = "HearingAidVolumeHandle";
constexpr char HEARING_AID_SYNC_ID[] = "HearingAidSyncId";
constexpr char HEARING_AID_RENDER_DELAY[] = "HearingAidRenderDelay";
constexpr char HEARING_AID_PREPARATION_DELAY[] = "HearingAidPreparationDelay";
constexpr char HEARING_AID_IS_WHITE_LISTED[] = "HearingAidIsWhiteListed";

void btif_storage_add_hearing_aid(const RawAddress& address, uint16_t psm,
                                  uint8_t capabilities, uint16_t codecs,
@@ -1391,6 +1392,7 @@ void btif_storage_add_hearing_aid(const RawAddress& address, uint16_t psm,
            btif_config_set_int(bdstr, HEARING_AID_RENDER_DELAY, render_delay);
            btif_config_set_int(bdstr, HEARING_AID_PREPARATION_DELAY,
                                preparation_delay);
            btif_config_set_int(bdstr, HEARING_AID_IS_WHITE_LISTED, true);
            btif_config_save();
          },
          address, psm, capabilities, codecs, audio_control_point_handle,
@@ -1446,13 +1448,18 @@ void btif_storage_load_bonded_hearing_aids() {
    if (btif_config_get_int(name, HEARING_AID_PREPARATION_DELAY, &value))
      preparation_delay = value;

    uint16_t is_white_listed = 0;
    if (btif_config_get_int(name, HEARING_AID_IS_WHITE_LISTED, &value))
      is_white_listed = value;

    RawAddress bd_addr;
    RawAddress::FromString(name, bd_addr);
    // add extracted information to BTA Hearing Aid
    do_in_bta_thread(
        FROM_HERE, Bind(&HearingAid::AddFromStorage, bd_addr, psm, capabilities,
                        codecs, audio_control_point_handle, volume_handle,
                        hi_sync_id, render_delay, preparation_delay));
        FROM_HERE,
        Bind(&HearingAid::AddFromStorage, bd_addr, psm, capabilities, codecs,
             audio_control_point_handle, volume_handle, hi_sync_id,
             render_delay, preparation_delay, is_white_listed));
  }
}

@@ -1466,9 +1473,17 @@ void btif_storage_remove_hearing_aid(const RawAddress& address) {
  btif_config_remove(addrstr, HEARING_AID_AUDIO_CONTROL_POINT);
  btif_config_remove(addrstr, HEARING_AID_VOLUME_HANDLE);
  btif_config_remove(addrstr, HEARING_AID_SYNC_ID);
  btif_config_remove(addrstr, HEARING_AID_IS_WHITE_LISTED);
  btif_config_save();
}

/** Remove the hearing aid device from white list */
void btif_storage_remove_hearing_aid_white_list(const RawAddress& address) {
  std::string addrstr = address.ToString();

  btif_config_set_int(addrstr, HEARING_AID_IS_WHITE_LISTED, false);
}

/*******************************************************************************
 *
 * Function         btif_storage_is_restricted_device