/*package*/
  public ConnectionBase(Context context, DriverCall dc, CallTracker ct, int index) {
    createWakeLock(context);
    acquireWakeLock();

    owner = ct;
    h = new MyHandler(owner.getLooper());

    address = dc.number;

    isIncoming = dc.isMT;
    createTime = System.currentTimeMillis();
    cnapName = dc.name; // TBD if present check
    cnapNamePresentation = dc.namePresentation;
    numberPresentation = dc.numberPresentation;

    if (dc.uusInfo != null) // only for Gsm
    uusInfo = dc.uusInfo;
    if (dc.callDetails != null) callDetails = dc.callDetails;

    if ((callDetails != null) && (callDetails.call_domain == CallDetails.RIL_CALL_DOMAIN_PS)) {
      parent = imsParentFromDCState(dc.state); // parent = call from ImsPhone
    } else {
      parent = parentFromDCState(dc.state); // parent = call from CdmaPhone
    }
    this.index = index;
    if (parent != null) parent.attach(this, dc);
    else {
      Log.e(LOG_TAG, "This ConnectionBase does not have a parent call");
    }
  }
  // Returns true if state has changed, false if nothing changed
  public boolean update(DriverCall dc) {
    Call newParent;
    boolean changed = false;
    boolean wasConnectingInOrOut = isConnectingInOrOut();
    boolean wasHolding = (getState() == Call.State.HOLDING);

    if ((dc.callDetails != null)
        && (dc.callDetails.call_domain == CallDetails.RIL_CALL_DOMAIN_PS)) {
      newParent = imsParentFromDCState(dc.state); // parent = ImsPhone
    } else {
      newParent = parentFromDCState(dc.state); // parent = CdmaPhone
    }

    if (Phone.DEBUG_PHONE) log("parent= " + parent + ", newParent= " + newParent);

    if (!equalsHandlesNulls(address, dc.number)) {
      if (Phone.DEBUG_PHONE) log("update: phone # changed!");
      address = dc.number;
      changed = true;
    }

    // A null cnapName should be the same as ""
    // TBD ensure this is a nop for Gsm
    if (TextUtils.isEmpty(dc.name)) {
      if (!TextUtils.isEmpty(cnapName)) {
        changed = true;
        cnapName = "";
      }
    } else if (!dc.name.equals(cnapName)) {
      changed = true;
      cnapName = dc.name;
    }

    if (Phone.DEBUG_PHONE) log("--dssds----" + cnapName);
    cnapNamePresentation = dc.namePresentation;
    numberPresentation = dc.numberPresentation;

    if (newParent != parent) {
      if (parent != null) {
        parent.detach(this);
      }
      newParent.attach(this, dc);
      parent = newParent;
      changed = true;
    } else {
      boolean parentStateChange;
      parentStateChange = parent.update(this, dc);
      changed = changed || parentStateChange;
    }

    /** Some state-transition events */
    if (Phone.DEBUG_PHONE)
      log(
          "Update, wasConnectingInOrOut="
              + wasConnectingInOrOut
              + ", wasHolding="
              + wasHolding
              + ", isConnectingInOrOut="
              + isConnectingInOrOut()
              + ", changed="
              + changed);

    if (wasConnectingInOrOut && !isConnectingInOrOut()) {
      onConnectedInOrOut();
    }

    if (changed && !wasHolding && (getState() == Call.State.HOLDING)) {
      // We've transitioned into HOLDING
      onStartedHolding(); // TBD
    }

    return changed;
  }