static Component onCreateLayout()

in litho-widget/src/main/java/com/facebook/litho/widget/CardSpec.java [94:218]


  static Component onCreateLayout(
      ComponentContext c,
      @Prop Component content,
      @Prop(optional = true) @Nullable String cardBackgroundTransitionKey,
      @Prop(optional = true, resType = ResType.COLOR) int cardBackgroundColor,
      @Prop(optional = true) @Nullable DynamicValue<Integer> cardBackgroundColorDv,
      @Prop(optional = true, resType = ResType.COLOR) int clippingColor,
      @Prop(optional = true, resType = ResType.COLOR) int shadowStartColor,
      @Prop(optional = true, resType = ResType.COLOR) int shadowEndColor,
      @Prop(optional = true, resType = ResType.DIMEN_OFFSET) float cornerRadius,
      @Prop(optional = true, resType = ResType.DIMEN_OFFSET) float elevation,
      @Prop(optional = true, resType = ResType.DIMEN_OFFSET) int shadowTopOverride,
      @Prop(optional = true, resType = ResType.DIMEN_OFFSET) int shadowBottomOverride,
      @Prop(optional = true, resType = ResType.DIMEN_OFFSET) float shadowLeftOverride,
      @Prop(optional = true, resType = ResType.DIMEN_OFFSET) float shadowRightOverride,
      @Prop(
              optional = true,
              docString =
                  "[UNPERFORMANT WARNING] if you do not need to render your corners transparently please set to false. It is more expensive to perform rounded corners with transparent\n"
                      + "clipping due to antialiasing operations.\n\n"
                      + "<p>A component that renders a given component into a card border with shadow, and allows for\n"
                      + "transparent corners. With transparencyEnabled(false) {@link * com.facebook.litho.widget.Card} uses imitation clipped corners that\n"
                      + "draw in a solid color to mimic the background. transparencyEnabled(true) is useful if you are\n"
                      + "rendering your pill over a gradient or dynamic background.\n")
          boolean transparencyEnabled,
      @Prop(optional = true) boolean disableClipTopLeft,
      @Prop(optional = true) boolean disableClipTopRight,
      @Prop(optional = true) boolean disableClipBottomLeft,
      @Prop(optional = true) boolean disableClipBottomRight) {

    final Resources resources = c.getResources();

    if (cornerRadius == -1) {
      cornerRadius = pixels(resources, DEFAULT_CORNER_RADIUS_DP);
    }

    if (elevation == -1) {
      elevation = pixels(resources, DEFAULT_SHADOW_SIZE_DP);
    }

    final int shadowTop = shadowTopOverride == -1 ? getShadowTop(elevation) : shadowTopOverride;
    final int shadowBottom =
        shadowBottomOverride == -1 ? getShadowBottom(elevation) : shadowBottomOverride;
    final int shadowLeft =
        shadowLeftOverride == CardShadowDrawable.UNDEFINED
            ? getShadowLeft(elevation)
            : (int) Math.ceil(shadowLeftOverride);
    final int shadowRight =
        shadowRightOverride == CardShadowDrawable.UNDEFINED
            ? getShadowRight(elevation)
            : (int) Math.ceil(shadowRightOverride);

    Column.Builder columnBuilder =
        Column.create(c)
            .marginPx(LEFT, shadowLeft)
            .marginPx(RIGHT, shadowRight)
            .marginPx(TOP, disableClipTopLeft && disableClipTopRight ? 0 : shadowTop)
            .marginPx(BOTTOM, disableClipBottomLeft && disableClipBottomRight ? 0 : shadowBottom);

    if (transparencyEnabled) {
      final int realClippingColor =
          clippingColor == UNSET_CLIPPING ? Color.TRANSPARENT : clippingColor;
      columnBuilder =
          columnBuilder
              .backgroundColor(realClippingColor)
              .child(
                  makeTransparencyEnabledCardClip(
                      c,
                      cardBackgroundColor,
                      cardBackgroundColorDv,
                      realClippingColor,
                      cornerRadius,
                      disableClipTopLeft,
                      disableClipTopRight,
                      disableClipBottomLeft,
                      disableClipBottomRight,
                      cardBackgroundTransitionKey))
              .child(content);
    } else {
      final int realClippingColor = clippingColor == UNSET_CLIPPING ? Color.WHITE : clippingColor;
      columnBuilder =
          columnBuilder
              .child(
                  Column.create(c)
                      .backgroundColor(cardBackgroundColor)
                      .flexGrow(1)
                      .flexShrink(0)
                      .positionType(ABSOLUTE)
                      .positionPx(ALL, 0)
                      .transitionKey(cardBackgroundTransitionKey)
                      .transitionKeyType(Transition.TransitionKeyType.GLOBAL)
                      .build())
              .child(content)
              .child(
                  makeCardClip(
                      c,
                      realClippingColor,
                      cornerRadius,
                      disableClipTopLeft,
                      disableClipTopRight,
                      disableClipBottomLeft,
                      disableClipBottomRight));
    }

    Component.Builder shadow = null;

    if (elevation > 0) {
      CardShadow.Builder cardShadowBuilder =
          CardShadow.create(c)
              .shadowStartColor(shadowStartColor)
              .shadowEndColor(shadowEndColor)
              .cornerRadiusPx(cornerRadius)
              .shadowSizePx(elevation)
              .hideTopShadow(disableClipTopLeft && disableClipTopRight)
              .hideBottomShadow(disableClipBottomLeft && disableClipBottomRight)
              .positionType(ABSOLUTE)
              .positionPx(ALL, 0)
              .shadowLeftSizeOverridePx(shadowLeftOverride)
              .shadowRightSizeOverridePx(shadowRightOverride);

      shadow = cardShadowBuilder;
    }

    return Column.create(c).child(columnBuilder).child(shadow).build();
  }