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

Commit e1c47aae authored by Stanley Tng's avatar Stanley Tng Committed by android-build-merger
Browse files

Merge "Make sure Hearing Aids' Connection Intervals is unchanged" am: 7c4487a2

am: 1064d32d

Change-Id: I38625903f477536fb287f3743d903c64f771e369
parents c6b75d38 1064d32d
Loading
Loading
Loading
Loading
+61 −27
Original line number Original line Diff line number Diff line
@@ -119,9 +119,10 @@ HearingAidAudioReceiver* audioReceiver;


/** Possible states for the Connection Update status */
/** Possible states for the Connection Update status */
typedef enum {
typedef enum {
  NONE,      // Connection Update not pending or has completed
  NONE,      // Not Connected
  AWAITING,  // Waiting for start the Connection Update operation
  AWAITING,  // Waiting for start the Connection Update operation
  STARTED    // Connection Update has started
  STARTED,   // Connection Update has started
  COMPLETED  // Connection Update is completed successfully
} connection_update_status_t;
} connection_update_status_t;


struct HearingDevice {
struct HearingDevice {
@@ -459,31 +460,64 @@ class HearingAidImpl : public HearingAid {
    }
    }


    if (p_data) {
    if (p_data) {
      if ((p_data->conn_update.status == 0) &&
      if (p_data->conn_update.status == 0) {
          (hearingDevice->requested_connection_interval !=
        bool same_conn_interval =
           p_data->conn_update.interval)) {
            (hearingDevice->requested_connection_interval ==
        LOG(WARNING) << __func__ << ": Ignored. Different connection interval="
             p_data->conn_update.interval);

        switch (hearingDevice->connection_update_status) {
          case COMPLETED:
            if (!same_conn_interval) {
              LOG(WARNING) << __func__
                           << ": Unexpected change. Redo. connection interval="
                           << p_data->conn_update.interval << ", expected="
                           << p_data->conn_update.interval << ", expected="
                           << hearingDevice->requested_connection_interval
                           << hearingDevice->requested_connection_interval
                     << ", conn_id=" << conn_id;
                           << ", conn_id=" << conn_id
                           << ", connection_update_status="
                           << hearingDevice->connection_update_status;
              // Redo this connection interval change.
              hearingDevice->connection_update_status = AWAITING;
            }
            break;
          case STARTED:
            if (same_conn_interval) {
              LOG(INFO) << __func__
                        << ": Connection update completed. conn_id=" << conn_id
                        << ", device=" << hearingDevice->address;
              hearingDevice->connection_update_status = COMPLETED;
            } else {
              LOG(WARNING) << __func__
                           << ": Ignored. Different connection interval="
                           << p_data->conn_update.interval << ", expected="
                           << hearingDevice->requested_connection_interval
                           << ", conn_id=" << conn_id
                           << ", connection_update_status="
                           << hearingDevice->connection_update_status;
              // Wait for the right Connection Update Completion.
              return;
              return;
            }
            }
      LOG(INFO) << __func__ << ": interval=" << p_data->conn_update.interval
            break;
                << ": status=" << loghex(p_data->conn_update.status)
          case AWAITING:
                << ", conn_id=" << conn_id;
          case NONE:
            break;
        }
        }

      } else {
    if (hearingDevice->connection_update_status != STARTED) {
      // TODO: We may get extra connection updates during service discovery and
      // these updates are not accounted for.
        LOG(INFO) << __func__
        LOG(INFO) << __func__
                << ": Unexpected connection update complete. Expecting "
                  << ": error status=" << loghex(p_data->conn_update.status)
                   "state=STARTED but current="
                << hearingDevice->connection_update_status
                  << ", conn_id=" << conn_id
                  << ", conn_id=" << conn_id
                << ", device=" << hearingDevice->address;
                  << ", device=" << hearingDevice->address
                  << ", connection_update_status="
                  << hearingDevice->connection_update_status;

        if (hearingDevice->connection_update_status == STARTED) {
          // Redo this connection interval change.
          LOG(ERROR) << __func__ << ": Redo Connection Interval change";
          hearingDevice->connection_update_status = AWAITING;
        }
      }
      }
    } else {
      hearingDevice->connection_update_status = NONE;
      hearingDevice->connection_update_status = NONE;
    }


    for (auto& device : hearingDevices.devices) {
    for (auto& device : hearingDevices.devices) {
      if (device.conn_id && (device.connection_update_status == AWAITING)) {
      if (device.conn_id && (device.connection_update_status == AWAITING)) {
@@ -1231,7 +1265,7 @@ class HearingAidImpl : public HearingAid {
  }
  }


  void DoDisconnectCleanUp(HearingDevice* hearingDevice) {
  void DoDisconnectCleanUp(HearingDevice* hearingDevice) {
    if (hearingDevice->connection_update_status != NONE) {
    if (hearingDevice->connection_update_status != COMPLETED) {
      LOG(INFO) << __func__ << ": connection update not completed. Current="
      LOG(INFO) << __func__ << ": connection update not completed. Current="
                << hearingDevice->connection_update_status
                << hearingDevice->connection_update_status
                << ", device=" << hearingDevice->address;
                << ", device=" << hearingDevice->address;
@@ -1239,8 +1273,8 @@ class HearingAidImpl : public HearingAid {
      if (hearingDevice->connection_update_status == STARTED) {
      if (hearingDevice->connection_update_status == STARTED) {
        OnConnectionUpdateComplete(hearingDevice->conn_id, NULL);
        OnConnectionUpdateComplete(hearingDevice->conn_id, NULL);
      }
      }
      hearingDevice->connection_update_status = NONE;
    }
    }
    hearingDevice->connection_update_status = NONE;


    if (hearingDevice->conn_id) {
    if (hearingDevice->conn_id) {
      BtaGattQueue::Clean(hearingDevice->conn_id);
      BtaGattQueue::Clean(hearingDevice->conn_id);