// Signature format: 3.0
package androidx.ui.foundation {

  public final class AdapterListKt {
    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
  }

  public final class Border {
    ctor public Border(androidx.ui.unit.Dp size, androidx.ui.graphics.Brush brush);
    method public androidx.ui.unit.Dp component1();
    method public androidx.ui.graphics.Brush component2();
    method public androidx.ui.foundation.Border copy(androidx.ui.unit.Dp size, androidx.ui.graphics.Brush brush);
    method public androidx.ui.graphics.Brush getBrush();
    method public androidx.ui.unit.Dp getSize();
  }

  public final class BorderKt {
    method public static androidx.ui.foundation.Border Border(androidx.ui.unit.Dp size, androidx.ui.graphics.Color color);
  }

  public final class BoxKt {
    method public static void Box(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
    @null var var4119045e: androidx.ui.unit.Dp = border?.size
    if (var4119045e != null) var4119045e else 0.dp
}, androidx.ui.unit.Dp paddingLeft = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingRight = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class CanvasKt {
    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.CanvasScope,kotlin.Unit> onCanvas);
  }

  public interface CanvasScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
    method public androidx.ui.unit.PxSize getSize();
    property public abstract androidx.ui.unit.PxSize size;
  }

  public final class ClickableKt {
    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, String? onClickLabel = null, boolean consumeDownOnStart = false, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ColoredRectKt {
    method public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
    method public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
  }

  public final class ContentColorKt {
    method public static void ProvideContentColor(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static androidx.ui.graphics.Color contentColor();
  }

  public final class DarkThemeKt {
    method public static boolean isSystemInDarkTheme();
  }

  public final class DeterminateProgressIndicatorKt {
    method public static void DeterminateProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class DialogKt {
    method public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onCloseRequest, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class DrawBackground implements androidx.ui.core.DrawModifier {
    method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
  }

  public final class DrawBackgroundKt {
    method public static androidx.ui.foundation.DrawBackground DrawBackground(androidx.ui.graphics.Color color, androidx.ui.graphics.Shape shape = RectangleShape);
    method public static androidx.ui.foundation.DrawBackground DrawBackground(androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = RectangleShape);
  }

  public final class DrawBorder implements androidx.ui.core.DrawModifier {
    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
  }

  public final class DrawBorderKt {
    method public static androidx.ui.foundation.DrawBorder DrawBorder(androidx.ui.foundation.Border border, androidx.ui.graphics.Shape shape = RectangleShape);
    method public static androidx.ui.foundation.DrawBorder DrawBorder(androidx.ui.unit.Dp size, androidx.ui.graphics.Color color, androidx.ui.graphics.Shape shape = RectangleShape);
    method public static androidx.ui.foundation.DrawBorder DrawBorder(androidx.ui.unit.Dp size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
  }

  public final class DrawBordersReceiver {
    method public void all(androidx.ui.foundation.Border border = defaultBorder);
    method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
    method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
    method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
    method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
    method public void left(androidx.ui.foundation.Border border = defaultBorder);
    method public void outer(androidx.ui.foundation.Border border = defaultBorder);
    method public void right(androidx.ui.foundation.Border border = defaultBorder);
    method public void top(androidx.ui.foundation.Border border = defaultBorder);
    method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
  }

  public final class ImageKt {
    method public static void DrawImage(androidx.ui.graphics.Image image, androidx.ui.graphics.Color? tint = null);
    method public static void SimpleImage(androidx.ui.graphics.Image image, androidx.ui.graphics.Color? tint = null);
  }

  public final class ScrollerKt {
    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
    method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
  }

  public final class ScrollerPosition {
    ctor public ScrollerPosition(androidx.ui.foundation.animation.FlingConfig flingConfig, float initial, androidx.animation.AnimationClockObservable animationClock);
    method public float getMaxPosition();
    method public float getValue();
    method public boolean isAnimating();
    method public void scrollBy(float value);
    method public void scrollTo(float value);
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void smoothScrollTo(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    property public final boolean isAnimating;
    property public final float maxPosition;
    property public final float value;
  }

  public final class Strings {
    method public String getChecked();
    method public String getIndeterminate();
    method public String getNotSelected();
    method public String getSelected();
    method public String getUnchecked();
    property public final String Checked;
    property public final String Indeterminate;
    property public final String NotSelected;
    property public final String Selected;
    property public final String Unchecked;
    field public static final androidx.ui.foundation.Strings! INSTANCE;
  }

  public final class TableBordersKt {
    method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
  }

}

package androidx.ui.foundation.animation {

  public final class AndroidFlingCalculator {
    ctor public AndroidFlingCalculator(androidx.ui.unit.Density density);
    method public float flingDistance(float velocity);
    method public long flingDuration(float velocity);
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo flingInfo(float velocity);
    method public androidx.ui.unit.Density getDensity();
  }

  public static final class AndroidFlingCalculator.FlingInfo {
    ctor public AndroidFlingCalculator.FlingInfo(float initialVelocity, float distance, long duration);
    method public float component1();
    method public float component2();
    method public long component3();
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo copy(float initialVelocity, float distance, long duration);
    method public float getDistance();
    method public long getDuration();
    method public float getInitialVelocity();
    method public float position(long time);
    method public float velocity(long time);
  }

  public final class AndroidFlingCalculatorKt {
  }

  public final class AndroidFlingDecayAnimation implements androidx.animation.DecayAnimation {
    ctor public AndroidFlingDecayAnimation(androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator);
    method public float getAbsVelocityThreshold();
    method public androidx.ui.foundation.animation.AndroidFlingCalculator getFlingCalculator();
    method public float getTarget(float start, float startVelocity);
    method public float getValue(long playTime, float start, float startVelocity);
    method public float getVelocity(long playTime, float start, float startVelocity);
    method public boolean isFinished(long playTime, float start, float startVelocity);
    property public float absVelocityThreshold;
    property public final androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator;
  }

  public final class AndroidFlingSpline {
    method public double deceleration(float velocity, float friction);
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult flingPosition(float time);
    field public static final androidx.ui.foundation.animation.AndroidFlingSpline! INSTANCE;
  }

  public static final class AndroidFlingSpline.FlingResult {
    ctor public AndroidFlingSpline.FlingResult(float distanceCoefficient, float velocityCoefficient);
    method public float component1();
    method public float component2();
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult copy(float distanceCoefficient, float velocityCoefficient);
    method public float getDistanceCoefficient();
    method public float getVelocityCoefficient();
  }

  public final class AndroidFlingSplineKt {
  }

  public final class FlingConfig {
    ctor public FlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public androidx.animation.DecayAnimation component1();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? component2();
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
    method public androidx.ui.foundation.animation.FlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
    method public androidx.animation.DecayAnimation getDecayAnimation();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? getOnAnimationEnd();
  }

  public final class FlingConfigKt {
    method public static androidx.ui.foundation.animation.FlingConfig AnchorsFlingConfig(java.util.List<java.lang.Float> anchors, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder = androidx.animation.PhysicsBuilder(), kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, androidx.animation.DecayAnimation decayAnimation = androidx.animation.ExponentialDecay());
    method public static androidx.ui.foundation.animation.FlingConfig FlingConfig(kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget = { null });
    method public static void fling(androidx.animation.AnimatedFloat, androidx.ui.foundation.animation.FlingConfig config, float startVelocity);
  }

}

package androidx.ui.foundation.gestures {

  public abstract sealed class DragDirection {
  }

  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
  }

  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
  }

  public interface DragValueController {
    method public float getCurrentValue();
    method public void onDrag(float target);
    method public void onDragEnd(float velocity, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueSettled);
    method public void setBounds(float min, float max);
    property public abstract float currentValue;
  }

  public final class DraggableKt {
    method public static void Draggable(androidx.ui.foundation.gestures.DragDirection dragDirection, androidx.animation.AnimatedFloat dragValue, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDragValueChangeRequested, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDragStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDragStopped = {}, boolean enabled = true, boolean isValueAnimating = false, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class FloatDragValueController implements androidx.ui.foundation.gestures.DragValueController {
    ctor public FloatDragValueController(float initialValue);
    method public float getCurrentValue();
    method public void onDrag(float target);
    method public void onDragEnd(float velocity, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueSettled);
    method public void setBounds(float min, float max);
    property public float currentValue;
  }

  public final class ScrollableKt {
    method public static void Scrollable(androidx.ui.foundation.gestures.DragDirection dragDirection, androidx.ui.foundation.gestures.ScrollableState scrollableState, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onScrollStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onScrollStopped = {}, boolean enabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static androidx.ui.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested);
  }

  public final class ScrollableState {
    ctor public ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested, androidx.ui.foundation.animation.FlingConfig flingConfig, androidx.animation.AnimationClockObservable animationClock);
    method public androidx.ui.foundation.animation.FlingConfig getFlingConfig();
    method public kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Float> getOnScrollDeltaConsumptionRequested();
    method public boolean isAnimating();
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void stopAnimation();
    property public final boolean isAnimating;
  }

}

package androidx.ui.foundation.selection {

  public final class MutuallyExclusiveSetItemKt {
    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ToggleableKt {
    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onValueChange = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState value = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit>? onToggle = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public enum ToggleableState {
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Indeterminate;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Off;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState On;
  }

}

package androidx.ui.foundation.semantics {

  public final class FoundationSemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getInMutuallyExclusiveGroup();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> getToggleableState();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> InMutuallyExclusiveGroup;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> ToggleableState;
    field public static final androidx.ui.foundation.semantics.FoundationSemanticsProperties! INSTANCE;
  }

  public final class FoundationSemanticsPropertiesKt {
    method public static boolean getInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getSelected(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.foundation.selection.ToggleableState getToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void setInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setSelected(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.foundation.selection.ToggleableState p);
  }

}

package androidx.ui.foundation.shape {

  public final class DrawShapeKt {
    method public static void DrawShape(androidx.ui.graphics.Shape shape, androidx.ui.graphics.Color color);
    method public static void DrawShape(androidx.ui.graphics.Shape shape, androidx.ui.graphics.Brush brush);
  }

  public final class GenericShape implements androidx.ui.graphics.Shape {
    ctor public GenericShape(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.unit.PxSize,kotlin.Unit> builder);
    method public androidx.ui.foundation.shape.GenericShape copy(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.unit.PxSize,kotlin.Unit> builder);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
  }

  public final class RectangleShapeKt {
    method public static androidx.ui.graphics.Shape getRectangleShape();
  }

}

package androidx.ui.foundation.shape.corner {

  public abstract class CornerBasedShape implements androidx.ui.graphics.Shape {
    ctor public CornerBasedShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public final androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
    method public abstract androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Px topLeft, androidx.ui.unit.Px topRight, androidx.ui.unit.Px bottomRight, androidx.ui.unit.Px bottomLeft);
  }

  public interface CornerSize {
    method public androidx.ui.unit.Px toPx(androidx.ui.unit.PxSize shapeSize, androidx.ui.unit.Density density);
  }

  public final class CornerSizeKt {
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(androidx.ui.unit.Dp size);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(androidx.ui.unit.Px size);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(@IntRange(from=0, to=50) int percent);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(@FloatRange(from=0.0, to=50.0) float percent);
    method public static androidx.ui.foundation.shape.corner.CornerSize getZeroCornerSize();
  }

  public final class CutCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.CornerSize component1();
    method public androidx.ui.foundation.shape.corner.CornerSize component2();
    method public androidx.ui.foundation.shape.corner.CornerSize component3();
    method public androidx.ui.foundation.shape.corner.CornerSize component4();
    method public androidx.ui.foundation.shape.corner.CutCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline.Generic createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Px topLeft, androidx.ui.unit.Px topRight, androidx.ui.unit.Px bottomRight, androidx.ui.unit.Px bottomLeft);
    method public androidx.ui.foundation.shape.corner.CornerSize getBottomLeft();
    method public androidx.ui.foundation.shape.corner.CornerSize getBottomRight();
    method public androidx.ui.foundation.shape.corner.CornerSize getTopLeft();
    method public androidx.ui.foundation.shape.corner.CornerSize getTopRight();
  }

  public final class CutCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.unit.Dp size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.unit.Px size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.unit.Dp topLeft = 0.dp, androidx.ui.unit.Dp topRight = 0.dp, androidx.ui.unit.Dp bottomRight = 0.dp, androidx.ui.unit.Dp bottomLeft = 0.dp);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.unit.Px topLeft = 0.px, androidx.ui.unit.Px topRight = 0.px, androidx.ui.unit.Px bottomRight = 0.px, androidx.ui.unit.Px bottomLeft = 0.px);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
  }

  public final class RoundedCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.CornerSize component1();
    method public androidx.ui.foundation.shape.corner.CornerSize component2();
    method public androidx.ui.foundation.shape.corner.CornerSize component3();
    method public androidx.ui.foundation.shape.corner.CornerSize component4();
    method public androidx.ui.foundation.shape.corner.RoundedCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline.Rounded createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Px topLeft, androidx.ui.unit.Px topRight, androidx.ui.unit.Px bottomRight, androidx.ui.unit.Px bottomLeft);
    method public androidx.ui.foundation.shape.corner.CornerSize getBottomLeft();
    method public androidx.ui.foundation.shape.corner.CornerSize getBottomRight();
    method public androidx.ui.foundation.shape.corner.CornerSize getTopLeft();
    method public androidx.ui.foundation.shape.corner.CornerSize getTopRight();
  }

  public final class RoundedCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.unit.Dp size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.unit.Px size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.unit.Dp topLeft = 0.dp, androidx.ui.unit.Dp topRight = 0.dp, androidx.ui.unit.Dp bottomRight = 0.dp, androidx.ui.unit.Dp bottomLeft = 0.dp);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.unit.Px topLeft = 0.px, androidx.ui.unit.Px topRight = 0.px, androidx.ui.unit.Px bottomRight = 0.px, androidx.ui.unit.Px bottomLeft = 0.px);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape getCircleShape();
  }

}

