package io.fabianterhorst.fastlayout.converters; import java.util.List; import io.fabianterhorst.fastlayout.annotations.Converter; /** * Created by fabianterhorst on 18.05.16. */ @Converter public class LayoutConverter { public LayoutAttribute convert(String attributeValue, String attributeName) { return onConvertLayoutAttributeValue(attributeValue, attributeName); } public List<LayoutAttribute> finish() { return onFinish(); } public LayoutAttribute onConvertLayoutAttributeValue(String attributeValue, String attributeName) { String attribute = String.valueOf(attributeValue); boolean isString = true; if ((attribute.startsWith("@") || attribute.startsWith("?")) && attribute.contains("/")) { String[] attributeSplit = attribute.split("/"); String type = attributeSplit[0].replace("@+", "").replace("@", "").replace("?", ""); if (type.contains(":")) { attribute = type.replace(":", ".R.") + "." + attributeSplit[1]; } else { attribute = "R." + type + "." + attributeSplit[1]; } isString = false; } if (attribute.startsWith("R.dimen.")) { return onConvertLayoutAttribute(attribute, "(int) getContext().getResources().getDimension(" + attribute + ")", attributeName, false); } else if (attribute.startsWith("R.string.")) { return onConvertLayoutAttribute(attribute, "getContext().getString(" + attribute + ")", attributeName, false); } else if (attribute.startsWith("R.color.")) { return onConvertLayoutAttribute(attribute, "getContext().getColor(" + attribute + ")", attributeName, false); } else if (attribute.startsWith("R.drawable.") || attribute.startsWith("R.mipmap.")) { return onConvertLayoutAttribute(attribute, "getContext().getResources().getDrawable(" + attribute + ")", attributeName, false); } else if (attribute.startsWith("R.attr.")) { return onConvertLayoutAttribute(attribute, "LayoutUtils.getAttrDrawable(getContext(), " + attribute + ")", attributeName, false); } else if (attribute.startsWith("R.style.")) { String attributeStyle = attribute.replace("R.style.", ""); String style = attributeStyle.replace(".", "_"); String styleAttribute = "R.style." + style; return onConvertLayoutAttribute(attribute, styleAttribute, attributeName, false); } else if (attribute.startsWith("android.R.style.")) { String attributeStyle = attribute.replace("android.R.style.", ""); String style = attributeStyle.replace(".", "_"); String styleAttribute = "android.R.style." + style; return onConvertLayoutAttribute(attribute, styleAttribute, attributeName, false); } else if ((attribute.endsWith("dp") || attribute.endsWith("dip")) && isNumber(attribute.replace("dip", "").replace("dp", ""))) { return onConvertLayoutAttribute(attribute, "LayoutUtils.convertDpToPixel(" + attribute.replace("dip", "f").replace("dp", "f") + ", getContext())", attributeName, false); } else if (attribute.equals("false") || attribute.equals("true")) { return onConvertLayoutAttribute(attribute, attributeName, false); } else if (attribute.endsWith("sp") && isNumber(attribute.replace("sp", ""))) { return onConvertLayoutAttribute(attribute, "LayoutUtils.convertSpToPixel(" + attribute.replace("sp", "f") + ", getContext())", attributeName, false); } else if (attribute.startsWith("#")) { //Todo : #999 isn“t working or #000 return onConvertLayoutAttribute(attribute, "android.graphics.Color.parseColor(\"" + attribute + "\")", attributeName, false); } else if (isNumber(attribute)) { return onConvertLayoutAttribute(attributeValue, attributeName, false); } return onConvertLayoutAttribute(attribute, attributeName, isString); } public LayoutAttribute onConvertLayoutAttribute(String attributeValue, String attributeName, boolean isString) { return onConvertLayoutAttribute(attributeValue, attributeValue, attributeName, isString); } public LayoutAttribute onConvertLayoutAttribute(String attributeStartValue, String attributeValue, String attributeName, boolean isString) { attributeName = attributeToName(attributeName); return new LayoutAttribute(setter(attributeName, attributeValue, isString)); } /** * convert a string to a constant schema * * @param string string * @return constant schema string */ public String stringToConstant(String string) { int length = string.length(); for (int i = 0; i < length; i++) { char character = string.charAt(i); if (character != "_".charAt(0) && Character.isUpperCase(character) && i != 0) { String firstPart = string.substring(0, i); String secondPart = string.substring(i, length); String newFirstPart = firstPart + "_"; string = newFirstPart + secondPart; i = newFirstPart.length(); length++; } } return string; } public String attributeToName(String attribute) { attribute = attribute.split(":")[1]; String[] split = attribute.split("_"); attribute = ""; for (String refactor : split) { attribute += capitalize(refactor); } return attribute; } public List<LayoutAttribute> onFinish() { return null; } public String setter(String name, String value, boolean isString) { return "set" + name + (isString ? "(\"" : "(") + value + (isString ? "\")" : ")"); } public String attribute(String name, Object value) { return name + " = " + value; } private boolean isNumber(Object text) { try { Double.parseDouble(String.valueOf(text)); return true; } catch (NumberFormatException ignore) { return false; } } private static String capitalize(String name) { if (name != null && name.length() != 0) { char[] chars = name.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); return new String(chars); } else { return name; } } }