Add aspect ratio modifier
Test: gradlew buildOnServer. Unit tests. Rewrote all usages of the AspectRatio
composable with the modifier in samples/unit tests (separate CL for
that) and verified.
Change-Id: I9e607b553f3a8ccde7af4686f2466b53603305d4
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/AspectRatioModifierTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/AspectRatioModifierTest.kt
new file mode 100644
index 0000000..d7a3575
--- /dev/null
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/AspectRatioModifierTest.kt
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2019 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.test
+
+import androidx.compose.Children
+import androidx.compose.composer
+import androidx.test.filters.SmallTest
+import androidx.ui.core.Constraints
+import androidx.ui.core.IntPx
+import androidx.ui.core.Layout
+import androidx.ui.core.PxPosition
+import androidx.ui.core.PxSize
+import androidx.ui.core.Ref
+import androidx.ui.core.dp
+import androidx.ui.core.ipx
+import androidx.ui.core.px
+import androidx.ui.core.withDensity
+import androidx.ui.layout.Container
+import androidx.ui.layout.AspectRatio
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import java.lang.IllegalArgumentException
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@SmallTest
+@RunWith(JUnit4::class)
+class AspectRatioModifierTest : LayoutTest() {
+ @Test
+ fun testAspectRatioModifier_intrinsicDimensions() = withDensity(density) {
+ testIntrinsics(@Children {
+ Container(modifier = AspectRatio(2f), width = 30.dp, height = 40.dp) { }
+ }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+ assertEquals(40.ipx, minIntrinsicWidth(20.ipx))
+ assertEquals(40.ipx, maxIntrinsicWidth(20.ipx))
+ assertEquals(20.ipx, minIntrinsicHeight(40.ipx))
+ assertEquals(20.ipx, maxIntrinsicHeight(40.ipx))
+
+ assertEquals(30.dp.toIntPx(), minIntrinsicWidth(IntPx.Infinity))
+ assertEquals(30.dp.toIntPx(), maxIntrinsicWidth(IntPx.Infinity))
+ assertEquals(40.dp.toIntPx(), minIntrinsicHeight(IntPx.Infinity))
+ assertEquals(40.dp.toIntPx(), maxIntrinsicHeight(IntPx.Infinity))
+ }
+ }
+
+ @Test(expected = IllegalArgumentException::class)
+ fun testAspectRatioModifier_zeroRatio() {
+ show {
+ Container(AspectRatio(0f)) { }
+ }
+ }
+
+ @Test(expected = IllegalArgumentException::class)
+ fun testAspectRatioModifier_negativeRatio() {
+ show {
+ Container(AspectRatio(-2f)) { }
+ }
+ }
+
+ @Test
+ fun testAspectRatio_sizesCorrectly() {
+ assertEquals(PxSize(30.px, 30.px), getSize(1f, Constraints(maxWidth = 30.ipx)))
+ assertEquals(PxSize(30.px, 15.px), getSize(2f, Constraints(maxWidth = 30.ipx)))
+ assertEquals(
+ PxSize(10.px, 10.px),
+ getSize(1f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
+ )
+ assertEquals(
+ PxSize(20.px, 10.px),
+ getSize(2f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
+ )
+ assertEquals(
+ PxSize(10.px, 5.px),
+ getSize(2f, Constraints(minWidth = 10.ipx, minHeight = 5.ipx))
+ )
+ assertEquals(
+ PxSize(20.px, 10.px),
+ getSize(2f, Constraints(minWidth = 5.ipx, minHeight = 10.ipx))
+ )
+ }
+
+ private fun getSize(aspectRatio: Float, childContraints: Constraints): PxSize {
+ val positionedLatch = CountDownLatch(1)
+ val size = Ref<PxSize>()
+ val position = Ref<PxPosition>()
+ show {
+ Layout(@Children {
+ Container(AspectRatio(aspectRatio)) {
+ SaveLayoutInfo(size, position, positionedLatch)
+ }
+ }) { measurables, incomingConstraints ->
+ require(measurables.isNotEmpty())
+ val placeable = measurables.first().measure(childContraints)
+ layout(incomingConstraints.maxWidth, incomingConstraints.maxHeight) {
+ placeable.place(0.ipx, 0.ipx)
+ }
+ }
+ }
+ positionedLatch.await(1, TimeUnit.SECONDS)
+ return size.value!!
+ }
+}
\ No newline at end of file