use of com.android.tools.idea.rendering.RenderLogger in project android by JetBrains.
the class ConstraintModel method updateConstraintLayoutRoots.
/**
* Traverse the hierarchy to find all ConstraintLayout instances
* and update them. We set all the wrap_content sizes of the ConstraintLayout children
* from layout lib
* @param container
*
*/
private void updateConstraintLayoutRoots(WidgetContainer container) {
if (container == null) {
return;
}
Map<NlComponent, Dimension> wrapContentSizes = Maps.newHashMap();
if (container instanceof ConstraintWidgetContainer) {
NlComponent component = (NlComponent) ((WidgetCompanion) container.getCompanionWidget()).getWidgetModel();
Insets padding = component.getPadding(true);
container.setDimension(pxToDp(component.w - padding.width()), pxToDp(component.h - padding.height()));
int x = pxToDp(component.x);
int y = pxToDp(component.y);
x += pxToDp(padding.left);
y += pxToDp(padding.top);
WidgetContainer parentContainer = (WidgetContainer) container.getParent();
if (parentContainer != null) {
if (!(parentContainer instanceof ConstraintWidgetContainer)) {
x = pxToDp(component.x - component.getParent().x);
y = pxToDp(component.y - component.getParent().y);
} else {
x -= parentContainer.getDrawX();
y -= parentContainer.getDrawY();
}
}
if (container.getX() != x || container.getY() != y) {
container.setOrigin(x, y);
container.forceUpdateDrawPosition();
}
}
if (!(container instanceof ConstraintWidgetContainer)) {
NlComponent component = (NlComponent) ((WidgetCompanion) container.getCompanionWidget()).getWidgetModel();
container.setDimension(pxToDp(component.w), pxToDp(component.h));
}
if (container instanceof ConstraintWidgetContainer && container.getChildren().size() > 0) {
NlComponent root = (NlComponent) ((WidgetCompanion) container.getCompanionWidget()).getWidgetModel();
XmlTag parentTag = root.getTag();
if (parentTag.isValid()) {
Map<XmlTag, NlComponent> tagToComponent = Maps.newHashMapWithExpectedSize(root.getChildCount());
for (NlComponent child : root.getChildren()) {
tagToComponent.put(child.getTag(), child);
}
XmlFile xmlFile = myNlModel.getFile();
AndroidFacet facet = myNlModel.getFacet();
RenderService renderService = RenderService.get(facet);
RenderLogger logger = renderService.createLogger();
final RenderTask task = renderService.createTask(xmlFile, myNlModel.getConfiguration(), logger, null);
if (task != null) {
// Measure wrap_content bounds
Map<XmlTag, ViewInfo> map = task.measureChildren(parentTag, new RenderTask.AttributeFilter() {
@Override
public String getAttribute(@NotNull XmlTag n, @Nullable String namespace, @NotNull String localName) {
// Change attributes to wrap_content
if (ATTR_LAYOUT_WIDTH.equals(localName) && ANDROID_URI.equals(namespace)) {
return VALUE_WRAP_CONTENT;
}
if (ATTR_LAYOUT_HEIGHT.equals(localName) && ANDROID_URI.equals(namespace)) {
return VALUE_WRAP_CONTENT;
}
return null;
}
});
task.dispose();
if (map != null) {
for (Map.Entry<XmlTag, ViewInfo> entry : map.entrySet()) {
ViewInfo viewInfo = entry.getValue();
viewInfo = RenderService.getSafeBounds(viewInfo);
Dimension size = new Dimension(viewInfo.getRight() - viewInfo.getLeft(), viewInfo.getBottom() - viewInfo.getTop());
NlComponent child = tagToComponent.get(entry.getKey());
if (child != null) {
wrapContentSizes.put(child, size);
}
}
}
}
}
}
for (ConstraintWidget child : container.getChildren()) {
NlComponent component = (NlComponent) ((WidgetCompanion) child.getCompanionWidget()).getWidgetModel();
Dimension dimension = wrapContentSizes.get(component);
if (dimension != null) {
child.setWrapWidth(pxToDp((int) dimension.getWidth()));
child.setWrapHeight(pxToDp((int) dimension.getHeight()));
}
if (child instanceof WidgetContainer) {
updateConstraintLayoutRoots((WidgetContainer) child);
}
}
}
Aggregations