@Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int width;
    int height;

    if (mAction.getVisibility() == View.VISIBLE) {
      mAction.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), heightMeasureSpec);
      int padding = mIsRtl ? mText.getPaddingLeft() : mText.getPaddingRight();
      mText.measure(
          MeasureSpec.makeMeasureSpec(
              widthSize - (mAction.getMeasuredWidth() - padding), widthMode),
          heightMeasureSpec);
      width = mText.getMeasuredWidth() + mAction.getMeasuredWidth() - padding;
    } else {
      mText.measure(MeasureSpec.makeMeasureSpec(widthSize, widthMode), heightMeasureSpec);
      width = mText.getMeasuredWidth();
    }

    height = Math.max(mText.getMeasuredHeight(), mAction.getMeasuredHeight());

    switch (widthMode) {
      case MeasureSpec.AT_MOST:
        width = Math.min(widthSize, width);
        break;
      case MeasureSpec.EXACTLY:
        width = widthSize;
        break;
    }

    switch (heightMode) {
      case MeasureSpec.AT_MOST:
        height = Math.min(heightSize, height);
        break;
      case MeasureSpec.EXACTLY:
        height = heightSize;
        break;
    }

    if (mMaxHeight > 0) height = Math.min(mMaxHeight, height);

    if (mMinHeight > 0) height = Math.max(mMinHeight, height);

    setMeasuredDimension(width, height);
  }
  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int childLeft = getPaddingLeft();
    int childRight = r - l - getPaddingRight();
    int childTop = getPaddingTop();
    int childBottom = b - t - getPaddingBottom();

    if (mAction.getVisibility() == View.VISIBLE) {
      if (mIsRtl) {
        mAction.layout(childLeft, childTop, childLeft + mAction.getMeasuredWidth(), childBottom);
        childLeft += mAction.getMeasuredWidth() - mText.getPaddingLeft();
      } else {
        mAction.layout(childRight - mAction.getMeasuredWidth(), childTop, childRight, childBottom);
        childRight -= mAction.getMeasuredWidth() - mText.getPaddingRight();
      }
    }

    mText.layout(childLeft, childTop, childRight, childBottom);
  }
 /**
  * Set the vertical padding between this SnackBar and it's text and button.
  *
  * @param padding
  * @return This SnackBar for chaining methods.
  */
 public SnackBar verticalPadding(int padding) {
   mText.setPadding(mText.getPaddingLeft(), padding, mText.getPaddingRight(), padding);
   mAction.setPadding(mAction.getPaddingLeft(), padding, mAction.getPaddingRight(), padding);
   return this;
 }