/**
   * Prepare this editor using the given {@link DataKind} for defining structure and {@link
   * ValuesDelta} describing the content to edit.
   */
  @Override
  public void setValues(
      DataKind kind,
      ValuesDelta entry,
      RawContactDelta state,
      boolean readOnly,
      ViewIdGenerator vig) {
    mKind = kind;
    mEntry = entry;
    mState = state;
    mReadOnly = readOnly;
    mViewIdGenerator = vig;
    setId(vig.getId(state, kind, entry, ViewIdGenerator.NO_VIEW_INDEX));

    if (!entry.isVisible()) {
      // Hide ourselves entirely if deleted
      setVisibility(View.GONE);
      return;
    }
    setVisibility(View.VISIBLE);

    // Display label selector if multiple types available
    final boolean hasTypes = RawContactModifier.hasEditTypes(kind);
    setupLabelButton(hasTypes);
    mLabel.setEnabled(!readOnly && isEnabled());
    if (hasTypes) {
      mType = RawContactModifier.getCurrentType(entry, kind);
      rebuildLabel();
    }
  }
  public int getMimeEntriesCount(String mimeType, boolean onlyVisible) {
    final ArrayList<ValuesDelta> mimeEntries = getMimeEntries(mimeType);
    if (mimeEntries == null) return 0;

    int count = 0;
    for (ValuesDelta child : mimeEntries) {
      // Skip deleted items when requesting only visible
      if (onlyVisible && !child.isVisible()) continue;
      count++;
    }
    return count;
  }
  /** Build editors for all current {@link #mState} rows. */
  public void rebuildFromState() {
    // Remove any existing editors
    mEditors.removeAllViews();

    // Check if we are displaying anything here
    boolean hasEntries = mState.hasMimeEntries(mKind.mimeType);

    if (hasEntries) {
      for (ValuesDelta entry : mState.getMimeEntries(mKind.mimeType)) {
        // Skip entries that aren't visible
        if (!entry.isVisible()) continue;
        if (isEmptyNoop(entry)) continue;

        createEditorView(entry);
      }
    }
  }