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

  public interface Autofill {
    method public void cancelAutofillForNode(androidx.ui.autofill.AutofillNode autofillNode);
    method public void requestAutofillForNode(androidx.ui.autofill.AutofillNode autofillNode);
  }

  public final class AutofillNode {
    ctor public AutofillNode(java.util.List<? extends androidx.ui.autofill.AutofillType> autofillTypes, android.graphics.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
    method public java.util.List<androidx.ui.autofill.AutofillType> component1();
    method public android.graphics.Rect? component2();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? component3();
    method public androidx.ui.autofill.AutofillNode copy(java.util.List<? extends androidx.ui.autofill.AutofillType> autofillTypes, android.graphics.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
    method public java.util.List<androidx.ui.autofill.AutofillType> getAutofillTypes();
    method public android.graphics.Rect? getBoundingBox();
    method public int getId();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? getOnFill();
    method public void setBoundingBox(android.graphics.Rect? p);
    property public final int id;
  }

  public final class AutofillTree {
    ctor public AutofillTree();
    method public java.util.Map<java.lang.Integer,androidx.ui.autofill.AutofillNode> getChildren();
    method public kotlin.Unit? performAutofill(int id, String value);
    method public operator void plusAssign(androidx.ui.autofill.AutofillNode autofillNode);
    property public final java.util.Map<java.lang.Integer,androidx.ui.autofill.AutofillNode> children;
  }

  public enum AutofillType {
    enum_constant public static final androidx.ui.autofill.AutofillType AddressAuxiliaryDetails;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressCountry;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressLocality;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressRegion;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressStreet;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateDay;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateFull;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateMonth;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateYear;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationDate;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationDay;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationMonth;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationYear;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardNumber;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardSecurityCode;
    enum_constant public static final androidx.ui.autofill.AutofillType EmailAddress;
    enum_constant public static final androidx.ui.autofill.AutofillType Gender;
    enum_constant @Deprecated public static final androidx.ui.autofill.AutofillType Name;
    enum_constant public static final androidx.ui.autofill.AutofillType NewPassword;
    enum_constant public static final androidx.ui.autofill.AutofillType NewUsername;
    enum_constant public static final androidx.ui.autofill.AutofillType Password;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonFirstName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonFullName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonLastName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonMiddleInitial;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonMiddleName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonNamePrefix;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonNameSuffix;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneCountryCode;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumber;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumberDevice;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumberNational;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalAddress;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalCode;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalCodeExtended;
    enum_constant public static final androidx.ui.autofill.AutofillType SmsOtpCode;
    enum_constant public static final androidx.ui.autofill.AutofillType Username;
  }

}

package androidx.ui.core {

  public final class Alignment {
    ctor public Alignment(float verticalBias, float horizontalBias);
    method public androidx.ui.unit.IntPxPosition align(androidx.ui.unit.IntPxSize size, androidx.ui.core.LayoutDirection layoutDirection = androidx.ui.core.LayoutDirection.Ltr);
    method public float component1();
    method public float component2();
    method public androidx.ui.core.Alignment copy(float verticalBias, float horizontalBias);
    method public float getHorizontalBias();
    method public float getVerticalBias();
    field public static final androidx.ui.core.Alignment.Companion! Companion;
  }

  public static final class Alignment.Companion {
    method public androidx.ui.core.Alignment.Vertical getBottom();
    method public androidx.ui.core.Alignment getBottomCenter();
    method public androidx.ui.core.Alignment getBottomEnd();
    method public androidx.ui.core.Alignment getBottomStart();
    method public androidx.ui.core.Alignment getCenter();
    method public androidx.ui.core.Alignment getCenterEnd();
    method public androidx.ui.core.Alignment.Horizontal getCenterHorizontally();
    method public androidx.ui.core.Alignment getCenterStart();
    method public androidx.ui.core.Alignment.Vertical getCenterVertically();
    method public androidx.ui.core.Alignment.Horizontal getEnd();
    method public androidx.ui.core.Alignment.Horizontal getStart();
    method public androidx.ui.core.Alignment.Vertical getTop();
    method public androidx.ui.core.Alignment getTopCenter();
    method public androidx.ui.core.Alignment getTopEnd();
    method public androidx.ui.core.Alignment getTopStart();
    property public final androidx.ui.core.Alignment.Vertical Bottom;
    property public final androidx.ui.core.Alignment BottomCenter;
    property public final androidx.ui.core.Alignment BottomEnd;
    property public final androidx.ui.core.Alignment BottomStart;
    property public final androidx.ui.core.Alignment Center;
    property public final androidx.ui.core.Alignment CenterEnd;
    property public final androidx.ui.core.Alignment.Horizontal CenterHorizontally;
    property public final androidx.ui.core.Alignment CenterStart;
    property public final androidx.ui.core.Alignment.Vertical CenterVertically;
    property public final androidx.ui.core.Alignment.Horizontal End;
    property public final androidx.ui.core.Alignment.Horizontal Start;
    property public final androidx.ui.core.Alignment.Vertical Top;
    property public final androidx.ui.core.Alignment TopCenter;
    property public final androidx.ui.core.Alignment TopEnd;
    property public final androidx.ui.core.Alignment TopStart;
  }

  public static final class Alignment.Horizontal {
    ctor public Alignment.Horizontal(float bias);
    method public int align-Ujlv2dA(int size, androidx.ui.core.LayoutDirection layoutDirection = androidx.ui.core.LayoutDirection.Ltr);
    method public float component1();
    method public androidx.ui.core.Alignment.Horizontal copy(float bias);
    method public float getBias();
  }

  public static final class Alignment.Vertical {
    ctor public Alignment.Vertical(float bias);
    method public int align-gshw56o(int size);
    method public float component1();
    method public androidx.ui.core.Alignment.Vertical copy(float bias);
    method public float getBias();
  }

  public abstract sealed class AlignmentLine {
  }

  public final class AlignmentLineKt {
    method public static int merge-CBRbNzc(androidx.ui.core.AlignmentLine, int position1, int position2);
  }

  public final class CombinedModifier implements androidx.ui.core.Modifier {
    ctor public CombinedModifier(androidx.ui.core.Modifier outer, androidx.ui.core.Modifier inner);
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
  }

  public final class ComposedModifierKt {
    method public static androidx.ui.core.Modifier composed(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier,? extends androidx.ui.core.Modifier> factory);
    method public static androidx.ui.core.Modifier materialize(androidx.compose.Composer<?>, androidx.ui.core.Modifier modifier);
  }

  public final class Constraints {
    method public int component1();
    method public int component2();
    method public int component3();
    method public int component4();
    method public androidx.ui.core.Constraints copy-Q13GOEE(int minWidth, int maxWidth, int minHeight, int maxHeight);
    method public int getMaxHeight();
    method public int getMaxWidth();
    method public int getMinHeight();
    method public int getMinWidth();
    field public static final androidx.ui.core.Constraints.Companion! Companion;
  }

  public static final class Constraints.Companion {
    method public androidx.ui.core.Constraints fixed-rRMsBxU(int width, int height);
    method public androidx.ui.core.Constraints fixedHeight-gshw56o(int height);
    method public androidx.ui.core.Constraints fixedWidth-gshw56o(int width);
  }

  public final inline class Constraints2 {
    ctor public Constraints2();
    method public static long constructor-impl(internal long value);
    method public static long copy-impl(long $this, int minWidth = this.minWidth, int maxWidth = this.maxWidth, int minHeight = this.minHeight, int maxHeight = this.maxHeight);
    method public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static boolean getHasBoundedHeight-impl(long $this);
    method public static boolean getHasBoundedWidth-impl(long $this);
    method public static int getMaxHeight-impl(long $this);
    method public static int getMaxWidth-impl(long $this);
    method public static int getMinHeight-impl(long $this);
    method public static int getMinWidth-impl(long $this);
    method public static inline int hashCode-impl(long p);
    method public static inline String! toString-impl(long p);
    field public static final androidx.ui.core.Constraints2.Companion! Companion;
    field public static final int Infinity = -1073741824; // 0xc0000000
  }

  public static final class Constraints2.Companion {
    method public long fixed(int width, int height);
    method public long fixedHeight(int height);
    method public long fixedWidth(int width);
  }

  public final class Constraints2Kt {
    method public static long Constraints2(@IntRange(from=0) int minWidth = 0, int maxWidth = -1073741824, @IntRange(from=0) int minHeight = 0, int maxHeight = -1073741824);
    method public static long constrain-M1ogGms(long, long size);
    method public static long enforce-uQjoOwo(long, long otherConstraints);
    method public static boolean getHasFixedHeight-ybNdgAI(long);
    method public static boolean getHasFixedWidth-ybNdgAI(long);
    method public static boolean isZero-ybNdgAI(long);
    method public static long offset-xOKVbDg(long, int horizontal = 0, int vertical = 0);
    method public static boolean satisfiedBy-M1ogGms(long, long size);
  }

  public final class ConstraintsKt {
    method public static androidx.ui.unit.IntPxSize constrain(androidx.ui.core.Constraints, androidx.ui.unit.IntPxSize size);
    method public static androidx.ui.core.Constraints enforce(androidx.ui.core.Constraints, androidx.ui.core.Constraints otherConstraints);
    method public static boolean getHasBoundedHeight(androidx.ui.core.Constraints);
    method public static boolean getHasBoundedWidth(androidx.ui.core.Constraints);
    method public static boolean getHasFixedHeight(androidx.ui.core.Constraints);
    method public static boolean getHasFixedWidth(androidx.ui.core.Constraints);
    method public static boolean isZero(androidx.ui.core.Constraints);
    method public static androidx.ui.core.Constraints offset-3L2DHGc(androidx.ui.core.Constraints, int horizontal = 0.ipx, int vertical = 0.ipx);
    method public static boolean satisfiedBy(androidx.ui.core.Constraints, androidx.ui.unit.IntPxSize size);
  }

  public final class ConsumedData {
    ctor public ConsumedData(androidx.ui.unit.PxPosition positionChange, boolean downChange);
    ctor public ConsumedData();
    method public androidx.ui.unit.PxPosition component1();
    method public boolean component2();
    method public androidx.ui.core.ConsumedData copy(androidx.ui.unit.PxPosition positionChange, boolean downChange);
    method public boolean getDownChange();
    method public androidx.ui.unit.PxPosition getPositionChange();
  }

  public interface ContentDrawScope extends androidx.ui.core.DrawScope {
    method public void drawContent();
  }

  public interface ContentScale {
    method public float scale(androidx.ui.unit.PxSize srcSize, androidx.ui.unit.PxSize dstSize);
    field public static final androidx.ui.core.ContentScale.Companion! Companion;
  }

  public static final class ContentScale.Companion {
    method public androidx.ui.core.ContentScale getCrop();
    method public androidx.ui.core.ContentScale getFillHeight();
    method public androidx.ui.core.ContentScale getFillWidth();
    method public androidx.ui.core.ContentScale getFit();
    method public androidx.ui.core.ContentScale getInside();
    method public androidx.ui.core.FixedScale getNone();
    property public final androidx.ui.core.ContentScale Crop;
    property public final androidx.ui.core.ContentScale FillHeight;
    property public final androidx.ui.core.ContentScale FillWidth;
    property public final androidx.ui.core.ContentScale Fit;
    property public final androidx.ui.core.ContentScale Inside;
    property public final androidx.ui.core.FixedScale None;
  }

  public final class ContentScaleKt {
  }

  public interface CustomEvent {
  }

  public interface CustomEventDispatcher {
    method public void dispatchCustomEvent(androidx.ui.core.CustomEvent event);
  }

  public enum Direction {
    enum_constant public static final androidx.ui.core.Direction DOWN;
    enum_constant public static final androidx.ui.core.Direction LEFT;
    enum_constant public static final androidx.ui.core.Direction RIGHT;
    enum_constant public static final androidx.ui.core.Direction UP;
  }

  public interface DrawLayerModifier extends androidx.ui.core.Modifier.Element {
    method @FloatRange(from=0.0, to=1.0) public default float getAlpha();
    method public default boolean getClipToBounds();
    method public default boolean getClipToOutline();
    method public default androidx.ui.graphics.Shape? getOutlineShape();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationX();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationY();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationZ();
    method public default float getScaleX();
    method public default float getScaleY();
    method @FloatRange(from=0.0) public default float getShadowElevation();
    method public default long getTransformOrigin();
    method public default float getTranslationX();
    method public default float getTranslationY();
    property @FloatRange(from=0.0, to=1.0) public default float alpha;
    property public default boolean clipToBounds;
    property public default boolean clipToOutline;
    property public default androidx.ui.graphics.Shape? outlineShape;
    property @FloatRange(from=0.0, to=360.0) public default float rotationX;
    property @FloatRange(from=0.0, to=360.0) public default float rotationY;
    property @FloatRange(from=0.0, to=360.0) public default float rotationZ;
    property public default float scaleX;
    property public default float scaleY;
    property @FloatRange(from=0.0) public default float shadowElevation;
    property public default long transformOrigin;
    property public default float translationX;
    property public default float translationY;
  }

  public final class DrawLayerModifierKt {
    method public static inline long TransformOrigin(float pivotFractionX, float pivotFractionY);
    method public static androidx.ui.core.Modifier drawLayer-Z3WMmso(androidx.ui.core.Modifier, float scaleX = 1f, float scaleY = 1f, float alpha = 1f, float translationX = 0f, float translationY = 0f, float shadowElevation = 0f, float rotationX = 0f, float rotationY = 0f, float rotationZ = 0f, long transformOrigin = TransformOrigin.Center, androidx.ui.graphics.Shape? outlineShape = null, boolean clipToBounds = false, boolean clipToOutline = false);
    method @Deprecated public static androidx.ui.core.Modifier drawLayer-ebHciuY(float scaleX = 1f, float scaleY = 1f, float alpha = 1f, float translationX = 0f, float translationY = 0f, float elevation = 0f, float rotationX = 0f, float rotationY = 0f, float rotationZ = 0f, long transformOrigin = TransformOrigin.Center, androidx.ui.graphics.Shape? outlineShape = null, boolean clipToBounds = false, boolean clipToOutline = false);
  }

  public interface DrawModifier extends androidx.ui.core.Modifier.Element {
    method public void draw(androidx.ui.core.ContentDrawScope);
  }

  public final class DrawModifierKt {
    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
    method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
    method @Deprecated public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
  }

  public interface DrawScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
    method public androidx.ui.core.LayoutDirection getLayoutDirection();
    method public androidx.ui.unit.PxSize getSize();
    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
    property public abstract androidx.ui.unit.PxSize size;
  }

  public final class FixedScale implements androidx.ui.core.ContentScale {
    ctor public FixedScale(float value);
    method public float component1();
    method public androidx.ui.core.FixedScale copy(float value);
    method public float getValue();
    method public float scale(androidx.ui.unit.PxSize srcSize, androidx.ui.unit.PxSize dstSize);
  }

  public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> merger);
  }

  public interface IntrinsicMeasurable {
    method public Object? getParentData();
    method public int maxIntrinsicHeight-Ujlv2dA(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth-Ujlv2dA(int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight-Ujlv2dA(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth-Ujlv2dA(int height, androidx.ui.core.LayoutDirection layoutDirection);
    property public abstract Object? parentData;
  }

  public final class IntrinsicMeasurableKt {
  }

  public abstract class IntrinsicMeasureScope implements androidx.ui.unit.Density {
    ctor public IntrinsicMeasureScope();
    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
    method public final int maxIntrinsicHeight-e0m06WU(androidx.ui.core.IntrinsicMeasurable, int width);
    method public final int maxIntrinsicWidth-e0m06WU(androidx.ui.core.IntrinsicMeasurable, int height);
    method public final int minIntrinsicHeight-e0m06WU(androidx.ui.core.IntrinsicMeasurable, int width);
    method public final int minIntrinsicWidth-e0m06WU(androidx.ui.core.IntrinsicMeasurable, int height);
    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
  }

  public interface LayoutCoordinates {
    method public androidx.ui.unit.PxBounds childBoundingBox(androidx.ui.core.LayoutCoordinates child);
    method public androidx.ui.unit.PxPosition childToLocal(androidx.ui.core.LayoutCoordinates child, androidx.ui.unit.PxPosition childLocal);
    method public operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
    method public androidx.ui.core.LayoutCoordinates? getParentCoordinates();
    method public java.util.Set<androidx.ui.core.AlignmentLine> getProvidedAlignmentLines();
    method public androidx.ui.unit.IntPxSize getSize();
    method public androidx.ui.unit.PxPosition globalToLocal(androidx.ui.unit.PxPosition global);
    method public boolean isAttached();
    method public androidx.ui.unit.PxPosition localToGlobal(androidx.ui.unit.PxPosition local);
    method public androidx.ui.unit.PxPosition localToRoot(androidx.ui.unit.PxPosition local);
    property public abstract boolean isAttached;
    property public abstract androidx.ui.core.LayoutCoordinates? parentCoordinates;
    property public abstract java.util.Set<androidx.ui.core.AlignmentLine> providedAlignmentLines;
    property public abstract androidx.ui.unit.IntPxSize size;
  }

  public final class LayoutCoordinatesKt {
    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
    method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
    method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
    method public static inline androidx.ui.unit.PxPosition getGlobalPosition(androidx.ui.core.LayoutCoordinates);
    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
    method public static inline androidx.ui.unit.PxPosition getPositionInRoot(androidx.ui.core.LayoutCoordinates);
  }

  public enum LayoutDirection {
    enum_constant public static final androidx.ui.core.LayoutDirection Ltr;
    enum_constant public static final androidx.ui.core.LayoutDirection Rtl;
  }

  public interface LayoutModifier extends androidx.ui.core.Modifier.Element {
    method public default int maxIntrinsicHeight-QYUUffc(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int maxIntrinsicWidth-QYUUffc(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public androidx.ui.core.MeasureScope.MeasureResult measure(androidx.ui.core.MeasureScope, androidx.ui.core.Measurable measurable, androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int minIntrinsicHeight-QYUUffc(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int minIntrinsicWidth-QYUUffc(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.ui.core.LayoutDirection layoutDirection);
  }

  public interface Measurable extends androidx.ui.core.IntrinsicMeasurable {
    method public androidx.ui.core.Placeable measure(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
  }

  public abstract class MeasureScope extends androidx.ui.core.IntrinsicMeasureScope {
    ctor public MeasureScope();
    method public final androidx.ui.core.MeasureScope.MeasureResult layout-Ocy6_kE(int width, int height, java.util.Map<androidx.ui.core.AlignmentLine,androidx.ui.unit.IntPx> alignmentLines = emptyMap(), kotlin.jvm.functions.Function1<? super androidx.ui.core.Placeable.PlacementScope,kotlin.Unit> placementBlock);
    method public final androidx.ui.core.Placeable measure(androidx.ui.core.Measurable, androidx.ui.core.Constraints constraints);
  }

  public static interface MeasureScope.MeasureResult {
    method public java.util.Map<androidx.ui.core.AlignmentLine,androidx.ui.unit.IntPx> getAlignmentLines();
    method public int getHeight();
    method public int getWidth();
    method public void placeChildren(androidx.ui.core.LayoutDirection layoutDirection);
    property public abstract java.util.Map<androidx.ui.core.AlignmentLine,androidx.ui.unit.IntPx> alignmentLines;
    property public abstract int height;
    property public abstract int width;
  }

  public final class MeasureScopeKt {
  }

  public final class Measured {
    ctor public Measured(internal androidx.ui.core.Placeable placeable);
    method public operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine alignmentLine);
    method public int getHeight();
    method public int getWidth();
    property public final int height;
    property public final int width;
  }

  public interface Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
    method public default operator androidx.ui.core.Modifier plus(androidx.ui.core.Modifier other);
    field public static final androidx.ui.core.Modifier.Companion! Companion;
  }

  public static final class Modifier.Companion implements androidx.ui.core.Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
    method @Deprecated public androidx.ui.core.Modifier getNone();
    property @Deprecated public final androidx.ui.core.Modifier None;
  }

  public static interface Modifier.Element extends androidx.ui.core.Modifier {
    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
  }

  public interface OnChildPositionedModifier extends androidx.ui.core.Modifier.Element {
    method public void onChildPositioned(androidx.ui.core.LayoutCoordinates coordinates);
  }

  public interface OnPositionedModifier extends androidx.ui.core.Modifier.Element {
    method public void onPositioned(androidx.ui.core.LayoutCoordinates coordinates);
  }

  public final class OnPositionedModifierKt {
    method public static androidx.ui.core.Modifier onChildPositioned(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onChildPositioned);
    method @Deprecated public static androidx.ui.core.Modifier onChildPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onChildPositioned);
    method public static androidx.ui.core.Modifier onPositioned(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned);
    method @Deprecated public static androidx.ui.core.Modifier onPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned);
  }

  public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
    method public default Object? modifyParentData(androidx.ui.unit.Density, Object? parentData);
  }

  public abstract class Placeable {
    ctor public Placeable();
    method public abstract operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
    method protected final androidx.ui.unit.IntPxPosition getApparentToRealOffset();
    method public final int getHeight();
    method protected abstract androidx.ui.unit.IntPxSize getMeasuredSize();
    method protected abstract androidx.ui.core.Constraints getMeasurementConstraints();
    method public final int getWidth();
    method protected abstract void place(androidx.ui.unit.IntPxPosition position);
    property protected final androidx.ui.unit.IntPxPosition apparentToRealOffset;
    property public final int height;
    property protected abstract androidx.ui.unit.IntPxSize measuredSize;
    property protected abstract androidx.ui.core.Constraints measurementConstraints;
    property public final int width;
  }

  public abstract static class Placeable.PlacementScope {
    ctor public Placeable.PlacementScope();
    method public abstract androidx.ui.core.LayoutDirection getParentLayoutDirection();
    method public abstract int getParentWidth();
    method public final void place(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
    method public final void place(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
    method public final void place-Guq6mTs(androidx.ui.core.Placeable, float x, float y);
    method public final void place-sXe7h04(androidx.ui.core.Placeable, int x, int y);
    method public final void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
    method public final void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
    method public final void placeAbsolute-Guq6mTs(androidx.ui.core.Placeable, float x, float y);
    method public final void placeAbsolute-sXe7h04(androidx.ui.core.Placeable, int x, int y);
    property public abstract androidx.ui.core.LayoutDirection parentLayoutDirection;
    property public abstract int parentWidth;
  }

  public enum PointerEventPass {
    enum_constant public static final androidx.ui.core.PointerEventPass InitialDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PostDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PostUp;
    enum_constant public static final androidx.ui.core.PointerEventPass PreDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PreUp;
  }

  public final inline class PointerId {
    ctor public PointerId();
    method public static long constructor-impl(long value);
    method public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public long getValue();
    method public static inline int hashCode-impl(long p);
    method public static inline String! toString-impl(long p);
  }

  public final class PointerInputChange {
    method public long component1();
    method public androidx.ui.core.PointerInputData component2();
    method public androidx.ui.core.PointerInputData component3();
    method public androidx.ui.core.ConsumedData component4();
    method public androidx.ui.core.PointerInputChange copy-jh1A5Og(long id, androidx.ui.core.PointerInputData current, androidx.ui.core.PointerInputData previous, androidx.ui.core.ConsumedData consumed);
    method public androidx.ui.core.ConsumedData getConsumed();
    method public androidx.ui.core.PointerInputData getCurrent();
    method public long getId();
    method public androidx.ui.core.PointerInputData getPrevious();
  }

  public final class PointerInputData {
    ctor public PointerInputData(androidx.ui.unit.Uptime? uptime, androidx.ui.unit.PxPosition? position, boolean down);
    ctor public PointerInputData();
    method public androidx.ui.unit.Uptime? component1();
    method public androidx.ui.unit.PxPosition? component2();
    method public boolean component3();
    method public androidx.ui.core.PointerInputData copy(androidx.ui.unit.Uptime? uptime, androidx.ui.unit.PxPosition? position, boolean down);
    method public boolean getDown();
    method public androidx.ui.unit.PxPosition? getPosition();
    method public androidx.ui.unit.Uptime? getUptime();
  }

  public final class PointerInputKt {
    method public static boolean anyChangeConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean anyPositionChangeConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean changedToDown(androidx.ui.core.PointerInputChange);
    method public static boolean changedToDownIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean changedToUp(androidx.ui.core.PointerInputChange);
    method public static boolean changedToUpIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumeAllChanges(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumeDownChange(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumePositionChange-3EnrK0w(androidx.ui.core.PointerInputChange, float consumedDx, float consumedDy);
    method public static androidx.ui.unit.PxPosition positionChange(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.unit.PxPosition positionChangeIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean positionChanged(androidx.ui.core.PointerInputChange);
    method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
  }

  public final class Ref<T> {
    ctor public Ref();
    method public T? getValue();
    method public void setValue(T? p);
    property public final T? value;
  }

  @Deprecated public interface ScaleFit extends androidx.ui.core.ContentScale {
    field @Deprecated public static final androidx.ui.core.ScaleFit.Companion! Companion;
  }

  @Deprecated public static final class ScaleFit.Companion {
    method @Deprecated public androidx.ui.core.ContentScale getFillHeight();
    method @Deprecated public androidx.ui.core.ContentScale getFillMaxDimension();
    method @Deprecated public androidx.ui.core.ContentScale getFillMinDimension();
    method @Deprecated public androidx.ui.core.ContentScale getFillWidth();
    method @Deprecated public androidx.ui.core.ContentScale getFit();
    method @Deprecated public androidx.ui.core.FixedScale getNone();
    property @Deprecated public final androidx.ui.core.ContentScale FillHeight;
    property @Deprecated public final androidx.ui.core.ContentScale FillMaxDimension;
    property @Deprecated public final androidx.ui.core.ContentScale FillMinDimension;
    property @Deprecated public final androidx.ui.core.ContentScale FillWidth;
    property @Deprecated public final androidx.ui.core.ContentScale Fit;
    property @Deprecated public final androidx.ui.core.FixedScale None;
  }

  public final inline class TransformOrigin {
    ctor public TransformOrigin();
    method public static long constructor-impl(internal long value);
    method public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getPivotFractionX-impl(long $this);
    method public static float getPivotFractionY-impl(long $this);
    method public static inline int hashCode-impl(long p);
    method public static inline String! toString-impl(long p);
    field public static final androidx.ui.core.TransformOrigin.Companion! Companion;
  }

  public static final class TransformOrigin.Companion {
    method public long getCenter();
    property public final long Center;
  }

  public final class VerticalAlignmentLine extends androidx.ui.core.AlignmentLine {
    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> merger);
  }

  public interface ZIndexModifier extends androidx.ui.core.Modifier.Element {
    method public float getZIndex();
    property public abstract float zIndex;
  }

  public final class ZIndexModifierKt {
    method public static androidx.ui.core.Modifier zIndex(androidx.ui.core.Modifier, float zIndex);
  }

}

package androidx.ui.focus {

  public enum FocusDetailedState {
    enum_constant public static final androidx.ui.focus.FocusDetailedState Active;
    enum_constant public static final androidx.ui.focus.FocusDetailedState ActiveParent;
    enum_constant public static final androidx.ui.focus.FocusDetailedState Captured;
    enum_constant public static final androidx.ui.focus.FocusDetailedState Disabled;
    enum_constant public static final androidx.ui.focus.FocusDetailedState Inactive;
  }

  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
    method public boolean captureFocus();
    method public boolean freeFocus();
    method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
    method public void requestFocus();
    property public abstract androidx.ui.focus.FocusDetailedState focusDetailedState;
  }

  public enum FocusState {
    enum_constant public static final androidx.ui.focus.FocusState Focused;
    enum_constant public static final androidx.ui.focus.FocusState NotFocusable;
    enum_constant public static final androidx.ui.focus.FocusState NotFocused;
  }

  public final class FocusStateKt {
    method public static androidx.ui.focus.FocusState focusState(androidx.ui.focus.FocusDetailedState);
  }

}

package androidx.ui.semantics {

  public final class AccessibilityAction<T extends kotlin.Function<? extends kotlin.Unit>> {
    ctor public AccessibilityAction(CharSequence? label, T action);
    method public CharSequence? component1();
    method public T component2();
    method public androidx.ui.semantics.AccessibilityAction<T> copy(CharSequence? label, T action);
    method public T getAction();
    method public CharSequence? getLabel();
  }

  public final class AccessibilityRangeInfo {
    ctor public AccessibilityRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range);
    method public float component1();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> component2();
    method public androidx.ui.semantics.AccessibilityRangeInfo copy(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range);
    method public float getCurrent();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
  }

  public final class CustomAccessibilityAction {
    ctor public CustomAccessibilityAction(CharSequence label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public CharSequence component1();
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> component2();
    method public androidx.ui.semantics.CustomAccessibilityAction copy(CharSequence label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
    method public CharSequence getLabel();
  }

  public final class SemanticsActions {
    ctor public SemanticsActions();
    field public static final androidx.ui.semantics.SemanticsActions.Companion! Companion;
  }

  public static final class SemanticsActions.Companion {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>> getOnClick();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<androidx.ui.unit.Px,androidx.ui.unit.Px,kotlin.Unit>>> getScrollTo();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>> OnClick;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<androidx.ui.unit.Px,androidx.ui.unit.Px,kotlin.Unit>>> ScrollTo;
  }

  public final class SemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityLabel();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityRangeInfo> getAccessibilityRangeInfo();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityValue();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getEnabled();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getHidden();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityLabel;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityRangeInfo> AccessibilityRangeInfo;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityValue;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Enabled;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Hidden;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    field public static final androidx.ui.semantics.SemanticsProperties! INSTANCE;
  }

  public class SemanticsPropertyKey<T> implements kotlin.properties.ReadWriteProperty<androidx.ui.semantics.SemanticsPropertyReceiver,T> {
    ctor public SemanticsPropertyKey(String name);
    method public final String getName();
    method public final T! getValue(androidx.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
    method public T! merge(T? existingValue, T? newValue);
    method public final void setValue(androidx.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
  }

  public interface SemanticsPropertyReceiver {
    method public operator <T> void set(androidx.ui.semantics.SemanticsPropertyKey<T> key, T? value);
  }

}

package androidx.ui.testutils {

  public final class PointerInputTestUtilKt {
    method public static androidx.ui.core.PointerInputChange consume(androidx.ui.core.PointerInputChange, float dx = 0f, float dy = 0f, boolean downChange = false);
    method public static androidx.ui.core.PointerInputChange down(long id, androidx.ui.unit.Duration duration = Duration.Zero, float x = 0f, float y = 0f);
    method public static androidx.ui.core.PointerInputChange invokeOverAllPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChanges, androidx.ui.unit.IntPxSize size = IntPxSize(Int.MAX_VALUE.ipx, Int.MAX_VALUE.ipx));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverAllPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.ui.unit.IntPxSize size = IntPxSize(Int.MAX_VALUE.ipx, Int.MAX_VALUE.ipx));
    method public static void invokeOverAllPasses(kotlin.jvm.functions.Function2<? super androidx.ui.core.CustomEvent,? super androidx.ui.core.PointerEventPass,kotlin.Unit>, androidx.ui.core.CustomEvent event);
    method public static androidx.ui.core.PointerInputChange invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass pointerEventPass, androidx.ui.unit.IntPxSize size = IntPxSize(Int.MAX_VALUE.ipx, Int.MAX_VALUE.ipx));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.ui.core.PointerEventPass pointerEventPass, androidx.ui.unit.IntPxSize size = IntPxSize(Int.MAX_VALUE.ipx, Int.MAX_VALUE.ipx));
    method public static androidx.ui.core.PointerInputChange invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass![] pointerEventPasses, androidx.ui.unit.IntPxSize size = IntPxSize(Int.MAX_VALUE.ipx, Int.MAX_VALUE.ipx));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, java.util.List<androidx.ui.core.PointerInputChange> pointerInputChanges, java.util.List<? extends androidx.ui.core.PointerEventPass> pointerEventPasses, androidx.ui.unit.IntPxSize size = IntPxSize(Int.MAX_VALUE.ipx, Int.MAX_VALUE.ipx));
    method public static void invokeOverPasses(kotlin.jvm.functions.Function2<? super androidx.ui.core.CustomEvent,? super androidx.ui.core.PointerEventPass,kotlin.Unit>, androidx.ui.core.CustomEvent event, java.util.List<? extends androidx.ui.core.PointerEventPass> pointerEventPasses);
    method public static androidx.ui.core.PointerInputChange moveBy(androidx.ui.core.PointerInputChange, androidx.ui.unit.Duration duration, float dx = 0f, float dy = 0f);
    method public static androidx.ui.core.PointerInputChange moveTo(androidx.ui.core.PointerInputChange, androidx.ui.unit.Duration duration, float x = 0f, float y = 0f);
    method public static androidx.ui.core.PointerInputChange up(androidx.ui.core.PointerInputChange, androidx.ui.unit.Duration duration);
  }

}

