package com.brian.floersch.uim.AssemblerV1; import android.content.Context; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; /** * Created by brian on 3/7/15. */ public class ViewAttributeHelper { private static final String MATCH_DP = "^\\d+dp$"; private static final String MATCH_PX = "^\\d+px$"; private static final String STRIP_CHARS = "[^0-9]"; private static final String MATCH_WRAP_CONTENT = "^wrap_content$"; private static final String MATCH_MATCH_PARENT = "^match_parent$"; private static final String MATCH_FILL_PARENT = "^fill_parent$"; private static final String MATCH_PADDING = "^padding"; private static final String PADDING = "padding"; private static final String PADDING_LEFT = "paddingLeft"; private static final String PADDING_RIGHT = "paddingRight"; private static final String PADDING_TOP = "paddingTop"; private static final String PADDING_BOTTOM = "paddingBottom"; protected static final HashMap<String, Integer> GRAVITY_MAP = new HashMap<String, Integer>() {{ put("top", Gravity.TOP); put("bottom", Gravity.BOTTOM); put("left", Gravity.LEFT); put("right", Gravity.RIGHT); put("center_vertical", Gravity.CENTER_VERTICAL); put("fill_vertical", Gravity.FILL_VERTICAL); put("center_horizontal", Gravity.CENTER_HORIZONTAL); put("fill_horizontal", Gravity.FILL_HORIZONTAL); put("center", Gravity.CENTER); put("fill", Gravity.FILL); put("clip_vertical", Gravity.CLIP_VERTICAL); put("clip_horizontal", Gravity.CLIP_HORIZONTAL); put("start", Gravity.START); put("end", Gravity.END); }}; public static int parseGravity(String gravityString) { String[] params = gravityString.split("\\|"); int gravity = 0; for (String s : params) { gravity |= GRAVITY_MAP.get(s); } return gravity; } public static int pxToDp(float px, Context context) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (px * scale + 0.5f); } public static int parseDim(String dim, Context context) { int outVal; String striped = dim.replaceAll(STRIP_CHARS,""); if (dim.matches(MATCH_DP)) { outVal = pxToDp(Integer.parseInt(striped), context); } else if (dim.matches(MATCH_PX)) { outVal = Integer.parseInt(striped); } else if (dim.matches(MATCH_MATCH_PARENT) || dim.matches(MATCH_FILL_PARENT)) { outVal = ViewGroup.LayoutParams.MATCH_PARENT; } else if (dim.matches(MATCH_WRAP_CONTENT)) { outVal = ViewGroup.LayoutParams.WRAP_CONTENT; } else { //DEFAULT (MAY CHANGE) outVal = ViewGroup.LayoutParams.WRAP_CONTENT; } return outVal; } public static void applyAttributes(JSONObject jsonObject, View view, Context context) throws JSONException { if (jsonObject.has(PADDING) || jsonObject.has(PADDING_LEFT) || jsonObject.has(PADDING_TOP) || jsonObject.has(PADDING_RIGHT) || jsonObject.has(PADDING_BOTTOM)) { applyPadding(jsonObject, context, view); } } private static void applyPadding(JSONObject jsonObject, Context context, View view) throws JSONException { int l,r,t,b; if (jsonObject.has(PADDING)) { l = r = t = b = parseDim(jsonObject.getString(PADDING), context); } else { l = view.getPaddingLeft(); r = view.getPaddingRight(); t = view.getPaddingTop(); b = view.getPaddingBottom(); } view.setPadding( jsonObject.has(PADDING_LEFT) ? parseDim(jsonObject.getString(PADDING_LEFT), context) : l, jsonObject.has(PADDING_TOP) ? parseDim(jsonObject.getString(PADDING_TOP), context) : t, jsonObject.has(PADDING_RIGHT) ? parseDim(jsonObject.getString(PADDING_RIGHT), context) : r, jsonObject.has(PADDING_BOTTOM) ? parseDim(jsonObject.getString(PADDING_BOTTOM), context) : b ); } }