/** @see android.widget.LinearLayout#onMeasure(int, int) */
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int count = getChildCount();
    int maxHeight = 0;
    int maxWidth = 0;
    int childState = 0;

    for (int i = 0; i < count; i++) {
      final View child = getChildAt(i);
      if (child.getVisibility() != GONE) {
        measureChild(child, widthMeasureSpec, heightMeasureSpec);
        maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
        maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
        childState =
            ViewCompat.combineMeasuredStates(childState, ViewCompat.getMeasuredState(child));
      }
    }
    // Check against our minimum height and width
    maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
    maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
    setMeasuredDimension(
        ViewCompat.resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
        ViewCompat.resolveSizeAndState(
            maxHeight, heightMeasureSpec, childState << ViewCompat.MEASURED_HEIGHT_STATE_SHIFT));

    if (count > 1) {
      for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        final LayoutParams lp = child.getLayoutParams();

        final int childWidthMeasureSpec;
        if (lp.width == LayoutParams.MATCH_PARENT) {
          final int width = Math.max(0, getMeasuredWidth());
          childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
        } else {
          childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, lp.width);
        }

        final int childHeightMeasureSpec;
        if (lp.height == LayoutParams.MATCH_PARENT) {
          final int height = Math.max(0, getMeasuredHeight());
          childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        } else {
          childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, 0, lp.height);
        }

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
      }
    }
  }