/**
   * Loads the AdnRecords in efid and returns them as a List of AdnRecords
   *
   * <p>throws SecurityException if no READ_CONTACTS permission
   *
   * @param efid the EF id of a ADN-like ICC
   * @return List of AdnRecord
   */
  public List<AdnRecord> getAdnRecordsInEf(int efid) {

    if (phone.getContext().checkCallingOrSelfPermission(android.Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
      throw new SecurityException("Requires android.permission.READ_CONTACTS permission");
    }

    efid = updateEfForIccType(efid);
    if (DBG) logd("getAdnRecordsInEF: efid=" + efid);

    synchronized (mLock) {
      checkThread();
      Message response = mBaseHandler.obtainMessage(EVENT_LOAD_DONE);
      adnCache.requestLoadAllAdnLike(efid, adnCache.extensionEfForEf(efid), response);
      try {
        mLock.wait();
      } catch (InterruptedException e) {
        logd("interrupted while trying to load from the SIM");
      }
    }
    return records;
  }
  /**
   * Replace oldAdn with newAdn in ADN-like record in EF
   *
   * <p>getAdnRecordsInEf must be called at least once before this function, otherwise an error will
   * be returned. Currently the email field if set in the ADN record is ignored. throws
   * SecurityException if no WRITE_CONTACTS permission
   *
   * @param efid must be one among EF_ADN, EF_FDN, and EF_SDN
   * @param oldTag adn tag to be replaced
   * @param oldPhoneNumber adn number to be replaced Set both oldTag and oldPhoneNubmer to "" means
   *     to replace an empty record, aka, insert new record
   * @param newTag adn tag to be stored
   * @param newPhoneNumber adn number ot be stored Set both newTag and newPhoneNubmer to "" means to
   *     replace the old record with empty one, aka, delete old record
   * @param pin2 required to update EF_FDN, otherwise must be null
   * @return true for success
   */
  public boolean updateAdnRecordsInEfBySearch(
      int efid,
      String oldTag,
      String oldPhoneNumber,
      String newTag,
      String newPhoneNumber,
      String pin2) {

    if (phone.getContext().checkCallingOrSelfPermission(android.Manifest.permission.WRITE_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
      throw new SecurityException("Requires android.permission.WRITE_CONTACTS permission");
    }

    if (DBG)
      logd(
          "updateAdnRecordsInEfBySearch: efid="
              + efid
              + " ("
              + oldTag
              + ","
              + oldPhoneNumber
              + ")"
              + "==>"
              + " ("
              + newTag
              + ","
              + newPhoneNumber
              + ")"
              + " pin2="
              + pin2);

    efid = updateEfForIccType(efid);

    synchronized (mLock) {
      checkThread();
      success = false;
      Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE);
      AdnRecord oldAdn = new AdnRecord(oldTag, oldPhoneNumber);
      AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber);
      adnCache.updateAdnBySearch(efid, oldAdn, newAdn, pin2, response);
      try {
        mLock.wait();
      } catch (InterruptedException e) {
        logd("interrupted while trying to update by search");
      }
    }
    return success;
  }