Rtl support in Column and Row.
Bug: 146346559
Bug: 149198860
Test: layout/material tests + new tests for Column/Row
Change-Id: I984990928333b9db526003c4c0c39c0464393b31
diff --git a/ui/ui-layout/api/0.1.0-dev05.txt b/ui/ui-layout/api/0.1.0-dev05.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/0.1.0-dev05.txt
+++ b/ui/ui-layout/api/0.1.0-dev05.txt
@@ -11,24 +11,55 @@
method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Arrangement {
- ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
- field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+ public interface Arrangement {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
}
- public static final class Arrangement.Companion {
- method public androidx.ui.layout.Arrangement getBegin();
- method public androidx.ui.layout.Arrangement getCenter();
- method public androidx.ui.layout.Arrangement getEnd();
- method public androidx.ui.layout.Arrangement getSpaceAround();
- method public androidx.ui.layout.Arrangement getSpaceBetween();
- method public androidx.ui.layout.Arrangement getSpaceEvenly();
- property public final androidx.ui.layout.Arrangement Begin;
- property public final androidx.ui.layout.Arrangement Center;
- property public final androidx.ui.layout.Arrangement End;
- property public final androidx.ui.layout.Arrangement SpaceAround;
- property public final androidx.ui.layout.Arrangement SpaceBetween;
- property public final androidx.ui.layout.Arrangement SpaceEvenly;
+ public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+ }
+
+ public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+ }
+
+ public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+ }
+
+ public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+ }
+
+ public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+ }
+
+ public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+ }
+
+ public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+ }
+
+ public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
}
public final class AspectRatioKt {
@@ -112,8 +143,8 @@
}
public final class FlexKt {
- method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
- method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+ method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+ method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
}
@androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/current.txt b/ui/ui-layout/api/current.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/current.txt
+++ b/ui/ui-layout/api/current.txt
@@ -11,24 +11,55 @@
method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Arrangement {
- ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
- field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+ public interface Arrangement {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
}
- public static final class Arrangement.Companion {
- method public androidx.ui.layout.Arrangement getBegin();
- method public androidx.ui.layout.Arrangement getCenter();
- method public androidx.ui.layout.Arrangement getEnd();
- method public androidx.ui.layout.Arrangement getSpaceAround();
- method public androidx.ui.layout.Arrangement getSpaceBetween();
- method public androidx.ui.layout.Arrangement getSpaceEvenly();
- property public final androidx.ui.layout.Arrangement Begin;
- property public final androidx.ui.layout.Arrangement Center;
- property public final androidx.ui.layout.Arrangement End;
- property public final androidx.ui.layout.Arrangement SpaceAround;
- property public final androidx.ui.layout.Arrangement SpaceBetween;
- property public final androidx.ui.layout.Arrangement SpaceEvenly;
+ public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+ }
+
+ public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+ }
+
+ public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+ }
+
+ public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+ }
+
+ public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+ }
+
+ public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+ }
+
+ public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+ }
+
+ public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
}
public final class AspectRatioKt {
@@ -112,8 +143,8 @@
}
public final class FlexKt {
- method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
- method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+ method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+ method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
}
@androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt
+++ b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev05.txt
@@ -11,24 +11,55 @@
method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Arrangement {
- ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
- field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+ public interface Arrangement {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
}
- public static final class Arrangement.Companion {
- method public androidx.ui.layout.Arrangement getBegin();
- method public androidx.ui.layout.Arrangement getCenter();
- method public androidx.ui.layout.Arrangement getEnd();
- method public androidx.ui.layout.Arrangement getSpaceAround();
- method public androidx.ui.layout.Arrangement getSpaceBetween();
- method public androidx.ui.layout.Arrangement getSpaceEvenly();
- property public final androidx.ui.layout.Arrangement Begin;
- property public final androidx.ui.layout.Arrangement Center;
- property public final androidx.ui.layout.Arrangement End;
- property public final androidx.ui.layout.Arrangement SpaceAround;
- property public final androidx.ui.layout.Arrangement SpaceBetween;
- property public final androidx.ui.layout.Arrangement SpaceEvenly;
+ public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+ }
+
+ public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+ }
+
+ public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+ }
+
+ public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+ }
+
+ public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+ }
+
+ public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+ }
+
+ public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+ }
+
+ public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
}
public final class AspectRatioKt {
@@ -112,8 +143,8 @@
}
public final class FlexKt {
- method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
- method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+ method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+ method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
}
@androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/public_plus_experimental_current.txt b/ui/ui-layout/api/public_plus_experimental_current.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/public_plus_experimental_current.txt
+++ b/ui/ui-layout/api/public_plus_experimental_current.txt
@@ -11,24 +11,55 @@
method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Arrangement {
- ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
- field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+ public interface Arrangement {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
}
- public static final class Arrangement.Companion {
- method public androidx.ui.layout.Arrangement getBegin();
- method public androidx.ui.layout.Arrangement getCenter();
- method public androidx.ui.layout.Arrangement getEnd();
- method public androidx.ui.layout.Arrangement getSpaceAround();
- method public androidx.ui.layout.Arrangement getSpaceBetween();
- method public androidx.ui.layout.Arrangement getSpaceEvenly();
- property public final androidx.ui.layout.Arrangement Begin;
- property public final androidx.ui.layout.Arrangement Center;
- property public final androidx.ui.layout.Arrangement End;
- property public final androidx.ui.layout.Arrangement SpaceAround;
- property public final androidx.ui.layout.Arrangement SpaceBetween;
- property public final androidx.ui.layout.Arrangement SpaceEvenly;
+ public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+ }
+
+ public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+ }
+
+ public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+ }
+
+ public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+ }
+
+ public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+ }
+
+ public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+ }
+
+ public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+ }
+
+ public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
}
public final class AspectRatioKt {
@@ -112,8 +143,8 @@
}
public final class FlexKt {
- method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
- method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+ method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+ method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
}
@androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/restricted_0.1.0-dev05.txt b/ui/ui-layout/api/restricted_0.1.0-dev05.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/restricted_0.1.0-dev05.txt
+++ b/ui/ui-layout/api/restricted_0.1.0-dev05.txt
@@ -11,24 +11,55 @@
method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Arrangement {
- ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
- field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+ public interface Arrangement {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
}
- public static final class Arrangement.Companion {
- method public androidx.ui.layout.Arrangement getBegin();
- method public androidx.ui.layout.Arrangement getCenter();
- method public androidx.ui.layout.Arrangement getEnd();
- method public androidx.ui.layout.Arrangement getSpaceAround();
- method public androidx.ui.layout.Arrangement getSpaceBetween();
- method public androidx.ui.layout.Arrangement getSpaceEvenly();
- property public final androidx.ui.layout.Arrangement Begin;
- property public final androidx.ui.layout.Arrangement Center;
- property public final androidx.ui.layout.Arrangement End;
- property public final androidx.ui.layout.Arrangement SpaceAround;
- property public final androidx.ui.layout.Arrangement SpaceBetween;
- property public final androidx.ui.layout.Arrangement SpaceEvenly;
+ public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+ }
+
+ public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+ }
+
+ public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+ }
+
+ public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+ }
+
+ public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+ }
+
+ public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+ }
+
+ public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+ }
+
+ public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
}
public final class AspectRatioKt {
@@ -112,8 +143,8 @@
}
public final class FlexKt {
- method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
- method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+ method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+ method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
}
@androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/api/restricted_current.txt b/ui/ui-layout/api/restricted_current.txt
index f64e80f..acbaf51 100644
--- a/ui/ui-layout/api/restricted_current.txt
+++ b/ui/ui-layout/api/restricted_current.txt
@@ -11,24 +11,55 @@
method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Arrangement {
- ctor public Arrangement(internal kotlin.jvm.functions.Function2<? super androidx.ui.unit.IntPx,? super java.util.List<androidx.ui.unit.IntPx>,? extends java.util.List<androidx.ui.unit.IntPx>> arrangeBlock);
- field public static final androidx.ui.layout.Arrangement.Companion! Companion;
+ public interface Arrangement {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field @Deprecated public static final androidx.ui.layout.Arrangement.Companion! Companion;
}
- public static final class Arrangement.Companion {
- method public androidx.ui.layout.Arrangement getBegin();
- method public androidx.ui.layout.Arrangement getCenter();
- method public androidx.ui.layout.Arrangement getEnd();
- method public androidx.ui.layout.Arrangement getSpaceAround();
- method public androidx.ui.layout.Arrangement getSpaceBetween();
- method public androidx.ui.layout.Arrangement getSpaceEvenly();
- property public final androidx.ui.layout.Arrangement Begin;
- property public final androidx.ui.layout.Arrangement Center;
- property public final androidx.ui.layout.Arrangement End;
- property public final androidx.ui.layout.Arrangement SpaceAround;
- property public final androidx.ui.layout.Arrangement SpaceBetween;
- property public final androidx.ui.layout.Arrangement SpaceEvenly;
+ public static final class Arrangement.Bottom implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Bottom! INSTANCE;
+ }
+
+ public static final class Arrangement.Center implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Center! INSTANCE;
+ }
+
+ public static final class Arrangement.End implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.End! INSTANCE;
+ }
+
+ public static interface Arrangement.Horizontal extends androidx.ui.layout.Arrangement {
+ }
+
+ public static final class Arrangement.SpaceAround implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceAround! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceBetween implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceBetween! INSTANCE;
+ }
+
+ public static final class Arrangement.SpaceEvenly implements androidx.ui.layout.Arrangement.Horizontal androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.SpaceEvenly! INSTANCE;
+ }
+
+ public static final class Arrangement.Start implements androidx.ui.layout.Arrangement.Horizontal {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Start! INSTANCE;
+ }
+
+ public static final class Arrangement.Top implements androidx.ui.layout.Arrangement.Vertical {
+ method public java.util.List<androidx.ui.unit.IntPx> arrange(androidx.ui.unit.IntPx totalSize, java.util.List<androidx.ui.unit.IntPx> size, androidx.ui.core.LayoutDirection layoutDirection);
+ field public static final androidx.ui.layout.Arrangement.Top! INSTANCE;
+ }
+
+ public static interface Arrangement.Vertical extends androidx.ui.layout.Arrangement {
}
public final class AspectRatioKt {
@@ -112,8 +143,8 @@
}
public final class FlexKt {
- method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
- method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement arrangement = Arrangement.Begin, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+ method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+ method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
}
@androidx.ui.layout.LayoutScopeMarker public abstract sealed class FlexScope {
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
index 41c77fe..713c5d4 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
@@ -43,6 +43,14 @@
<category android:name="androidx.ui.demos.SAMPLE_CODE" />
</intent-filter>
</activity>
+ <activity android:name=".RtlDemosActivity"
+ android:configChanges="orientation|screenSize"
+ android:label="Layout/Rtl support">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="androidx.ui.demos.SAMPLE_CODE" />
+ </intent-filter>
+ </activity>
<activity android:name=".TableActivity"
android:configChanges="orientation|screenSize"
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt
index 48d6e31..011fb8b 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutActivity.kt
@@ -24,8 +24,8 @@
import androidx.ui.core.setContent
import androidx.ui.foundation.Box
import androidx.ui.graphics.Color
-import androidx.ui.layout.Arrangement
import androidx.ui.layout.Column
+import androidx.ui.layout.Arrangement
import androidx.ui.layout.LayoutGravity
import androidx.ui.layout.LayoutHeight
import androidx.ui.layout.LayoutSize
@@ -106,7 +106,7 @@
}
Spacer(LayoutWidth(24.dp))
Stack(LayoutHeight(ExampleSize) + DrawBackground(color = lightGrey)) {
- Column(LayoutHeight.Fill, arrangement = Arrangement.End) {
+ Column(LayoutHeight.Fill, arrangement = Arrangement.Bottom) {
PurpleSquare()
CyanSquare()
}
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemos.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemos.kt
new file mode 100644
index 0000000..b8cdf35
--- /dev/null
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemos.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.layout.demos
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.compose.Composable
+import androidx.compose.Providers
+import androidx.ui.core.LayoutDirection
+import androidx.ui.core.LayoutDirectionAmbient
+import androidx.ui.core.Text
+import androidx.ui.core.setContent
+import androidx.ui.graphics.Color
+import androidx.ui.layout.Column
+import androidx.ui.layout.LayoutGravity
+import androidx.ui.layout.LayoutSize
+import androidx.ui.layout.Row
+import androidx.ui.layout.Arrangement
+import androidx.ui.layout.LayoutWidth
+import androidx.ui.layout.Stack
+import androidx.ui.foundation.DrawBackground
+import androidx.ui.unit.dp
+
+class RtlDemosActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ Column(arrangement = Arrangement.SpaceEvenly) {
+ Text("TEXT", LayoutGravity.Center)
+ testText()
+ Text("ROW", LayoutGravity.Center)
+ testRow()
+ Text("ROW WITH AMBIENT", LayoutGravity.Center)
+ testRow_ambient()
+ Text("RELATIVE TO SIBLINGS", LayoutGravity.Center)
+ testSiblings()
+ }
+ }
+ }
+}
+
+val boxSize = LayoutSize(50.dp, 50.dp)
+val size = LayoutSize(10.dp, 10.dp)
+
+@Composable
+fun testRow() {
+ Row {
+ Stack(boxSize + DrawBackground(Color.Red)) {}
+ Stack(boxSize + DrawBackground(Color.Green)) {}
+ Row {
+ Stack(boxSize + DrawBackground(Color.Magenta)) {}
+ Stack(boxSize + DrawBackground(Color.Yellow)) {}
+ Stack(boxSize + DrawBackground(Color.Cyan)) {}
+ }
+ Stack(boxSize + DrawBackground(Color.Blue)) {}
+ }
+}
+
+@Composable
+fun testRow_ambient() {
+ Row {
+ Stack(boxSize + DrawBackground(Color.Red)) {}
+ Stack(boxSize + DrawBackground(Color.Green)) {}
+ Providers(LayoutDirectionAmbient provides LayoutDirection.Ltr) {
+ Row {
+ Stack(boxSize + DrawBackground(Color.Magenta)) {}
+ Stack(boxSize + DrawBackground(Color.Yellow)) {}
+ Stack(boxSize + DrawBackground(Color.Cyan)) {}
+ }
+ }
+ Stack(boxSize + DrawBackground(Color.Blue)) {}
+ }
+}
+
+@Composable
+fun testText() {
+ Column {
+ Row {
+ Stack(boxSize + DrawBackground(Color.Red)) {}
+ Stack(boxSize + DrawBackground(Color.Green)) {}
+ Stack(boxSize + DrawBackground(Color.Blue)) {}
+ }
+ Text("Text.")
+ Text("Width filled text.", LayoutWidth.Fill)
+ Text("שלום!")
+ Text("שלום!", LayoutWidth.Fill)
+ Text("-->")
+ Text("-->", LayoutWidth.Fill)
+ }
+}
+
+@Composable
+fun testSiblings() {
+ Column {
+ Stack(boxSize +
+ DrawBackground(Color.Red) +
+ LayoutGravity.RelativeToSiblings { p -> p.width }
+ ) {}
+ Stack(boxSize +
+ DrawBackground(Color.Green) +
+ LayoutGravity.RelativeToSiblings { p -> p.width * 0.5 }
+ ) {}
+ Stack(boxSize +
+ DrawBackground(Color.Blue) +
+ LayoutGravity.RelativeToSiblings { p -> p.width / 4 }
+ ) {}
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt
index 841765d..2aa8032 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/FlexTest.kt
@@ -33,13 +33,14 @@
import androidx.ui.core.WithConstraints
import androidx.ui.core.globalPosition
import androidx.ui.layout.Align
-import androidx.ui.layout.Arrangement
import androidx.ui.layout.Center
import androidx.ui.layout.Column
import androidx.ui.layout.Container
import androidx.ui.layout.DpConstraints
+import androidx.ui.layout.Arrangement
import androidx.ui.layout.LayoutAlign
import androidx.ui.layout.LayoutAspectRatio
+import androidx.ui.layout.LayoutDirectionModifier
import androidx.ui.layout.LayoutGravity
import androidx.ui.layout.LayoutHeight
import androidx.ui.layout.LayoutPadding
@@ -2087,7 +2088,7 @@
val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
show {
Center {
- Row(LayoutWidth.Fill, arrangement = Arrangement(customArrangement)) {
+ Row(LayoutWidth.Fill, arrangement = customHorizontalArrangement) {
for (i in childPosition.indices) {
Container(width = sizeDp, height = sizeDp) {
OnPositioned( coordinates ->
@@ -2175,7 +2176,7 @@
val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
show {
Center {
- Column(LayoutHeight.Fill, arrangement = Arrangement.End) {
+ Column(LayoutHeight.Fill, arrangement = Arrangement.Bottom) {
for (i in 0 until childPosition.size) {
Container(width = sizeDp, height = sizeDp) {
OnPositioned( coordinates ->
@@ -2390,7 +2391,7 @@
val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
show {
Center {
- Column(LayoutHeight.Fill, arrangement = Arrangement(customArrangement)) {
+ Column(LayoutHeight.Fill, arrangement = customVerticalArrangement) {
for (i in childPosition.indices) {
Container(width = sizeDp, height = sizeDp) {
OnPositioned( coordinates ->
@@ -2517,7 +2518,7 @@
)
}
}, @Composable {
- Row(LayoutWidth.Fill, arrangement = Arrangement.Begin) {
+ Row(LayoutWidth.Fill, arrangement = Arrangement.Start) {
Container(LayoutAspectRatio(2f), children = emptyContent())
ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
}
@@ -2615,7 +2616,7 @@
)
}
}, @Composable {
- Row(arrangement = Arrangement.Begin) {
+ Row(arrangement = Arrangement.Start) {
ConstrainedBox(
DpConstraints.fixed(20.dp, 30.dp),
LayoutFlexible(3f),
@@ -2809,7 +2810,7 @@
ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
}
}, @Composable {
- Column(LayoutHeight.Fill, arrangement = Arrangement.Begin) {
+ Column(LayoutHeight.Fill, arrangement = Arrangement.Top) {
Container(LayoutAspectRatio(2f), children = emptyContent())
ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
}
@@ -2819,7 +2820,7 @@
ConstrainedBox(DpConstraints.fixed(50.dp, 40.dp), children = emptyContent())
}
}, @Composable {
- Column(LayoutHeight.Fill, arrangement = Arrangement.End) {
+ Column(LayoutHeight.Fill, arrangement = Arrangement.Bottom) {
Container(LayoutGravity.End + LayoutAspectRatio(2f), children = emptyContent())
ConstrainedBox(
DpConstraints.fixed(50.dp, 40.dp),
@@ -2899,7 +2900,7 @@
ConstrainedBox(DpConstraints.fixed(30.dp, 20.dp), LayoutGravity.End) { }
}
}, @Composable {
- Column(arrangement = Arrangement.Begin) {
+ Column(arrangement = Arrangement.Top) {
ConstrainedBox(DpConstraints.fixed(30.dp, 20.dp), LayoutFlexible(3f)) { }
ConstrainedBox(DpConstraints.fixed(40.dp, 30.dp), LayoutFlexible(2f)) { }
Container(LayoutAspectRatio(0.5f) + LayoutFlexible(2f)) { }
@@ -2924,7 +2925,7 @@
) { }
}
}, @Composable {
- Column(arrangement = Arrangement.End) {
+ Column(arrangement = Arrangement.Bottom) {
ConstrainedBox(
constraints = DpConstraints.fixed(30.dp, 20.dp),
modifier = LayoutFlexible(3f) + LayoutGravity.End
@@ -3089,6 +3090,223 @@
assertEquals(PxPosition(size.toPx(), size.toPx()), containerPosition.value)
}
// endregion
+
+ // region Rtl tests
+ @Test
+ fun testRow_Rtl_arrangementStart() = with(density) {
+ val sizeDp = 35.dp
+ val size = sizeDp.toIntPx()
+
+ val drawLatch = CountDownLatch(2)
+ val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+ show {
+ Row(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+ Container(LayoutSize(sizeDp, sizeDp)) {
+ OnPositioned( coordinates ->
+ childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+
+ Container(LayoutSize(sizeDp * 2, sizeDp * 2)) {
+ OnPositioned( coordinates ->
+ childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+ }
+ }
+
+ assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+ val root = findAndroidComposeView()
+ waitForDraw(root)
+ val rootWidth = root.width.px
+
+ assertEquals(PxPosition(rootWidth - size.toPx(), 0.px), childPosition[0])
+ assertEquals(
+ PxPosition(rootWidth - (sizeDp.toPx() * 3).round().toPx(), 0.px),
+ childPosition[1]
+ )
+ }
+
+ @Test
+ fun testRow_Rtl_arrangementEnd() = with(density) {
+ val sizeDp = 35.dp
+
+ val drawLatch = CountDownLatch(2)
+ val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+ show {
+ Row(
+ LayoutWidth.Fill + LayoutDirectionModifier.Rtl,
+ arrangement = Arrangement.End
+ ) {
+ Container(LayoutSize(sizeDp, sizeDp)) {
+ OnPositioned( coordinates ->
+ childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+
+ Container(LayoutSize(sizeDp * 2, sizeDp * 2)) {
+ OnPositioned( coordinates ->
+ childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+ }
+ }
+
+ assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+ assertEquals(PxPosition((sizeDp.toPx() * 2).round().toPx(), 0.px), childPosition[0])
+ assertEquals(PxPosition(0.px, 0.px), childPosition[1])
+ }
+
+ @Test
+ fun testRow_Rtl_customArrangement() = with(density) {
+ val sizeDp = 35.dp
+
+ val drawLatch = CountDownLatch(2)
+ val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+ show {
+ Row(
+ LayoutWidth.Fill + LayoutDirectionModifier.Rtl,
+ arrangement = customHorizontalArrangement
+ ) {
+ Container(width = sizeDp, height = sizeDp) {
+ OnPositioned( coordinates ->
+ childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+
+ Container(width = (sizeDp * 2), height = (sizeDp * 2)) {
+ OnPositioned( coordinates ->
+ childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+ }
+ }
+
+ assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+ val root = findAndroidComposeView()
+ waitForDraw(root)
+
+ assertEquals(PxPosition((sizeDp.toPx() * 2).round().toPx(), 0.px), childPosition[0])
+ assertEquals(PxPosition(0.px, 0.px), childPosition[1])
+ }
+
+ @Test
+ fun testColumn_Rtl_gravityStart() = with(density) {
+ val sizeDp = 35.dp
+ val size = sizeDp.toIntPx()
+
+ val drawLatch = CountDownLatch(2)
+ val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+ show {
+ Column(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+ Container(LayoutSize(sizeDp, sizeDp)) {
+ OnPositioned( coordinates ->
+ childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+
+ Container(LayoutSize(sizeDp * 2, sizeDp * 2)) {
+ OnPositioned( coordinates ->
+ childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+ }
+ }
+
+ assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+ val root = findAndroidComposeView()
+ waitForDraw(root)
+ val rootWidth = root.width.px
+
+ assertEquals(PxPosition(rootWidth - size.toPx(), 0.px), childPosition[0])
+ assertEquals(
+ PxPosition((rootWidth - (sizeDp * 2).toPx()).round().toPx(), size.toPx()),
+ childPosition[1]
+ )
+ }
+
+ @Test
+ fun testColumn_Rtl_gravityEnd() = with(density) {
+ val sizeDp = 50.dp
+ val size = sizeDp.toIntPx()
+
+ val drawLatch = CountDownLatch(2)
+ val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+ show {
+ Column(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+ Container(LayoutSize(sizeDp, sizeDp) + LayoutGravity.End) {
+ OnPositioned( coordinates ->
+ childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+
+ Container(LayoutSize(sizeDp * 2, sizeDp * 2) + LayoutGravity.End) {
+ OnPositioned( coordinates ->
+ childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+ }
+ }
+
+ assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+ assertEquals(PxPosition(0.px, 0.px), childPosition[0])
+ assertEquals(PxPosition(0.px, size.toPx()), childPosition[1])
+ }
+
+ @Test
+ fun testColumn_Rtl_gravityRelativeToSiblings() = with(density) {
+ val sizeDp = 50.dp
+ val size = sizeDp.toIntPx()
+
+ val drawLatch = CountDownLatch(2)
+ val childPosition = arrayOf(PxPosition.Origin, PxPosition.Origin)
+ show {
+ Column(LayoutWidth.Fill + LayoutDirectionModifier.Rtl) {
+ Container(LayoutSize(sizeDp, sizeDp) +
+ LayoutGravity.RelativeToSiblings { it.width }
+ ) {
+ OnPositioned( coordinates ->
+ childPosition[0] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+
+ Container(LayoutSize(sizeDp, sizeDp) +
+ LayoutGravity.RelativeToSiblings { it.width / 2 }
+ ) {
+ OnPositioned( coordinates ->
+ childPosition[1] = coordinates.localToGlobal(PxPosition(0.px, 0.px))
+ drawLatch.countDown()
+ })
+ }
+ }
+ }
+
+ assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+ val root = findAndroidComposeView()
+ waitForDraw(root)
+ val rootWidth = root.width.px
+
+ assertEquals(PxPosition(rootWidth - size.toPx(), 0.px), childPosition[0])
+ assertEquals(
+ PxPosition((rootWidth - size.toPx() * 1.5f).round().toPx(), size.toPx()),
+ childPosition[1]
+ )
+ }
+
+ // endregion
}
private val TestHorizontalLine = HorizontalAlignmentLine(::min)
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
index f63bcf9..2242e5e 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
@@ -27,11 +27,13 @@
import androidx.ui.core.AndroidComposeView
import androidx.ui.core.Constraints
import androidx.ui.core.Layout
+import androidx.ui.core.LayoutDirection
import androidx.ui.core.Modifier
import androidx.ui.core.OnPositioned
import androidx.ui.core.Ref
import androidx.ui.core.enforce
import androidx.ui.core.setContent
+import androidx.ui.layout.Arrangement
import androidx.ui.layout.Constraints
import androidx.ui.layout.DpConstraints
import androidx.ui.unit.Density
@@ -292,20 +294,56 @@
)
}
- internal val customArrangement = { totalSize: IntPx, size: List<IntPx> ->
- val usedSpace = size.fold(0.ipx) { sum, e -> sum + e }
- val step = if (size.size < 2) {
- 0.px
- } else {
- (totalSize - usedSpace).toPx() * 2 / (size.lastIndex * size.size)
+ internal val customVerticalArrangement = object : Arrangement.Vertical {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ): List<IntPx> {
+ val positions = mutableListOf<IntPx>()
+ var current = 0.px
+ val usedSpace = size.fold(0.ipx) { sum, e -> sum + e }
+ val step = if (size.size < 2) {
+ 0.px
+ } else {
+ (totalSize - usedSpace).toPx() * 2 / (size.lastIndex * size.size)
+ }
+ size.forEachIndexed { i, childSize ->
+ current += step * i
+ positions.add(current.round())
+ current += childSize.toPx()
+ }
+ return positions
}
- val positions = mutableListOf<IntPx>()
- var current = 0.px
- size.forEachIndexed { i, childSize ->
- current += step * i
- positions.add(current.round())
- current += childSize.toPx()
+ }
+
+ internal val customHorizontalArrangement = object : Arrangement.Horizontal {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ): List<IntPx> {
+ val positions = mutableListOf<IntPx>()
+ var current = 0.px
+ if (layoutDirection == LayoutDirection.Rtl) {
+ size.forEach {
+ positions.add(current.round())
+ current += it
+ }
+ } else {
+ val usedSpace = size.fold(0.ipx) { sum, e -> sum + e }
+ val step = if (size.size < 2) {
+ 0.px
+ } else {
+ (totalSize - usedSpace).toPx() * 2 / (size.lastIndex * size.size)
+ }
+ size.forEachIndexed { i, childSize ->
+ current += step * i
+ positions.add(current.round())
+ current += childSize.toPx()
+ }
+ }
+ return positions
}
- positions
}
}
\ No newline at end of file
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
index 701c398..b1cbb48 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
@@ -26,6 +26,7 @@
import androidx.ui.core.IntrinsicMeasurable
import androidx.ui.core.IntrinsicMeasureBlock
import androidx.ui.core.Layout
+import androidx.ui.core.LayoutDirection
import androidx.ui.core.Modifier
import androidx.ui.core.ParentDataModifier
import androidx.ui.core.Placeable
@@ -226,7 +227,7 @@
@Composable
fun Row(
modifier: Modifier = Modifier.None,
- arrangement: Arrangement = Arrangement.Begin,
+ arrangement: Arrangement.Horizontal = Arrangement.Start,
children: @Composable() RowScope.() -> Unit
) {
FlexLayout(
@@ -270,7 +271,7 @@
@Composable
fun Column(
modifier: Modifier = Modifier.None,
- arrangement: Arrangement = Arrangement.Begin,
+ arrangement: Arrangement.Vertical = Arrangement.Top,
children: @Composable() ColumnScope.() -> Unit
) {
FlexLayout(
@@ -313,6 +314,8 @@
* Used to specify the alignment of a layout's children, in main axis direction.
*/
enum class MainAxisAlignment(internal val arrangement: Arrangement) {
+ // TODO(soboleva) support RTl in Flow
+ // workaround for now - use Arrangement that equals to previous Arrangement
/**
* Place children such that they are as close as possible to the middle of the main axis.
*/
@@ -320,12 +323,11 @@
/**
* Place children such that they are as close as possible to the start of the main axis.
*/
- // TODO(popam): Consider rtl directionality.
- Start(Arrangement.Begin),
+ Start(Arrangement.Top),
/**
* Place children such that they are as close as possible to the end of the main axis.
*/
- End(Arrangement.End),
+ End(Arrangement.Bottom),
/**
* Place children such that they are spaced evenly across the main axis, including free
* space before the first child and after the last child.
@@ -347,46 +349,96 @@
/**
* Used to specify the arrangement of the layout's children in [Row] or [Column] in the main axis
* direction (horizontal and vertical, respectively).
- * @constructor Creates an arrangement using the [arrangeBlock]. Use it to provide your own
+ * @constructor Creates an arrangement using the [arrange] function. Use it to provide your own
* arrangement of the layout's children.
*/
@Immutable
-class Arrangement(
- internal val arrangeBlock: (totalSize: IntPx, elementSize: List<IntPx>) -> List<IntPx>
-) {
- companion object {
- /**
- * Place children such that they are as close as possible to the beginning of the main axis.
- */
- // TODO(soboleva/popam): Consider rtl directionality.
- val Begin = Arrangement { _, size ->
- val positions = mutableListOf<IntPx>()
- var current = 0.ipx
- size.forEach {
- positions.add(current)
- current += it
- }
- positions
- }
+interface Arrangement {
+ /**
+ * Places the layout children inside the parent layout along the main axis.
+ *
+ * @param totalSize Available space that can be occupied by the children.
+ * @param size A list of sizes of all children.
+ * @param layoutDirection A layout direction, left-to-right or right-to-left, of the parent
+ * layout that should be taken into account when determining positions of the children in
+ * horizontal direction.
+ */
+ fun arrange(totalSize: IntPx, size: List<IntPx>, layoutDirection: LayoutDirection): List<IntPx>
- /**
- * Place children such that they are as close as possible to the end of the main axis.
- */
- val End = Arrangement { totalSize, size ->
- val consumedSize = size.fold(0.ipx) { a, b -> a + b }
- val positions = mutableListOf<IntPx>()
- var current = totalSize - consumedSize
- size.forEach {
- positions.add(current)
- current += it
- }
- positions
+ /**
+ * Used to specify the vertical arrangement of the layout's children in a [Column].
+ */
+ interface Vertical : Arrangement
+ /**
+ * Used to specify the horizontal arrangement of the layout's children in a [Row].
+ */
+ interface Horizontal : Arrangement
+
+ /**
+ * Place children horizontally such that they are as close as possible to the beginning of the
+ * main axis.
+ */
+ object Start : Horizontal {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ) = if (layoutDirection == LayoutDirection.Ltr) {
+ placeLeftOrTop(size)
+ } else {
+ placeRightOrBottom(totalSize, size)
}
+ }
- /**
- * Place children such that they are as close as possible to the middle of the main axis.
- */
- val Center = Arrangement { totalSize, size ->
+ /**
+ * Place children horizontally such that they are as close as possible to the end of the main
+ * axis.
+ */
+ object End : Horizontal {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ) = if (layoutDirection == LayoutDirection.Ltr) {
+ placeRightOrBottom(totalSize, size)
+ } else {
+ placeLeftOrTop(size)
+ }
+ }
+
+ /**
+ * Place children vertically such that they are as close as possible to the top of the main
+ * axis.
+ */
+ object Top : Vertical {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ) = placeLeftOrTop(size)
+ }
+
+ /**
+ * Place children vertically such that they are as close as possible to the bottom of the main
+ * axis.
+ */
+ object Bottom : Vertical {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ) = placeRightOrBottom(totalSize, size)
+ }
+
+ /**
+ * Place children such that they are as close as possible to the middle of the main axis.
+ */
+ object Center : Vertical, Horizontal {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ): List<IntPx> {
val consumedSize = size.fold(0.ipx) { a, b -> a + b }
val positions = mutableListOf<IntPx>()
var current = (totalSize - consumedSize).toPx() / 2
@@ -394,14 +446,20 @@
positions.add(current.round())
current += it
}
- positions
+ return positions
}
+ }
- /**
- * Place children such that they are spaced evenly across the main axis, including free
- * space before the first child and after the last child.
- */
- val SpaceEvenly = Arrangement { totalSize, size ->
+ /**
+ * Place children such that they are spaced evenly across the main axis, including free
+ * space before the first child and after the last child.
+ */
+ object SpaceEvenly : Vertical, Horizontal {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ): List<IntPx> {
val consumedSize = size.fold(0.ipx) { a, b -> a + b }
val gapSize = (totalSize - consumedSize).toPx() / (size.size + 1)
val positions = mutableListOf<IntPx>()
@@ -410,14 +468,20 @@
positions.add(current.round())
current += it.toPx() + gapSize
}
- positions
+ return positions
}
+ }
- /**
- * Place children such that they are spaced evenly across the main axis, without free
- * space before the first child or after the last child.
- */
- val SpaceBetween = Arrangement { totalSize, size ->
+ /**
+ * Place children such that they are spaced evenly across the main axis, without free
+ * space before the first child or after the last child.
+ */
+ object SpaceBetween : Vertical, Horizontal {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ): List<IntPx> {
val consumedSize = size.fold(0.ipx) { a, b -> a + b }
val gapSize = if (size.size > 1) {
(totalSize - consumedSize).toPx() / (size.size - 1)
@@ -430,15 +494,21 @@
positions.add(current.round())
current += it.toPx() + gapSize
}
- positions
+ return positions
}
+ }
- /**
- * Place children such that they are spaced evenly across the main axis, including free
- * space before the first child and after the last child, but half the amount of space
- * existing otherwise between two consecutive children.
- */
- val SpaceAround = Arrangement { totalSize, size ->
+ /**
+ * Place children such that they are spaced evenly across the main axis, including free
+ * space before the first child and after the last child, but half the amount of space
+ * existing otherwise between two consecutive children.
+ */
+ object SpaceAround : Vertical, Horizontal {
+ override fun arrange(
+ totalSize: IntPx,
+ size: List<IntPx>,
+ layoutDirection: LayoutDirection
+ ): List<IntPx> {
val consumedSize = size.fold(0.ipx) { a, b -> a + b }
val gapSize = if (size.isNotEmpty()) {
(totalSize - consumedSize).toPx() / size.size
@@ -451,7 +521,29 @@
positions.add(current.round())
current += it.toPx() + gapSize
}
- positions
+ return positions
+ }
+ }
+
+ private companion object {
+ private fun placeRightOrBottom(totalSize: IntPx, size: List<IntPx>): List<IntPx> {
+ val consumedSize = size.fold(0.ipx) { a, b -> a + b }
+ val positions = mutableListOf<IntPx>()
+ var current = totalSize - consumedSize
+ size.forEach {
+ positions.add(current)
+ current += it
+ }
+ return positions
+ }
+ private fun placeLeftOrTop(size: List<IntPx>): List<IntPx> {
+ val positions = mutableListOf<IntPx>()
+ var current = 0.ipx
+ size.forEach {
+ positions.add(current)
+ current += it
+ }
+ return positions
}
}
}
@@ -575,7 +667,15 @@
minIntrinsicHeightMeasureBlock = MinIntrinsicHeightMeasureBlock(orientation),
maxIntrinsicWidthMeasureBlock = MaxIntrinsicWidthMeasureBlock(orientation),
maxIntrinsicHeightMeasureBlock = MaxIntrinsicHeightMeasureBlock(orientation)
- ) { measurables, outerConstraints ->
+ ) { ltrMeasurables, outerConstraints ->
+ // rtl support
+ val measurables = if (orientation == LayoutOrientation.Horizontal &&
+ layoutDirection == LayoutDirection.Rtl) {
+ ltrMeasurables.asReversed()
+ } else {
+ ltrMeasurables
+ }
+
val constraints = OrientationIndependentConstraints(outerConstraints, orientation)
var totalFlex = 0f
@@ -703,16 +803,31 @@
}
layout(layoutWidth, layoutHeight) {
val childrenMainAxisSize = placeables.map { it!!.mainAxisSize() }
- val mainAxisPositions =
- arrangement.arrangeBlock(mainAxisLayoutSize, childrenMainAxisSize)
+ val mainAxisPositions = arrangement.arrange(
+ mainAxisLayoutSize,
+ childrenMainAxisSize,
+ layoutDirection
+ )
placeables.forEachIndexed { index, placeable ->
placeable!!
- val childCrossAlignment =
- measurables[index].crossAxisAlignment ?: crossAxisAlignment
+ val measurable = measurables[index]
+ val childCrossAlignment = measurable.crossAxisAlignment ?: crossAxisAlignment
+ val isRtlColumn = orientation == LayoutOrientation.Vertical &&
+ layoutDirection == LayoutDirection.Rtl
val crossAxis = when (childCrossAlignment) {
- CrossAxisAlignment.Start -> IntPx.Zero
+ CrossAxisAlignment.Start -> {
+ if (isRtlColumn) {
+ crossAxisLayoutSize - placeable.crossAxisSize()
+ } else {
+ IntPx.Zero
+ }
+ }
CrossAxisAlignment.End -> {
- crossAxisLayoutSize - placeable.crossAxisSize()
+ if (isRtlColumn) {
+ IntPx.Zero
+ } else {
+ crossAxisLayoutSize - placeable.crossAxisSize()
+ }
}
CrossAxisAlignment.Center -> {
Alignment.Center.align(
@@ -723,15 +838,21 @@
).y
}
else -> {
- val provider = measurables[index].crossAxisAlignment?.alignmentLineProvider
- ?: crossAxisAlignment.alignmentLineProvider
+ val provider = childCrossAlignment.alignmentLineProvider
val alignmentLinePosition = when (provider) {
is AlignmentLineProvider.Block -> provider.lineProviderBlock(placeable)
is AlignmentLineProvider.Value -> placeable[provider.line]
else -> null
}
if (alignmentLinePosition != null) {
- beforeCrossAxisAlignmentLine - alignmentLinePosition
+ val line = beforeCrossAxisAlignmentLine - alignmentLinePosition
+ if (orientation == LayoutOrientation.Vertical &&
+ layoutDirection == LayoutDirection.Rtl
+ ) {
+ layoutWidth - line - placeable.width
+ } else {
+ line
+ }
} else {
IntPx.Zero
}
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt
index 220f9fa..34fac1a 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Flow.kt
@@ -236,8 +236,13 @@
} else {
lastLineMainAxisAlignment.arrangement
}
- val mainAxisPositions =
- arrangement.arrangeBlock(mainAxisLayoutSize, childrenMainAxisSizes)
+ // TODO(soboleva): rtl support
+ // Handle vertical direction
+ val mainAxisPositions = arrangement.arrange(
+ mainAxisLayoutSize,
+ childrenMainAxisSizes,
+ layoutDirection
+ )
placeables.forEachIndexed { j, placeable ->
val crossAxis = when (crossAxisAlignment) {
FlowCrossAxisAlignment.Start -> IntPx.Zero
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt
index 2d124b7..7a81533 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/FloatingActionButtonActivity.kt
@@ -19,11 +19,11 @@
import android.util.Log
import androidx.compose.Composable
import androidx.ui.graphics.imageFromResource
-import androidx.ui.layout.Arrangement
import androidx.ui.layout.Center
import androidx.ui.layout.Column
import androidx.ui.layout.LayoutGravity
import androidx.ui.layout.LayoutHeight
+import androidx.ui.layout.Arrangement
import androidx.ui.material.FloatingActionButton
class FloatingActionButtonActivity : MaterialDemoActivity() {
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt
index 4984550..67e21ed 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ProgressIndicatorActivity.kt
@@ -22,8 +22,8 @@
import androidx.compose.onActive
import androidx.compose.onDispose
import androidx.ui.graphics.Color
-import androidx.ui.layout.Arrangement
import androidx.ui.layout.Column
+import androidx.ui.layout.Arrangement
import androidx.ui.layout.LayoutGravity
import androidx.ui.layout.LayoutWidth
import androidx.ui.layout.Row