public static int getViewMeasureSpec(int sizeSpec) { switch (getMode(sizeSpec)) { case SizeSpec.EXACTLY: return MeasureSpec.makeMeasureSpec(getSize(sizeSpec), MeasureSpec.EXACTLY); case SizeSpec.AT_MOST: return MeasureSpec.makeMeasureSpec(getSize(sizeSpec), MeasureSpec.AT_MOST); case SizeSpec.UNSPECIFIED: return MeasureSpec.makeMeasureSpec(getSize(sizeSpec), MeasureSpec.UNSPECIFIED); default: throw new IllegalStateException("Unexpected size spec mode"); } }
private static int getResultSizePxWithSpecAndDesiredPx(int spec, int desiredSize) { final int mode = SizeSpec.getMode(spec); switch (mode) { case SizeSpec.UNSPECIFIED: return desiredSize; case SizeSpec.AT_MOST: return Math.min(SizeSpec.getSize(spec), desiredSize); case SizeSpec.EXACTLY: return SizeSpec.getSize(spec); default: throw new IllegalStateException("Unexpected size spec mode"); } }
@Override public synchronized void computeLayoutAsync( ComponentContext context, int widthSpec, int heightSpec) { mComponentTree = mock(ComponentTree.class); mTreeValid = true; mLastRequestedWidthSpec = widthSpec; mLastRequestedHeightSpec = heightSpec; mLayoutAsyncCalled = true; mChildWidth = SizeSpec.getSize(widthSpec); mChildHeight = SizeSpec.getSize(heightSpec); }
@Override public void computeLayoutSync( ComponentContext context, int widthSpec, int heightSpec, Size size) { mComponentTree = mock(ComponentTree.class); mTreeValid = true; mLastRequestedWidthSpec = widthSpec; mLastRequestedHeightSpec = heightSpec; if (size != null) { size.width = SizeSpec.getSize(widthSpec); size.height = SizeSpec.getSize(heightSpec); } mLayoutSyncCalled = true; }
void setStyleWidthFromSpec(int widthSpec) { switch (SizeSpec.getMode(widthSpec)) { case SizeSpec.UNSPECIFIED: mYogaNode.setWidth(YogaConstants.UNDEFINED); break; case SizeSpec.AT_MOST: mYogaNode.setMaxWidth(SizeSpec.getSize(widthSpec)); break; case SizeSpec.EXACTLY: mYogaNode.setWidth(SizeSpec.getSize(widthSpec)); break; } }
void setStyleHeightFromSpec(int heightSpec) { switch (SizeSpec.getMode(heightSpec)) { case SizeSpec.UNSPECIFIED: mYogaNode.setHeight(YogaConstants.UNDEFINED); break; case SizeSpec.AT_MOST: mYogaNode.setMaxHeight(SizeSpec.getSize(heightSpec)); break; case SizeSpec.EXACTLY: mYogaNode.setHeight(SizeSpec.getSize(heightSpec)); break; } }
@Override public int getChildWidthSpec(int widthSpec, RenderInfo renderInfo) { return SizeSpec.makeSizeSpec(SizeSpec.getSize(widthSpec), AT_MOST); } })
@Test public void testSetSizeSpecWithOutput() { ComponentTree componentTree = ComponentTree.create(mContext, mComponent) .build(); Size size = new Size(); componentTree.setSizeSpec(mWidthSpec, mHeightSpec, size); assertEquals(SizeSpec.getSize(mWidthSpec), size.width, 0.0); assertEquals(SizeSpec.getSize(mHeightSpec), size.height, 0.0); // Since this happens post creation, it's not in general safe to update the main thread layout // state synchronously, so the result should be in the background layout state postSizeSpecChecks(componentTree, "mBackgroundLayoutState"); }
@Test public void testGetChildMeasureSpecOverride() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); when(renderInfo.getCustomAttribute(GridLayoutInfo.OVERRIDE_SIZE)).thenReturn(20); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo(20); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testFullSpanChildWidthSpec() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo(200); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testFullSpanChildHeightSpec() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo(200); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecVertical() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo((200 / 3) * 2); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecHorizontal() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo((200 / 3) * 2); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); }
@Test public void testGetChildMeasureSpecVertical() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(1); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo((200 / 3) * 1); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecHorizontal() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(1); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo((200 / 3) * 1); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); }
@Test public void testGetChildMeasureSpecVerticalWithFullSpan() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo((200 / 3) * 3); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecHorizontalWithFullSpan() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo((200 / 3) * 3); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); }
@Test public void testSetSizeSpecWithOutputWhenAttachedToViewWithNewSpec() { ComponentTree componentTree = ComponentTree.create(mContext, mComponent).build(); componentTree.setLithoView(new LithoView(mContext)); Size size = new Size(); componentTree.measure(mWidthSpec2, mHeightSpec2, new int[2], false); componentTree.attach(); componentTree.setSizeSpec(mWidthSpec, mHeightSpec, size); assertEquals(SizeSpec.getSize(mWidthSpec), size.width, 0.0); assertEquals(SizeSpec.getSize(mHeightSpec), size.height, 0.0); assertThat(componentTree.hasCompatibleLayout(mWidthSpec, mHeightSpec)).isTrue(); assertThat(componentTree.getRoot()).isEqualTo(mComponent); }
@Test public void testSetSizeSpecWithOutputWhenAttachedToViewWithSameSpec() { ComponentTree componentTree = ComponentTree.create(mContext, mComponent).build(); componentTree.setLithoView(new LithoView(mContext)); Size size = new Size(); componentTree.measure(mWidthSpec, mHeightSpec, new int[2], false); componentTree.attach(); componentTree.setSizeSpec(mWidthSpec, mHeightSpec, size); assertEquals(SizeSpec.getSize(mWidthSpec), size.width, 0.0); assertEquals(SizeSpec.getSize(mHeightSpec), size.height, 0.0); assertThat(componentTree.hasCompatibleLayout(mWidthSpec, mHeightSpec)).isTrue(); assertThat(componentTree.getRoot()).isEqualTo(mComponent); }