// Signature format: 4.0
package androidx.wear.tiles.material {

  public class Button implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
    method public androidx.wear.tiles.ActionBuilders.Action getAction();
    method public androidx.wear.tiles.material.ButtonColors getButtonColors();
    method public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent();
    method public String getContentDescription();
    method public androidx.wear.tiles.DimensionBuilders.ContainerDimension getSize();
  }

  public static final class Button.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
    ctor public Button.Builder(androidx.wear.tiles.ActionBuilders.Action, String);
    method public androidx.wear.tiles.material.Button build();
    method public androidx.wear.tiles.material.Button.Builder setButtonColors(androidx.wear.tiles.material.ButtonColors);
    method public androidx.wear.tiles.material.Button.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
    method public androidx.wear.tiles.material.Button.Builder setContentDescription(String);
    method public androidx.wear.tiles.material.Button.Builder setIconContent(String, androidx.wear.tiles.DimensionBuilders.DpProp);
    method public androidx.wear.tiles.material.Button.Builder setIconContent(String);
    method public androidx.wear.tiles.material.Button.Builder setImageContent(String);
    method public androidx.wear.tiles.material.Button.Builder setSize(androidx.wear.tiles.DimensionBuilders.DpProp);
    method public androidx.wear.tiles.material.Button.Builder setSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
    method public androidx.wear.tiles.material.Button.Builder setTextContent(String, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
    method public androidx.wear.tiles.material.Button.Builder setTextContent(String, androidx.wear.tiles.LayoutElementBuilders.FontStyle);
  }

  public class ButtonColors {
    ctor public ButtonColors(@ColorInt int, @ColorInt int);
    ctor public ButtonColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
    method public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor();
    method public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor();
  }

  public class ButtonDefaults {
    method public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(androidx.wear.tiles.DimensionBuilders.DpProp);
    method public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(@Dimension(unit=androidx.annotation.Dimension.DP) float);
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_BUTTON_SIZE;
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp EXTRA_LARGE_BUTTON_SIZE;
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp LARGE_BUTTON_SIZE;
    field public static final androidx.wear.tiles.material.ButtonColors PRIMARY_BUTTON_COLORS;
    field public static final androidx.wear.tiles.material.ButtonColors SECONDARY_BUTTON_COLORS;
  }

  public class Chip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
    method public androidx.wear.tiles.ActionBuilders.Action getAction();
    method public androidx.wear.tiles.material.ChipColors getChipColors();
    method public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent();
    method public String getContentDescription();
    method public androidx.wear.tiles.DimensionBuilders.ContainerDimension getHeight();
    method public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth();
  }

  public static final class Chip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
    ctor public Chip.Builder(androidx.wear.tiles.ActionBuilders.Action, String, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
    method public androidx.wear.tiles.material.Chip build();
    method public androidx.wear.tiles.material.Chip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
    method public androidx.wear.tiles.material.Chip.Builder setContent(androidx.wear.tiles.LayoutElementBuilders.LayoutElement);
    method public androidx.wear.tiles.material.Chip.Builder setContentDescription(String);
    method public androidx.wear.tiles.material.Chip.Builder setLeftAlign(boolean);
    method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextContent(String);
    method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextIconContent(String, String);
    method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelContent(String, String);
    method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelIconContent(String, String, String);
    method public androidx.wear.tiles.material.Chip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
    method public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) int);
  }

  public class ChipColors {
    ctor public ChipColors(@ColorInt int, @ColorInt int, @ColorInt int, @ColorInt int);
    ctor public ChipColors(@ColorInt int, @ColorInt int);
    ctor public ChipColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
    ctor public ChipColors(androidx.wear.tiles.ColorBuilders.ColorProp, androidx.wear.tiles.ColorBuilders.ColorProp);
    method public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor();
    method public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor();
    method public androidx.wear.tiles.ColorBuilders.ColorProp getIconTintColor();
    method public androidx.wear.tiles.ColorBuilders.ColorProp getSecondaryContentColor();
  }

  public class ChipDefaults {
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp COMPACT_HORIZONTAL_PADDING;
    field public static final androidx.wear.tiles.material.ChipColors COMPACT_PRIMARY;
    field public static final androidx.wear.tiles.material.ChipColors COMPACT_SECONDARY;
    field public static final float DEFAULT_MARGIN_PERCENT = 5.2f;
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp HORIZONTAL_PADDING;
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp ICON_SIZE;
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp LARGE_HEIGHT;
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp LARGE_HORIZONTAL_PADDING;
    field public static final androidx.wear.tiles.material.ChipColors LARGE_PRIMARY;
    field public static final androidx.wear.tiles.material.ChipColors LARGE_SECONDARY;
    field public static final androidx.wear.tiles.material.ChipColors PRIMARY;
    field public static final androidx.wear.tiles.material.ChipColors SECONDARY;
    field public static final androidx.wear.tiles.DimensionBuilders.DpProp VERTICAL_PADDING;
  }

  public class Colors {
    field @ColorInt public static final int ON_PRIMARY = -14671580; // 0xff202124
    field @ColorInt public static final int ON_SURFACE = -1; // 0xffffffff
    field @ColorInt public static final int PRIMARY = -5321734; // 0xffaecbfa
    field @ColorInt public static final int SURFACE = -14671580; // 0xff202124
  }

  public class CompactChip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
    method public androidx.wear.tiles.ActionBuilders.Action getAction();
    method public androidx.wear.tiles.material.ChipColors getChipColors();
    method public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent();
    method public String getContentDescription();
    method public androidx.wear.tiles.DimensionBuilders.ContainerDimension getHeight();
    method public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth();
  }

  public static final class CompactChip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
    ctor public CompactChip.Builder(String, androidx.wear.tiles.ActionBuilders.Action, String, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
    method public androidx.wear.tiles.material.CompactChip build();
    method public androidx.wear.tiles.material.CompactChip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
  }

  public class TitleChip implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
    method public androidx.wear.tiles.ActionBuilders.Action getAction();
    method public androidx.wear.tiles.material.ChipColors getChipColors();
    method public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent();
    method public String getContentDescription();
    method public androidx.wear.tiles.DimensionBuilders.ContainerDimension getHeight();
    method public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth();
  }

  public static final class TitleChip.Builder implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
    ctor public TitleChip.Builder(String, androidx.wear.tiles.ActionBuilders.Action, String, androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters);
    method public androidx.wear.tiles.material.TitleChip build();
    method public androidx.wear.tiles.material.TitleChip.Builder setChipColors(androidx.wear.tiles.material.ChipColors);
    method public androidx.wear.tiles.material.TitleChip.Builder setLeftAlign(boolean);
    method public androidx.wear.tiles.material.TitleChip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
    method public androidx.wear.tiles.material.TitleChip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) int);
  }

}

