package com.mozz.htmlnative.css.stylehandler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.webkit.WebView; import android.widget.AbsoluteLayout; import android.widget.ImageView; import android.widget.TextView; import com.google.android.flexbox.FlexboxLayout; import com.mozz.htmlnative.view.HNDiv; import java.util.HashMap; import java.util.Map; /** * @author Yang Tao, 17/4/17. */ public final class StyleHandlerFactory { private static TextViewStyleHandler sText = new TextViewStyleHandler(); private static ImageViewStyleHandler sImage = new ImageViewStyleHandler(); private static HtmlLayoutStyleHandler sLinear = new HtmlLayoutStyleHandler(); private static FlexBoxLayoutStyleHandler sFlex = new FlexBoxLayoutStyleHandler(); private static WebViewStyleHandler sWebview = new WebViewStyleHandler(); private static AbsoluteStyleHandler sAbsolute = new AbsoluteStyleHandler(); @NonNull private static Map<Class<? extends View>, StyleHandler> sAttrHandlerCache = new HashMap<>(); private static Map<Class<? extends View>, StyleHandler> sExtraAttrHandlerCache = new HashMap<>(); private StyleHandlerFactory() { } //TODO there is much can be done when dealing with the StyleHandler public static StyleHandler byClass(@NonNull Class<? extends View> clazz) { if (TextView.class.isAssignableFrom(clazz)) { return sText; } else if (ImageView.class.isAssignableFrom(clazz)) { return sImage; } else if (clazz.equals(HNDiv.class)) { return sLinear; } else if (clazz.equals(FlexboxLayout.class)) { return sFlex; } else if (clazz.equals(WebView.class)) { return sWebview; } else if (clazz.equals(AbsoluteLayout.class)) { return sAbsolute; } else { return null; } } @Nullable public static StyleHandler get(View view) { Class<? extends View> vClazz = view.getClass(); StyleHandler styleHandler = sAttrHandlerCache.get(vClazz); if (styleHandler == null) { styleHandler = byClass(vClazz); if (styleHandler != null) { sAttrHandlerCache.put(vClazz, styleHandler); } } return styleHandler; } /** * Get styleHandler of view's parent */ public static LayoutStyleHandler parentGet(View view) { ViewParent parent = view.getParent(); if (parent instanceof ViewGroup) { StyleHandler parentStyleHandler = get((View) parent); LayoutStyleHandler parentLayoutAttr = null; if (parentStyleHandler instanceof LayoutStyleHandler) { parentLayoutAttr = (LayoutStyleHandler) parentStyleHandler; } return parentLayoutAttr; } else { return null; } } /** * Get StyleHandler from extra pools */ @Nullable public static StyleHandler extraGet(View view) { return sExtraAttrHandlerCache.get(view.getClass()); } public static StyleHandler registerExtraStyleHandler(Class<? extends View> viewClass, StyleHandler styleHandler) { return sExtraAttrHandlerCache.put(viewClass, styleHandler); } public static void clear() { sExtraAttrHandlerCache.clear(); sAttrHandlerCache.clear(); } }