private void topIndex(int value) {
   if (topIndex() != value) findSubIndexForColor(value, mColorsTop[value]);
   getArguments().putInt("top_index", value);
 }
  @NonNull
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    if (getArguments() == null || !getArguments().containsKey("builder"))
      throw new IllegalStateException(
          "ColorChooserDialog should be created using its Builder interface.");
    generateColors();

    final int preselectColor = getBuilder().mPreselect;
    if (preselectColor != 0) {
      for (int topIndex = 0; topIndex < mColorsTop.length; topIndex++) {
        if (mColorsTop[topIndex] == preselectColor) {
          topIndex(topIndex);
          if (getBuilder().mAccentMode) {
            subIndex(2);
          } else if (getBuilder().mColorsSub != null) {
            findSubIndexForColor(topIndex, preselectColor);
          } else {
            subIndex(5);
          }
          break;
        }

        if (mColorsSub != null) {
          boolean found = false;
          for (int subIndex = 0; subIndex < mColorsSub[topIndex].length; subIndex++) {
            if (mColorsSub[topIndex][subIndex] == preselectColor) {
              topIndex(topIndex);
              subIndex(subIndex);
              found = true;
              break;
            }
          }
          if (found) break;
        }
      }
    }

    final DisplayMetrics dm = getResources().getDisplayMetrics();
    mCircleSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 56, dm);
    mGrid = new GridView(getContext());
    mGrid.setLayoutParams(
        new ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    mGrid.setColumnWidth(mCircleSize);
    mGrid.setNumColumns(GridView.AUTO_FIT);
    final int eightDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, dm);
    mGrid.setVerticalSpacing(eightDp);
    mGrid.setHorizontalSpacing(eightDp);
    final int sixteenDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, dm);
    mGrid.setPadding(sixteenDp, sixteenDp, sixteenDp, sixteenDp);
    mGrid.setClipToPadding(false);
    mGrid.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
    mGrid.setGravity(Gravity.CENTER);

    Builder builder = getBuilder();
    MaterialDialog dialog =
        new MaterialDialog.Builder(getActivity())
            .title(getTitle())
            .autoDismiss(false)
            .customView(mGrid, false)
            .neutralText(builder.mCancelBtn)
            .positiveText(builder.mDoneBtn)
            .onPositive(
                new MaterialDialog.SingleButtonCallback() {
                  @Override
                  public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                    mCallback.onColorSelection(ColorChooserDialog.this, getSelectedColor());
                    dismiss();
                  }
                })
            .onNeutral(
                new MaterialDialog.SingleButtonCallback() {
                  @Override
                  public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                    if (isInSub()) {
                      dialog.setActionButton(DialogAction.NEUTRAL, getBuilder().mCancelBtn);
                      isInSub(false);
                      invalidate();
                    } else {
                      dialog.cancel();
                    }
                  }
                })
            .showListener(
                new DialogInterface.OnShowListener() {
                  @Override
                  public void onShow(DialogInterface dialog) {
                    invalidateDynamicButtonColors();
                  }
                })
            .build();
    invalidate();
    return dialog;
  }