in litho-core/src/main/java/com/facebook/litho/LayoutState.java [1403:1489]
private static void setSizeAfterMeasureAndCollectResults(
ComponentContext c, LayoutState layoutState) {
if (layoutState.getLayoutStateContext().isLayoutReleased()) {
return;
}
final boolean isTracing = ComponentsSystrace.isTracing();
final int widthSpec = layoutState.mWidthSpec;
final int heightSpec = layoutState.mHeightSpec;
final @Nullable LithoLayoutResult root = layoutState.mLayoutResult;
final @Nullable LithoNode node = root != null ? root.getNode() : null;
final int rootWidth = root != null ? root.getWidth() : 0;
final int rootHeight = root != null ? root.getHeight() : 0;
switch (SizeSpec.getMode(widthSpec)) {
case SizeSpec.EXACTLY:
layoutState.mWidth = SizeSpec.getSize(widthSpec);
break;
case SizeSpec.AT_MOST:
layoutState.mWidth = Math.max(0, Math.min(rootWidth, SizeSpec.getSize(widthSpec)));
break;
case SizeSpec.UNSPECIFIED:
layoutState.mWidth = rootWidth;
break;
}
switch (SizeSpec.getMode(heightSpec)) {
case SizeSpec.EXACTLY:
layoutState.mHeight = SizeSpec.getSize(heightSpec);
break;
case SizeSpec.AT_MOST:
layoutState.mHeight = Math.max(0, Math.min(rootHeight, SizeSpec.getSize(heightSpec)));
break;
case SizeSpec.UNSPECIFIED:
layoutState.mHeight = rootHeight;
break;
}
layoutState.clearLayoutStateOutputIdCalculator();
// Reset markers before collecting layout outputs.
layoutState.mCurrentHostMarker = -1;
if (root == null) {
return;
}
RenderTreeNode parent = null;
DebugHierarchy.Node hierarchy = null;
if (layoutState.mShouldAddHostViewForRootComponent) {
hierarchy = node != null ? getDebugHierarchy(null, node) : null;
addRootHostRenderTreeNode(layoutState, root, hierarchy);
parent = layoutState.mMountableOutputs.get(0);
layoutState.mCurrentLevel++;
layoutState.mCurrentHostMarker = parent.getRenderUnit().getId();
layoutState.mCurrentHostOutputPosition = 0;
}
if (isTracing) {
ComponentsSystrace.beginSection("collectResults");
}
collectResults(c, root, Preconditions.checkNotNull(node), layoutState, parent, null, hierarchy);
if (isTracing) {
ComponentsSystrace.endSection();
}
if (isTracing) {
ComponentsSystrace.beginSection("sortMountableOutputs");
}
sortTops(layoutState);
sortBottoms(layoutState);
if (isTracing) {
ComponentsSystrace.endSection();
}
if (!c.isReconciliationEnabled()
&& !ComponentsConfiguration.isDebugModeEnabled
&& !ComponentsConfiguration.isEndToEndTestRun
&& !ComponentsConfiguration.keepLithoNodes) {
layoutState.mRoot = null;
layoutState.mLayoutResult = null;
} else if (!ComponentsConfiguration.keepLayoutResults) {
layoutState.mLayoutResult = null;
}
}