You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/04/28 06:53:56 UTC

[28/48] incubator-weex git commit: * [android] Merge WeexCore-master to master.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java
index 4f9712f..5434bc0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java
@@ -23,9 +23,9 @@ import android.text.TextUtils;
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.common.WXRuntimeException;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.IFComponentHolder;
 import com.taobao.weex.ui.WXComponentRegistry;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.utils.WXLogUtils;
 
 import java.util.HashMap;
@@ -37,42 +37,45 @@ import java.util.Set;
  * Component factory
  */
 public class WXComponentFactory {
-  private static Map<String,Set<String>> sComponentTypes=new HashMap<>();
-  public static Set<String> getComponentTypesByInstanceId(String instanceId){
+  private static Map<String, Set<String>> sComponentTypes = new HashMap<>();
+
+  public static Set<String> getComponentTypesByInstanceId(String instanceId) {
     return sComponentTypes.get(instanceId);
   }
-  public static void removeComponentTypesByInstanceId(String instanceId){
+
+  public static void removeComponentTypesByInstanceId(String instanceId) {
     sComponentTypes.remove(instanceId);
   }
 
-  public static WXComponent newInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) {
-    if (instance == null || node == null || TextUtils.isEmpty(node.getType()) ) {
+  public static WXComponent newInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+    if (instance == null || TextUtils.isEmpty(basicComponentData.mComponentType)) {
       return null;
     }
 
-
-    if(sComponentTypes.get(instance.getInstanceId())==null){
-      Set<String> types=new HashSet<>();
-      sComponentTypes.put(instance.getInstanceId(),types);
+    if (sComponentTypes.get(instance.getInstanceId()) == null) {
+      Set<String> types = new HashSet<>();
+      sComponentTypes.put(instance.getInstanceId(), types);
     }
-    sComponentTypes.get(instance.getInstanceId()).add(node.getType());
+    sComponentTypes.get(instance.getInstanceId()).add(basicComponentData.mComponentType);
 
-    IFComponentHolder holder = WXComponentRegistry.getComponent(node.getType());
+    IFComponentHolder holder = WXComponentRegistry.getComponent(basicComponentData.mComponentType);
     if (holder == null) {
+      if (WXEnvironment.isApkDebugable()) {
         String tag = "WXComponentFactory error type:[" +
-                node.getType() + "]" + " class not found";
+                basicComponentData.mComponentType + "]" + " class not found";
         WXLogUtils.e(tag);
+      }
       //For compatible reason of JS framework, unregistered type will be treated as container.
       holder = WXComponentRegistry.getComponent(WXBasicComponentType.CONTAINER);
-      if(holder == null){
+      if (holder == null) {
         throw new WXRuntimeException("Container component not found.");
       }
     }
 
     try {
-      return holder.createInstance(instance, node, parent);
-    } catch (Exception e) {
-      WXLogUtils.e("WXComponentFactory Exception type:[" + node.getType() + "] ", e);
+      return holder.createInstance(instance, parent, basicComponentData);
+    } catch (Throwable e) {
+      WXLogUtils.e("WXComponentFactory Exception type:[" + basicComponentData.mComponentType + "] ", e);
     }
 
     return null;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java
index 31364f0..65b9b51 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java
@@ -20,11 +20,10 @@ package com.taobao.weex.ui.component;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-@Retention(RUNTIME)
+@Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface WXComponentProp {
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
index b9b97e1..b9f5ada 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
@@ -22,13 +22,14 @@ import android.content.Context;
 import android.support.annotation.NonNull;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.ComponentCreator;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.flat.FlatComponent;
 import com.taobao.weex.ui.flat.WidgetContainer;
 import com.taobao.weex.ui.flat.widget.WidgetGroup;
 import com.taobao.weex.ui.view.WXFrameLayout;
 import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedList;
 
 /**
  * div component
@@ -39,24 +40,20 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone
   private WidgetGroup mWidgetGroup;
 
   public static class Ceator implements ComponentCreator {
-
-    public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent)
-        throws IllegalAccessException, InvocationTargetException, InstantiationException {
-      return new WXDiv(instance, node, parent);
+    public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+      return new WXDiv(instance, parent, basicComponentData);
     }
   }
 
   @Deprecated
-  public WXDiv(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId,
-      boolean isLazy) {
-    this(instance, dom, parent);
+  public WXDiv(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, basicComponentData);
   }
 
-  public WXDiv(WXSDKInstance instance, WXDomObject node, WXVContainer parent) {
-    super(instance, node, parent);
+  public WXDiv(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+    super(instance, parent, basicComponentData);
   }
 
-
   @Override
   protected WXFrameLayout initComponentHostView(@NonNull Context context) {
     WXFrameLayout frameLayout = new WXFrameLayout(context);
@@ -67,7 +64,7 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone
   @Override
   public boolean promoteToView(boolean checkAncestor) {
     return !intendToBeFlatContainer() ||
-        getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXDiv.class);
+            getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXDiv.class);
   }
 
   /**
@@ -89,6 +86,9 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone
 
   @Override
   protected void mountFlatGUI() {
+    if(widgets == null){
+      widgets = new LinkedList<>();
+    }
     if (promoteToView(true)) {
       if(getHostView()!=null) {
         getHostView().mountFlatGUI(widgets);
@@ -114,5 +114,4 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone
   public boolean isVirtualComponent() {
     return !promoteToView(true);
   }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
index 87f5859..018612b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
@@ -27,7 +27,7 @@ import android.webkit.WebView;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
-import com.taobao.weappplus_sdk.R;
+import com.taobao.weex.R;
 import com.taobao.weex.IWXRenderListener;
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
@@ -36,7 +36,7 @@ import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXPerformance;
 import com.taobao.weex.common.WXRenderStrategy;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
@@ -45,8 +45,7 @@ import java.util.Comparator;
 import java.util.PriorityQueue;
 
 @Component(lazyload = false)
-public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleListener,NestedContainer{
-
+public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleListener,NestedContainer {
 
   public static final  String STRATEGY_NONE =  "none";
   public static final  String STRATEGY_NORMAL =  "normal";
@@ -113,7 +112,7 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis
     @Override
     public void onException(NestedContainer container, String errCode, String msg) {
       if (TextUtils.equals(errCode, WXErrorCode.
-			  WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode()) && container instanceof WXEmbed) {
+              WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode()) && container instanceof WXEmbed) {
         final WXEmbed comp = ((WXEmbed)container);
         final ImageView imageView = new ImageView(comp.getContext());
         imageView.setImageResource(R.drawable.error);
@@ -188,24 +187,24 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis
   }
 
   @Deprecated
-  public WXEmbed(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance,dom,parent);
+  public WXEmbed(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, basicComponentData);
   }
 
-  public WXEmbed(WXSDKInstance instance, WXDomObject node, WXVContainer parent) {
-    super(instance, node, parent);
+  public WXEmbed(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+    super(instance, parent, basicComponentData);
     mListener = new EmbedRenderListener(this);
 
-    ERROR_IMG_WIDTH = (int) WXViewUtils.getRealPxByWidth(270,instance.getInstanceViewPortWidth());
-    ERROR_IMG_HEIGHT = (int) WXViewUtils.getRealPxByWidth(260,instance.getInstanceViewPortWidth());
-    if(instance instanceof EmbedManager) {
-      Object itemId = node.getAttrs().get(ITEM_ID);
+    ERROR_IMG_WIDTH = (int) WXViewUtils.getRealPxByWidth(270, instance.getInstanceViewPortWidth());
+    ERROR_IMG_HEIGHT = (int) WXViewUtils.getRealPxByWidth(260, instance.getInstanceViewPortWidth());
+    if (instance instanceof EmbedManager) {
+      Object itemId = getAttrs().get(ITEM_ID);
       if (itemId != null) {
         ((EmbedManager) instance).putEmbed(itemId.toString(), this);
       }
     }
-    this.priority = WXUtils.getString(node.getAttrs().get(Constants.Name.PRIORITY), PRIORITY_NORMAL);
-    this.strategy = WXUtils.getString(node.getAttrs().get(Constants.Name.STRATEGY), STRATEGY_NONE);
+    this.priority = WXUtils.getString(getAttrs().get(Constants.Name.PRIORITY), PRIORITY_NORMAL);
+    this.strategy = WXUtils.getString(getAttrs().get(Constants.Name.STRATEGY), STRATEGY_NONE);
   }
 
   @Override
@@ -229,7 +228,7 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis
       case Constants.Name.PRIORITY:
         String priority = WXUtils.getString(param,null);
         if (priority != null){
-           setPriority(priority);
+          setPriority(priority);
         }
         return true;
     }
@@ -278,10 +277,10 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis
 
   @WXComponentProp(name = Constants.Name.PRIORITY)
   public void setPriority(String priority) {
-       if(TextUtils.isEmpty(priority)){
-         return;
-       }
-       this.priority = priority;
+    if(TextUtils.isEmpty(priority)){
+      return;
+    }
+    this.priority = priority;
   }
 
   /**
@@ -327,18 +326,16 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis
 
     if(TextUtils.isEmpty(url)){
       mListener.mEventListener.onException(this,
-			  WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
+              WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
               WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorMsg() + "!!wx embed src url is null"
-	  );
+      );
       return sdkInstance;
     }
 
-    ViewGroup.LayoutParams layoutParams = getHostView().getLayoutParams();
     sdkInstance.renderByUrl(WXPerformance.DEFAULT,
-                            url,
-                            null, null, layoutParams.width,
-                            layoutParams.height,
-                            WXRenderStrategy.APPEND_ASYNC);
+            url,
+            null, null,
+            WXRenderStrategy.APPEND_ASYNC);
     return sdkInstance;
   }
 
@@ -376,7 +373,6 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis
     }
   }
 
-
   private void  doAutoEmbedMemoryStrategy(){
     /**
      * auto manage embed amount in current instance, save memory
@@ -491,16 +487,16 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis
 
   private void destoryNestInstance(){
     if(getInstance().hiddenEmbeds != null && getInstance().hiddenEmbeds.contains(this)){
-        getInstance().hiddenEmbeds.remove(this);
+      getInstance().hiddenEmbeds.remove(this);
     }
     if (mNestedInstance != null) {
-       mNestedInstance.destroy();
-       mNestedInstance = null;
+      mNestedInstance.destroy();
+      mNestedInstance = null;
     }
     if(WXEnvironment.isApkDebugable()){
-       WXLogUtils.w("WXEmbed destoryNestInstance priority " + priority + " index " + getDomObject().getAttrs().get("index")
-        + "  " + hiddenTime  + " embeds size " + (getInstance().hiddenEmbeds == null ?  0 : getInstance().hiddenEmbeds.size())
-       + " strategy " + this.strategy);
+      WXLogUtils.w("WXEmbed destoryNestInstance priority " + priority + " index " + getAttrs().get("index")
+              + "  " + hiddenTime  + " embeds size " + (getInstance().hiddenEmbeds == null ?  0 : getInstance().hiddenEmbeds.size())
+              + " strategy " + this.strategy);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
index 82744c2..d55106e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
@@ -21,7 +21,7 @@ package com.taobao.weex.ui.component;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.component.list.WXCell;
 
 /**
@@ -31,13 +31,13 @@ import com.taobao.weex.ui.component.list.WXCell;
 public class WXHeader extends WXCell {
 
   @Deprecated
-  public WXHeader(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance,dom,parent,isLazy);
+  public WXHeader(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, isLazy, basicComponentData);
   }
 
-  public WXHeader(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
-    super(instance, node, parent, lazy);
-    String parantType = parent.getDomObject().getType();
+  public WXHeader(WXSDKInstance instance, WXVContainer parent, boolean lazy, BasicComponentData basicComponentData) {
+    super(instance, parent, lazy, basicComponentData);
+    String parantType = parent.getComponentType();
     if(WXBasicComponentType.LIST.equals(parantType)
             || WXBasicComponentType.RECYCLE_LIST.equals(parantType)){
       setSticky(Constants.Value.STICKY);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
index ff32c0f..6d37506 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
@@ -18,11 +18,16 @@
  */
 package com.taobao.weex.ui.component;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import android.Manifest;
 import android.app.Activity;
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
 import android.graphics.RectF;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -32,11 +37,9 @@ import android.support.annotation.Nullable;
 import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
 import android.text.TextUtils;
-import android.util.Log;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.ImageView.ScaleType;
-
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.adapter.IWXImgLoaderAdapter;
@@ -48,26 +51,19 @@ import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.WXImageSharpen;
 import com.taobao.weex.common.WXImageStrategy;
 import com.taobao.weex.common.WXRuntimeException;
-import com.taobao.weex.dom.ImmutableDomObject;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.ComponentCreator;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXImageView;
 import com.taobao.weex.ui.view.border.BorderDrawable;
 import com.taobao.weex.utils.ImageDrawable;
 import com.taobao.weex.utils.ImgURIUtil;
 import com.taobao.weex.utils.SingleFunctionParser;
-import com.taobao.weex.utils.WXViewToImageUtil;
 import com.taobao.weex.utils.WXDomUtils;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
+import com.taobao.weex.utils.WXViewToImageUtil;
 import com.taobao.weex.utils.WXViewUtils;
 
-import java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Image component
  */
@@ -89,21 +85,20 @@ public class WXImage extends WXComponent<ImageView> {
     }
   };
 
-  public static class Ceator implements ComponentCreator {
-    public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException {
-        return new WXImage(instance,node,parent);
+  public static class Creator implements ComponentCreator {
+    @Override
+    public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+      return new WXImage(instance, parent, basicComponentData);
     }
   }
 
-
   @Deprecated
-  public WXImage(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-      this(instance,dom,parent);
+  public WXImage(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, basicComponentData);
   }
 
-  public WXImage(WXSDKInstance instance, WXDomObject node,
-                  WXVContainer parent) {
-      super(instance, node, parent);
+  public WXImage(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+    super(instance, parent, basicComponentData);
   }
 
   @Override
@@ -117,47 +112,45 @@ public class WXImage extends WXComponent<ImageView> {
     return view;
   }
 
-    @Override
-    protected boolean setProperty(String key, Object param) {
-      switch (key) {
-        case Constants.Name.RESIZE_MODE:
-          String resize_mode = WXUtils.getString(param, null);
-          if (resize_mode != null)
-            setResizeMode(resize_mode);
-          return true;
-        case Constants.Name.RESIZE:
-          String resize = WXUtils.getString(param, null);
-          if (resize != null)
-            setResize(resize);
-          return true;
-        case Constants.Name.SRC:
-          String src = WXUtils.getString(param, null);
-          if (src != null)
-            setSrc(src);
-          return true;
-        case Constants.Name.IMAGE_QUALITY:
-          return true;
-        case Constants.Name.AUTO_RECYCLE:
-          mAutoRecycle = WXUtils.getBoolean(param, mAutoRecycle);
-          return true;
-        case Constants.Name.FILTER:
-          int blurRadius = 0;
-          if(param != null && param instanceof String) {
-            blurRadius = parseBlurRadius((String)param);
-          }
-          if(!TextUtils.isEmpty(this.mSrc)) {
-            setBlurRadius(this.mSrc,blurRadius);
-          }
-          return true;
-      }
-    return super.setProperty(key, param);
+  @Override
+  protected boolean setProperty(String key, Object param) {
+    switch (key) {
+      case Constants.Name.RESIZE_MODE:
+        String resizeMode = WXUtils.getString(param, null);
+        if (resizeMode != null) { setResizeMode(resizeMode); }
+        return true;
+      case Constants.Name.RESIZE:
+        String resize = WXUtils.getString(param, null);
+        if (resize != null) { setResize(resize); }
+        return true;
+      case Constants.Name.SRC:
+        String src = WXUtils.getString(param, null);
+        if (src != null) { setSrc(src); }
+        return true;
+      case Constants.Name.IMAGE_QUALITY:
+        return true;
+      case Constants.Name.AUTO_RECYCLE:
+        mAutoRecycle = WXUtils.getBoolean(param, mAutoRecycle);
+        return true;
+      case Constants.Name.FILTER:
+        int blurRadius = 0;
+        if (param != null && param instanceof String) {
+          blurRadius = parseBlurRadius((String)param);
+        }
+        if (!TextUtils.isEmpty(this.mSrc)) {
+          setBlurRadius(this.mSrc, blurRadius);
+        }
+        return true;
+      default:
+        return super.setProperty(key, param);
+    }
   }
 
   @Override
   public void refreshData(WXComponent component) {
     super.refreshData(component);
     if (component instanceof WXImage) {
-      setSrc(component.getDomObject().getAttrs().getImageSrc());
+      setSrc(component.getAttrs().getImageSrc());
     }
   }
 
@@ -182,6 +175,8 @@ public class WXImage extends WXComponent<ImageView> {
       case "stretch":
         scaleType = ScaleType.FIT_XY;
         break;
+      default:
+        break;
     }
     return scaleType;
   }
@@ -217,7 +212,7 @@ public class WXImage extends WXComponent<ImageView> {
 
     if(image != null){
       if(image.getDrawable() != null){
-         image.setImageDrawable(null);
+        image.setImageDrawable(null);
       }
     }
 
@@ -230,10 +225,8 @@ public class WXImage extends WXComponent<ImageView> {
       setLocalSrc(rewrited);
     } else {
       int blur = 0;
-      if(getDomObject() != null) {
-        String blurStr = getDomObject().getStyles().getBlur();
-        blur = parseBlurRadius(blurStr);
-      }
+      String blurStr = getStyles().getBlur();
+      blur = parseBlurRadius(blurStr);
       setRemoteSrc(rewrited, blur);
     }
   }
@@ -254,7 +247,7 @@ public class WXImage extends WXComponent<ImageView> {
     SingleFunctionParser<Integer> parser = new SingleFunctionParser<Integer>(rawRadius,BLUR_RADIUS_MAPPER);
     List<Integer> list = null;
     try {
-       list = parser.parse("blur");
+      list = parser.parse("blur");
     }catch (Exception e) {
       return 0;
     }
@@ -297,83 +290,89 @@ public class WXImage extends WXComponent<ImageView> {
 
   private void setRemoteSrc(Uri rewrited,int blurRadius) {
 
-      WXImageStrategy imageStrategy = new WXImageStrategy();
-      imageStrategy.isClipping = true;
-
-      WXImageSharpen imageSharpen = getDomObject().getAttrs().getImageSharpen();
-      imageStrategy.isSharpen = imageSharpen == WXImageSharpen.SHARPEN;
-
-      imageStrategy.blurRadius = Math.max(0, blurRadius);
-      this.mBlurRadius = blurRadius;
-
-      imageStrategy.setImageListener(new WXImageStrategy.ImageListener() {
-        @Override
-        public void onImageFinish(String url, ImageView imageView, boolean result, Map extra) {
-          if (getDomObject() != null && getDomObject().getEvents().contains(Constants.Event.ONLOAD)) {
-            Map<String, Object> params = new HashMap<String, Object>();
-            Map<String, Object> size = new HashMap<>(2);
-            if (imageView != null && imageView instanceof Measurable) {
-              size.put("naturalWidth", ((Measurable) imageView).getNaturalWidth());
-              size.put("naturalHeight", ((Measurable) imageView).getNaturalHeight());
-            } else {
-              size.put("naturalWidth", 0);
-              size.put("naturalHeight", 0);
-            }
-
-            if (getDomObject() != null && containsEvent(Constants.Event.ONLOAD)) {
-              params.put("success", result);
-              params.put("size", size);
-              fireEvent(Constants.Event.ONLOAD, params);
-            }
+    WXImageStrategy imageStrategy = new WXImageStrategy();
+    imageStrategy.isClipping = true;
+
+    WXImageSharpen imageSharpen = getAttrs().getImageSharpen();
+    imageStrategy.isSharpen = imageSharpen == WXImageSharpen.SHARPEN;
+
+    imageStrategy.blurRadius = Math.max(0, blurRadius);
+    this.mBlurRadius = blurRadius;
+
+    imageStrategy.setImageListener(new WXImageStrategy.ImageListener() {
+      @Override
+      public void onImageFinish(String url, ImageView imageView, boolean result, Map extra) {
+        if (getEvents().contains(Constants.Event.ONLOAD)) {
+          Map<String, Object> params = new HashMap<String, Object>();
+          Map<String, Object> size = new HashMap<>(2);
+          if (imageView != null && imageView instanceof Measurable) {
+            size.put("naturalWidth", ((Measurable) imageView).getNaturalWidth());
+            size.put("naturalHeight", ((Measurable) imageView).getNaturalHeight());
+          } else {
+            size.put("naturalWidth", 0);
+            size.put("naturalHeight", 0);
           }
-          monitorImgSize(imageView);
-        }
-      });
 
-        String placeholder=null;
-        if(getDomObject().getAttrs().containsKey(Constants.Name.PLACEHOLDER)){
-            placeholder= (String) getDomObject().getAttrs().get(Constants.Name.PLACEHOLDER);
-        }else if(getDomObject().getAttrs().containsKey(Constants.Name.PLACE_HOLDER)){
-            placeholder=(String)getDomObject().getAttrs().get(Constants.Name.PLACE_HOLDER);
-        }
-        if(!TextUtils.isEmpty(placeholder)){
-            imageStrategy.placeHolder = getInstance().rewriteUri(Uri.parse(placeholder),URIAdapter.IMAGE).toString();
+          if (containsEvent(Constants.Event.ONLOAD)) {
+            params.put("success", result);
+            params.put("size", size);
+            fireEvent(Constants.Event.ONLOAD, params);
+          }
         }
-
-      imageStrategy.instanceId = getInstanceId();
-      IWXImgLoaderAdapter imgLoaderAdapter = getInstance().getImgLoaderAdapter();
-      if (imgLoaderAdapter != null) {
-        imgLoaderAdapter.setImage(rewrited.toString(), getHostView(),
-            getDomObject().getAttrs().getImageQuality(), imageStrategy);
+        monitorImgSize(imageView);
       }
+    });
+
+    String placeholder=null;
+    if(getAttrs().containsKey(Constants.Name.PLACEHOLDER)){
+      placeholder= (String) getAttrs().get(Constants.Name.PLACEHOLDER);
+    }else if(getAttrs().containsKey(Constants.Name.PLACE_HOLDER)){
+      placeholder=(String)getAttrs().get(Constants.Name.PLACE_HOLDER);
+    }
+    if(placeholder!=null){
+      imageStrategy.placeHolder = getInstance().rewriteUri(Uri.parse(placeholder),URIAdapter.IMAGE).toString();
+    }
+
+    imageStrategy.instanceId = getInstanceId();
+    IWXImgLoaderAdapter imgLoaderAdapter = getInstance().getImgLoaderAdapter();
+    if (imgLoaderAdapter != null) {
+      imgLoaderAdapter.setImage(rewrited.toString(), getHostView(),
+          getDomObject().getAttrs().getImageQuality(), imageStrategy);
+    }
+  }
+
+  @Override
+  protected void onFinishLayout() {
+    super.onFinishLayout();
+    updateBorderRadius();
   }
 
   @Override
   public void updateProperties(Map<String, Object> props) {
     super.updateProperties(props);
-    WXImageView imageView;
-    ImmutableDomObject imageDom;
-    if ((imageDom = getDomObject()) != null &&
-        getHostView() instanceof WXImageView) {
-      imageView = (WXImageView) getHostView();
+    updateBorderRadius();
+  }
+
+  private void updateBorderRadius() {
+    if (getHostView() instanceof WXImageView) {
+      final WXImageView imageView = (WXImageView)getHostView();
       BorderDrawable borderDrawable = WXViewUtils.getBorderDrawable(getHostView());
       float[] borderRadius;
       if (borderDrawable != null) {
-        RectF borderBox = new RectF(0, 0, WXDomUtils.getContentWidth(imageDom), WXDomUtils.getContentHeight(imageDom));
-        borderRadius = borderDrawable.getBorderRadius(borderBox);
+        RectF borderBox = new RectF(0, 0, WXDomUtils.getContentWidth(this), WXDomUtils.getContentHeight(this));
+        borderRadius = borderDrawable.getBorderInnerRadius(borderBox);
       } else {
-        borderRadius = new float[]{0, 0, 0, 0, 0, 0, 0, 0};
+        borderRadius = new float[] {0, 0, 0, 0, 0, 0, 0, 0};
       }
       imageView.setBorderRadius(borderRadius);
 
       if (imageView.getDrawable() instanceof ImageDrawable) {
-        ImageDrawable imageDrawable = (ImageDrawable) imageView.getDrawable();
+        ImageDrawable imageDrawable = (ImageDrawable)imageView.getDrawable();
         float[] previousRadius = imageDrawable.getCornerRadii();
         if (!Arrays.equals(previousRadius, borderRadius)) {
           imageDrawable.setCornerRadii(borderRadius);
         }
       }
-      readyToRender();
     }
   }
 
@@ -457,15 +456,16 @@ public class WXImage extends WXComponent<ImageView> {
     }
 
     if (img.getIntrinsicHeight() * img.getIntrinsicWidth() > imageView.getMeasuredHeight() *
-                                                             imageView.getMeasuredWidth()){
+            imageView.getMeasuredWidth()){
       instance.getWXPerformance().wrongImgSizeCount++;
     }
   }
 
+  @Override
   public void destroy() {
     if(getHostView() instanceof WXImageView){
       if (getInstance().getImgLoaderAdapter() != null) {
-          getInstance().getImgLoaderAdapter().setImage(null, mHost, null, null);
+        getInstance().getImgLoaderAdapter().setImage(null, mHost, null, null);
       }
     }
     super.destroy();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java
index 02f8a21..e8422ca 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java
@@ -29,16 +29,12 @@ import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.WXRuntimeException;
-import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.WXStyle;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXCircleIndicator;
 import com.taobao.weex.utils.WXResourceUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  *
  * Slider indicator
@@ -47,12 +43,12 @@ import java.util.Map;
 public class WXIndicator extends WXComponent<WXCircleIndicator> {
 
   @Deprecated
-  public WXIndicator(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance,dom,parent,isLazy);
+  public WXIndicator(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, isLazy, basicComponentData);
   }
 
-  public WXIndicator(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
-    super(instance, dom, parent, isLazy);
+  public WXIndicator(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) {
+    super(instance, parent, isLazy, basicComponentData);
   }
 
   @Override
@@ -151,20 +147,21 @@ public class WXIndicator extends WXComponent<WXCircleIndicator> {
     }
   }
 
-  public static class IndicatorDomNode extends WXDomObject{
-    public IndicatorDomNode(){
-      super();
-    }
-
-    @Override
-    protected Map<String, String> getDefaultStyle() {
-      WXStyle pendingStyles = getStyles();
-      Map<String,String> map = new HashMap<>();
-      if(!pendingStyles.containsKey(Constants.Name.RIGHT))
-        map.put(Constants.Name.LEFT,"0");
-      if(!pendingStyles.containsKey(Constants.Name.BOTTOM))
-        map.put(Constants.Name.TOP,"0");
-      return map;
-    }
-  }
+  // TODO
+//  public static class IndicatorDomNode extends WXDomObject{
+//    public IndicatorDomNode(){
+//      super();
+//    }
+//
+//    @Override
+//    protected Map<String, String> getDefaultStyle() {
+//      WXStyle pendingStyles = getStyles();
+//      Map<String,String> map = new HashMap<>();
+//      if(!pendingStyles.containsKey(Constants.Name.RIGHT))
+//        map.put(Constants.Name.LEFT,"0");
+//      if(!pendingStyles.containsKey(Constants.Name.BOTTOM))
+//        map.put(Constants.Name.TOP,"0");
+//      return map;
+//    }
+//  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java
index 339165a..d1a272d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java
@@ -20,7 +20,7 @@ package com.taobao.weex.ui.component;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXEditText;
 
 /**
@@ -31,12 +31,12 @@ import com.taobao.weex.ui.view.WXEditText;
 public class WXInput extends AbstractEditComponent{
 
   @Deprecated
-  public WXInput(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance,dom,parent,isLazy);
+  public WXInput(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, isLazy, basicComponentData);
   }
 
-  public WXInput(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
-    super(instance, dom, parent, isLazy);
+  public WXInput(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) {
+    super(instance, parent, isLazy, basicComponentData);
   }
 
   @Override
@@ -44,9 +44,4 @@ public class WXInput extends AbstractEditComponent{
     super.appleStyleAfterCreated(editText);
     editText.setSingleLine();//default use single line , same to ios
   }
-
-  @Override
-  protected MeasureOutput measure(int width, int height) {
-    return super.measure(width, height);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java
index 7ab9b03..8130ace 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java
@@ -25,10 +25,8 @@ import android.text.TextUtils;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.ImmutableDomObject;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.component.list.WXListComponent;
-import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList;
 import com.taobao.weex.ui.view.WXFrameLayout;
 import com.taobao.weex.ui.view.WXLoadingLayout;
 import com.taobao.weex.ui.view.refresh.core.WXSwipeLayout;
@@ -46,8 +44,8 @@ public class WXLoading extends WXBaseRefresh implements WXSwipeLayout.WXOnLoadin
 
   public static final String HIDE = "hide";
 
-  public WXLoading(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
-    super(instance, node, parent, lazy);
+  public WXLoading(WXSDKInstance instance, WXVContainer parent, boolean lazy, BasicComponentData basicComponentData) {
+    super(instance, parent, lazy, basicComponentData);
   }
 
   @Override
@@ -57,16 +55,14 @@ public class WXLoading extends WXBaseRefresh implements WXSwipeLayout.WXOnLoadin
 
   @Override
   public void onLoading() {
-    ImmutableDomObject domObject = getDomObject();
-    if (domObject != null && domObject.getEvents().contains(Constants.Event.ONLOADING)) {
+    if (getEvents().contains(Constants.Event.ONLOADING)) {
       fireEvent(Constants.Event.ONLOADING);
     }
   }
 
   @Override
   public void onPullingUp(float dy, int pullOutDistance, float viewHeight) {
-    ImmutableDomObject domObject = getDomObject();
-    if (domObject != null && domObject.getEvents().contains(Constants.Event.ONPULLING_UP)) {
+    if (getEvents().contains(Constants.Event.ONPULLING_UP)) {
       Map<String, Object> data = new HashMap<>();
       data.put(Constants.Name.DISTANCE_Y, dy);
       data.put(Constants.Name.PULLING_DISTANCE, pullOutDistance);
@@ -96,9 +92,7 @@ public class WXLoading extends WXBaseRefresh implements WXSwipeLayout.WXOnLoadin
   public void setDisplay(String display) {
     if (!TextUtils.isEmpty(display)) {
       if (display.equals(HIDE)) {
-        if (getParent() instanceof WXRecyclerTemplateList
-                || getParent() instanceof WXListComponent
-                || getParent() instanceof WXScroller) {
+        if (getParent() instanceof WXListComponent || getParent() instanceof WXScroller) {
           if (((BaseBounceView)getParent().getHostView()).getSwipeLayout().isRefreshing()) {
             ((BaseBounceView) getParent().getHostView()).finishPullLoad();
             ((BaseBounceView) getParent().getHostView()).onLoadmoreComplete();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java
index 5c0a886..68b7403 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java
@@ -25,7 +25,7 @@ import android.support.annotation.NonNull;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.refresh.circlebar.CircleProgressBar;
 import com.taobao.weex.utils.WXResourceUtils;
 import com.taobao.weex.utils.WXUtils;
@@ -35,11 +35,10 @@ import com.taobao.weex.utils.WXUtils;
 public class WXLoadingIndicator extends WXComponent<CircleProgressBar> {
 
 
-    public WXLoadingIndicator(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
-        super(instance, dom, parent, isLazy);
+    public WXLoadingIndicator(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) {
+        super(instance, parent, isLazy, basicComponentData);
     }
 
-
     @Override
     protected CircleProgressBar initComponentHostView(@NonNull Context context) {
         return new CircleProgressBar(context);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java
index 555d895..bf8c99c 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java
@@ -25,10 +25,8 @@ import android.text.TextUtils;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.ImmutableDomObject;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.component.list.WXListComponent;
-import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList;
 import com.taobao.weex.ui.view.WXFrameLayout;
 import com.taobao.weex.ui.view.WXRefreshLayout;
 import com.taobao.weex.ui.view.refresh.core.WXSwipeLayout;
@@ -47,12 +45,12 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres
   public static final String HIDE = "hide";
 
   @Deprecated
-  public WXRefresh(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance,dom,parent,isLazy);
+  public WXRefresh(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, isLazy, basicComponentData);
   }
 
-  public WXRefresh(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
-    super(instance, node, parent, lazy);
+  public WXRefresh(WXSDKInstance instance, WXVContainer parent, boolean lazy, BasicComponentData basicComponentData) {
+    super(instance, parent, lazy, basicComponentData);
   }
 
   @Override
@@ -71,8 +69,7 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres
       return;
     }
     
-    ImmutableDomObject dom;
-    if ((dom = getDomObject())!= null && dom.getEvents().contains(Constants.Event.ONREFRESH)) {
+    if (getEvents().contains(Constants.Event.ONREFRESH)) {
       fireEvent(Constants.Event.ONREFRESH);
     }
   }
@@ -80,12 +77,12 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres
   @Override
   public int getLayoutTopOffsetForSibling() {
     //offset siblings
-    return getParent() instanceof Scrollable ? -Math.round(getDomObject().getLayoutHeight()) : 0;
+    return getParent() instanceof Scrollable ? -Math.round(getLayoutHeight()) : 0;
   }
 
   @Override
   public void onPullingDown(float dy, int pullOutDistance, float viewHeight) {
-    if (getDomObject().getEvents() != null && getDomObject().getEvents().contains(Constants.Event.ONPULLING_DOWN)) {
+    if (getEvents() != null && getEvents().contains(Constants.Event.ONPULLING_DOWN)) {
       Map<String, Object> data = new HashMap<>();
       data.put(Constants.Name.DISTANCE_Y, dy);
       data.put(Constants.Name.PULLING_DISTANCE, pullOutDistance);
@@ -110,9 +107,7 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres
   public void setDisplay(String display) {
     if (!TextUtils.isEmpty(display)) {
       if (display.equals(HIDE)) {
-        if (getParent() instanceof WXRecyclerTemplateList
-                || getParent() instanceof WXListComponent
-                || getParent() instanceof WXScroller) {
+        if (getParent() instanceof WXListComponent || getParent() instanceof WXScroller) {
           if (((BaseBounceView)getParent().getHostView()).getSwipeLayout().isRefreshing()) {
             ((BaseBounceView) getParent().getHostView()).finishPullRefresh();
             ((BaseBounceView) getParent().getHostView()).onRefreshingComplete();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
index f21d33b..94845ea 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
@@ -18,6 +18,13 @@
  */
 package com.taobao.weex.ui.component;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.graphics.Point;
@@ -32,7 +39,6 @@ import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.widget.FrameLayout;
 import android.widget.FrameLayout.LayoutParams;
-
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
@@ -41,8 +47,8 @@ import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.ICheckBindingScroller;
 import com.taobao.weex.common.OnWXScrollListener;
 import com.taobao.weex.common.WXThread;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.ComponentCreator;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.component.helper.ScrollStartEndHelper;
 import com.taobao.weex.ui.component.helper.WXStickyHelper;
 import com.taobao.weex.ui.view.IWXScroller;
@@ -56,15 +62,6 @@ import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
 
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-//import com.taobao.weex.ui.WXRecycleImageManager;
-
 /**
  * Component for scroller. It also support features like
  * "appear", "disappear" and "sticky"
@@ -76,7 +73,8 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
   public static final String DIRECTION = "direction";
   protected int mOrientation = Constants.Orientation.VERTICAL;
   private List<WXComponent> mRefreshs=new ArrayList<>();
-  private int mChildrenLayoutOffset = 0;//Use for offset children layout
+  /** Use for offset children layout */
+  private int mChildrenLayoutOffset = 0;
   private boolean mForceLoadmoreNextTime = false;
   private int mOffsetAccuracy = 10;
   private Point mLastReport = new Point(-1, -1);
@@ -87,11 +85,10 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
    * */
   private ScrollStartEndHelper mScrollStartEndHelper;
 
-
-
   public static class Creator implements ComponentCreator {
-    public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException {
-      return new WXScroller(instance,node,parent);
+    @Override
+    public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+      return new WXScroller(instance, parent, basicComponentData);
     }
   }
   /**
@@ -112,15 +109,13 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
 
   private boolean isScrollable = true;
 
-
   @Deprecated
-  public WXScroller(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance,dom,parent);
+  public WXScroller(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, basicComponentData);
   }
 
-  public WXScroller(WXSDKInstance instance, WXDomObject node,
-                    WXVContainer parent) {
-    super(instance, node, parent);
+  public WXScroller(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+    super(instance, parent, basicComponentData);
     stickyHelper = new WXStickyHelper(this);
   }
 
@@ -147,8 +142,9 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
    * @return ScrollView
    */
   public ViewGroup getInnerView() {
-    if(getHostView() == null)
+    if(getHostView() == null) {
       return null;
+    }
     if (getHostView() instanceof BounceScrollerView) {
       return ((BounceScrollerView) getHostView()).getInnerView();
     } else {
@@ -167,7 +163,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
           @Override
           public void onScrollChanged(WXScrollView scrollView, int x, int y, int oldx, int oldy) {
             getScrollStartEndHelper().onScrolled(x, y);
-            if(!getDomObject().getEvents().contains(Constants.Event.SCROLL)){
+            if(!getEvents().contains(Constants.Event.SCROLL)){
               return;
             }
             if (shouldReport(x, y)) {
@@ -195,7 +191,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
           @Override
           public void onScrollChanged(WXHorizontalScrollView scrollView, int x, int y, int oldx, int oldy) {
             getScrollStartEndHelper().onScrolled(x, y);
-            if(!getDomObject().getEvents().contains(Constants.Event.SCROLL)){
+            if(!getEvents().contains(Constants.Event.SCROLL)){
               return;
             }
             if (shouldReport(x, y)) {
@@ -214,7 +210,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
   public Map<String, Object> getScrollEvent(int x, int y){
     Rect contentFrame =  new Rect();
     if (getInnerView() instanceof WXScrollView) {
-       contentFrame = ((WXScrollView) getInnerView()).getContentFrame();
+      contentFrame = ((WXScrollView) getInnerView()).getContentFrame();
     }else if (getInnerView() instanceof WXHorizontalScrollView) {
       contentFrame = ((WXHorizontalScrollView) getInnerView()).getContentFrame();
     }
@@ -283,6 +279,16 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
 
   @Override
   protected int getChildrenLayoutTopOffset() {
+    if (mChildrenLayoutOffset == 0) {
+      // Child LayoutSize data set after call Layout. So init mChildrenLayoutOffset here
+      final int listSize = mRefreshs.size();
+      if (listSize > 0) {
+        for (int i = 0; i < listSize; i++) {
+          WXComponent child = mRefreshs.get(i);
+          mChildrenLayoutOffset += child.getLayoutTopOffsetForSibling();
+        }
+      }
+    }
     return mChildrenLayoutOffset;
   }
 
@@ -291,14 +297,12 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
    */
   @Override
   public void addChild(WXComponent child, int index) {
-    mChildrenLayoutOffset += child.getLayoutTopOffsetForSibling();
     if (child instanceof WXBaseRefresh) {
-      if (!checkRefreshOrLoading(child)) {
+      if (checkRefreshOrLoading(child)) {
         mRefreshs.add(child);
       }
     }
-
-    super.addChild(child,index);
+    super.addChild(child, index);
   }
 
   /**
@@ -317,6 +321,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
         }
       });
       handler.postDelayed(runnable,100);
+      result = true;
     }
 
     if (child instanceof WXLoading && getHostView() !=null) {
@@ -364,13 +369,13 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
       int screenW = WXViewUtils.getScreenWidth(WXEnvironment.sApplication);
       int weexW = WXViewUtils.getWeexWidth(getInstanceId());
       measureOutput.width = width > (weexW >= screenW ? screenW : weexW) ? FrameLayout.LayoutParams.MATCH_PARENT
-                                                                         : width;
+              : width;
       measureOutput.height = height;
     } else {
       int screenH = WXViewUtils.getScreenHeight(WXEnvironment.sApplication);
       int weexH = WXViewUtils.getWeexHeight(getInstanceId());
       measureOutput.height = height > (weexH >= screenH ? screenH : weexH) ? FrameLayout.LayoutParams.MATCH_PARENT
-                                                                           : height;
+              : height;
       measureOutput.width = width;
     }
     return measureOutput;
@@ -379,10 +384,10 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
   @Override
   protected ViewGroup initComponentHostView(@NonNull Context context) {
     String scroll;
-    if (getDomObject() == null || getDomObject().getAttrs().isEmpty()) {
+    if (getAttrs().isEmpty()) {
       scroll = "vertical";
     } else {
-      scroll = getDomObject().getAttrs().getScrollDirection();
+      scroll = getAttrs().getScrollDirection();
     }
 
     ViewGroup host;
@@ -397,7 +402,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
         }
       });
       FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
-        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+              LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
       scrollView.addView(mRealView, layoutParams);
       scrollView.setHorizontalScrollBarEnabled(false);
 
@@ -409,10 +414,10 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
       WXScrollView innerView = scrollerView.getInnerView();
       innerView.addScrollViewListener(this);
       FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
-        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+              LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
       innerView.addView(mRealView, layoutParams);
       innerView.setVerticalScrollBarEnabled(true);
-      innerView.setNestedScrollingEnabled(WXUtils.getBoolean(getDomObject().getAttrs().get(Constants.Name.NEST_SCROLLING_ENABLED), true));
+      innerView.setNestedScrollingEnabled(WXUtils.getBoolean(getAttrs().get(Constants.Name.NEST_SCROLLING_ENABLED), true));
       innerView.addScrollViewListener(new WXScrollViewListener() {
         @Override
         public void onScrollChanged(WXScrollView scrollView, int x, int y, int oldx, int oldy) {
@@ -500,8 +505,9 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
     switch (key) {
       case Constants.Name.SHOW_SCROLLBAR:
         Boolean result = WXUtils.getBoolean(param,null);
-        if (result != null)
+        if (result != null) {
           setShowScrollbar(result);
+        }
         return true;
       case Constants.Name.SCROLLABLE:
         boolean scrollable = WXUtils.getBoolean(param, true);
@@ -511,6 +517,8 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
         int accuracy = WXUtils.getInteger(param, 10);
         setOffsetAccuracy(accuracy);
         return true;
+        default:
+          break;
     }
     return super.setProperty(key, param);
   }
@@ -550,7 +558,6 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
   }
 
 
-  // TODO Need constrain, each container can only have one sticky child
   @Override
   public void bindStickStyle(WXComponent component) {
     stickyHelper.bindStickStyle(component,mStickyMap);
@@ -578,7 +585,8 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
 
     item.setWatchEvent(event,isWatch);
 
-    procAppear(0,0,0,0);//check current components appearance status.
+    //check current components appearance status.
+    procAppear(0,0,0,0);
   }
 
   /**
@@ -642,7 +650,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
       return;
     }
 
-    getInnerView().postDelayed(WXThread.secure(new Runnable() {
+    getInnerView().postDelayed(new Runnable() {
       @Override
       public void run() {
         if (mOrientation == Constants.Orientation.VERTICAL) {
@@ -660,7 +668,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
         }
         getInnerView().invalidate();
       }
-    }), 16);
+    }, 16);
   }
 
   @Override
@@ -721,7 +729,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
    */
   protected void onLoadMore(WXScrollView scrollView, int x, int y) {
     try {
-      String offset = getDomObject().getAttrs().getLoadMoreOffset();
+      String offset = getAttrs().getLoadMoreOffset();
       if (TextUtils.isEmpty(offset)) {
         return;
       }
@@ -751,7 +759,6 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL
     mForceLoadmoreNextTime = true;
   }
 
-
   public ScrollStartEndHelper getScrollStartEndHelper() {
     if(mScrollStartEndHelper == null){
       mScrollStartEndHelper = new ScrollStartEndHelper(this);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java
index fb1f487..cee6520 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java
@@ -29,14 +29,15 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.FrameLayout;
+
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.dom.WXEvent;
 import com.taobao.weex.ui.ComponentCreator;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXCircleIndicator;
 import com.taobao.weex.ui.view.WXCirclePageAdapter;
 import com.taobao.weex.ui.view.WXCircleViewPager;
@@ -44,6 +45,7 @@ import com.taobao.weex.ui.view.gesture.WXGestureType;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
+
 import java.lang.ref.WeakReference;
 import java.lang.reflect.InvocationTargetException;
 import java.util.HashMap;
@@ -64,8 +66,8 @@ public class WXSlider extends WXVContainer<FrameLayout> {
   private boolean keepIndex = false;
 
   public static class Creator implements ComponentCreator {
-    public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException {
-      return new WXSlider(instance, node, parent);
+    public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+      return new WXSlider(instance, parent, basicComponentData);
     }
   }
 
@@ -91,20 +93,20 @@ public class WXSlider extends WXVContainer<FrameLayout> {
   protected OnPageChangeListener mPageChangeListener = new SliderPageChangeListener();
 
   @Deprecated
-  public WXSlider(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance, dom, parent);
+  public WXSlider(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, basicComponentData);
   }
 
-  public WXSlider(WXSDKInstance instance, WXDomObject node, WXVContainer parent) {
-    super(instance, node, parent);
+  public WXSlider(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+    super(instance, parent, basicComponentData);
   }
 
   @Override
   protected FrameLayout initComponentHostView(@NonNull Context context) {
     FrameLayout view = new FrameLayout(context);
     // init view pager
-    if (getDomObject() != null && getDomObject().getAttrs() != null) {
-      Object obj = getDomObject().getAttrs().get(INFINITE);
+    if (getAttrs() != null) {
+      Object obj = getAttrs().get(INFINITE);
       isInfinite = WXUtils.getBoolean(obj, true);
     }
     FrameLayout.LayoutParams pagerParams = new FrameLayout.LayoutParams(
@@ -130,7 +132,7 @@ public class WXSlider extends WXVContainer<FrameLayout> {
    */
   @Override
   public LayoutParams getChildLayoutParams(WXComponent child,View childView, int width, int height, int left, int right, int top, int bottom) {
-    ViewGroup.LayoutParams lp = childView == null ? null : childView.getLayoutParams();
+    ViewGroup.LayoutParams lp = childView.getLayoutParams();
     if (lp == null) {
       lp = new FrameLayout.LayoutParams(width, height);
     } else {
@@ -408,11 +410,11 @@ public class WXSlider extends WXVContainer<FrameLayout> {
         return;
       }
 
-      if (getDomObject().getEvents().size() == 0) {
+      if (getEvents().size() == 0) {
         return;
       }
-      WXEvent event = getDomObject().getEvents();
-      String ref = getDomObject().getRef();
+      WXEvent event = getEvents();
+      String ref = getRef();
       if (event.contains(Constants.Event.CHANGE) && WXViewUtils.onScreenArea(getHostView())) {
         params.put(INDEX, realPosition);
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java
index 0899c8d..a7e95d0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java
@@ -29,8 +29,8 @@ import android.widget.FrameLayout;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.common.WXThread;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.ComponentCreator;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXCircleIndicator;
 import com.taobao.weex.ui.view.WXCirclePageAdapter;
 import com.taobao.weex.ui.view.WXCircleViewPager;
@@ -63,13 +63,13 @@ public class WXSliderNeighbor extends WXSlider {
 
     private ZoomTransformer mCachedTransformer;
 
-    public WXSliderNeighbor(WXSDKInstance instance, WXDomObject node, WXVContainer parent) {
-        super(instance, node, parent);
+    public WXSliderNeighbor(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+        super(instance, parent, basicComponentData);
     }
 
     public static class Creator implements ComponentCreator {
-        public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException {
-            return new WXSliderNeighbor(instance, node, parent);
+        public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+            return new WXSliderNeighbor(instance, parent, basicComponentData);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java
index 27e4c95..a617507 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java
@@ -20,13 +20,17 @@ package com.taobao.weex.ui.component;
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.view.View;
 import android.widget.CompoundButton;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.layout.ContentBoxMeasurement;
+import com.taobao.weex.layout.MeasureSize;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXSwitchView;
+import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 
 import java.util.HashMap;
@@ -37,18 +41,48 @@ import java.util.Map;
 public class WXSwitch extends WXComponent<WXSwitchView> {
 
   private CompoundButton.OnCheckedChangeListener mListener;
-  private String mTrackTintColorNormal;
-  private String mTrackTintColorActivated;
-  private String mThumbTintColorNormal;
-  private String mThumbTintColorActivated;
 
   @Deprecated
-  public WXSwitch(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance, dom, parent, isLazy);
+  public WXSwitch(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, isLazy, basicComponentData);
   }
 
-  public WXSwitch(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
-    super(instance, dom, parent, isLazy);
+  public WXSwitch(final WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) {
+    super(instance, parent, isLazy, basicComponentData);
+    setContentBoxMeasurement(new ContentBoxMeasurement() {
+      /** uiThread = false **/
+      @Override
+      public void measureInternal(float width, float height, int widthMeasureMode, int heightMeasureMode) {
+        try {
+          WXSwitchView wxSwitchView = new WXSwitchView(instance.getContext());
+          int widthSpec, heightSpec;
+          heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+          if (Float.isNaN(width)) {
+            widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+          } else {
+            widthSpec = View.MeasureSpec.makeMeasureSpec((int) width, View.MeasureSpec.AT_MOST);
+          }
+
+          wxSwitchView.measure(widthSpec, heightSpec);
+          mMeasureWidth = wxSwitchView.getMeasuredWidth();
+          mMeasureHeight = wxSwitchView.getMeasuredHeight();
+        } catch (RuntimeException e) {
+          WXLogUtils.e(WXLogUtils.getStackTrace(e));
+        }
+        mMeasureWidth = 0;
+        mMeasureHeight = 0;
+      }
+
+      /** uiThread = false **/
+      @Override
+      public void layoutBefore() {
+      }
+
+      /** uiThread = false **/
+      @Override
+      public void layoutAfter(float computedWidth, float computedHeight) {
+      }
+    });
   }
 
   @Override
@@ -97,22 +131,6 @@ public class WXSwitch extends WXComponent<WXSwitchView> {
           setChecked(result);
         }
         return true;
-      case Constants.Name.THUMB_TINT_COLOR:
-        mThumbTintColorNormal = WXUtils.getString(param, null);
-        setThumbColor();
-        return true;
-      case Constants.Name.ON_THUMB_TINT_COLOR:
-        mThumbTintColorActivated = WXUtils.getString(param, null);
-        setThumbColor();
-        return true;
-      case Constants.Name.TINT_COLOR:
-        mTrackTintColorNormal = WXUtils.getString(param, null);
-        setTrackColor();
-        return true;
-      case Constants.Name.ON_TINT_COLOR:
-        mTrackTintColorActivated = WXUtils.getString(param, null);
-        setTrackColor();
-        return true;
     }
     return super.setProperty(key, param);
   }
@@ -123,12 +141,4 @@ public class WXSwitch extends WXComponent<WXSwitchView> {
     getHostView().setChecked(checked);
     getHostView().setOnCheckedChangeListener(mListener);
   }
-
-  private void setThumbColor() {
-    getHostView().setThumbColor(mThumbTintColorNormal, mThumbTintColorActivated);
-  }
-
-  private void setTrackColor() {
-    getHostView().setTrackColor(mTrackTintColorNormal, mTrackTintColorActivated);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java
index bb1bd4b..5376d12 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java
@@ -18,21 +18,62 @@
  */
 package com.taobao.weex.ui.component;
 
+import static com.taobao.weex.dom.WXStyle.UNSET;
+import static com.taobao.weex.utils.WXUtils.isUndefined;
+
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.os.Build;
+import android.os.Looper;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.content.LocalBroadcastManager;
+import android.text.Editable;
 import android.text.Layout;
-
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.SpannedString;
+import android.text.StaticLayout;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.text.style.AbsoluteSizeSpan;
+import android.text.style.AlignmentSpan;
+import android.text.style.ForegroundColorSpan;
+import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.dom.TextDecorationSpan;
+import com.taobao.weex.dom.WXAttr;
+import com.taobao.weex.dom.WXCustomStyleSpan;
+import com.taobao.weex.dom.WXLineHeightSpan;
+import com.taobao.weex.dom.WXStyle;
+import com.taobao.weex.layout.ContentBoxMeasurement;
+import com.taobao.weex.layout.MeasureMode;
+import com.taobao.weex.layout.MeasureSize;
+import com.taobao.weex.layout.measurefunc.TextContentBoxMeasurement;
 import com.taobao.weex.ui.ComponentCreator;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.flat.FlatComponent;
 import com.taobao.weex.ui.flat.widget.TextWidget;
 import com.taobao.weex.ui.view.WXTextView;
-import com.taobao.weex.utils.WXUtils;
-
+import com.taobao.weex.utils.FontDO;
+import com.taobao.weex.utils.TypefaceUtil;
+import com.taobao.weex.utils.WXDomUtils;
+import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.WXResourceUtils;
 import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Text component
@@ -46,10 +87,15 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex
    * The default text size
    **/
   public static final int sDEFAULT_SIZE = 32;
+  private BroadcastReceiver mTypefaceObserver;
+  private String mFontFamily;
 
   @Override
   public boolean promoteToView(boolean checkAncestor) {
-    return getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXText.class);
+    if (null != getInstance().getFlatUIContext()) {
+      return getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXText.class);
+    }
+    return false;
   }
 
   @Override
@@ -67,31 +113,32 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex
   }
 
   public static class Creator implements ComponentCreator {
-
-    public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException {
-      return new WXText(instance, node, parent);
+    public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+      return new WXText(instance, parent, basicComponentData);
     }
   }
 
   @Deprecated
-  public WXText(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance, dom, parent);
+  public WXText(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, basicComponentData);
   }
 
-  public WXText(WXSDKInstance instance, WXDomObject node,
-                WXVContainer parent) {
-    super(instance, node, parent);
+  public WXText(WXSDKInstance instance,
+                WXVContainer parent, BasicComponentData basicComponentData) {
+    super(instance, parent, basicComponentData);
+    setContentBoxMeasurement(new TextContentBoxMeasurement(this));
   }
 
   @Override
   protected WXTextView initComponentHostView(@NonNull Context context) {
-    WXTextView textView =new WXTextView(context);
+    WXTextView textView = new WXTextView(context);
     textView.holdComponent(this);
     return textView;
   }
 
   @Override
   public void updateExtra(Object extra) {
+    super.updateExtra(extra);
     if(extra instanceof Layout) {
       final Layout layout = (Layout) extra;
       if (!promoteToView(true)) {
@@ -106,7 +153,7 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex
   @Override
   protected void setAriaLabel(String label) {
     WXTextView text = getHostView();
-    if(text != null){
+    if (text != null) {
       text.setAriaLabel(label);
     }
   }
@@ -115,7 +162,7 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex
   public void refreshData(WXComponent component) {
     super.refreshData(component);
     if (component instanceof WXText) {
-      updateExtra(component.getDomObject().getExtra());
+      updateExtra(component.getExtra());
     }
   }
 
@@ -134,11 +181,8 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex
       case Constants.Name.VALUE:
         return true;
       case Constants.Name.FONT_FAMILY:
-        return true;
-      case Constants.Name.ENABLE_COPY:
-        boolean enabled = WXUtils.getBoolean(param, false);
-        if (getHostView() != null) {
-          getHostView().enableCopy(enabled);
+        if (param != null) {
+          registerTypefaceObserver(param.toString());
         }
         return true;
       default:
@@ -167,6 +211,47 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex
   @Override
   public void destroy() {
     super.destroy();
+    if (WXEnvironment.getApplication() != null && mTypefaceObserver != null) {
+      WXLogUtils.d("WXText", "Unregister the typeface observer");
+      LocalBroadcastManager.getInstance(WXEnvironment.getApplication()).unregisterReceiver(mTypefaceObserver);
+      mTypefaceObserver = null;
+    }
   }
 
+  private void registerTypefaceObserver(String desiredFontFamily) {
+    if (WXEnvironment.getApplication() == null) {
+      WXLogUtils.w("WXText", "ApplicationContent is null on register typeface observer");
+      return;
+    }
+    mFontFamily = desiredFontFamily;
+    if (mTypefaceObserver != null) {
+      return;
+    }
+
+    mTypefaceObserver = new BroadcastReceiver() {
+      @Override
+      public void onReceive(Context context, Intent intent) {
+        String fontFamily = intent.getStringExtra("fontFamily");
+        if (!mFontFamily.equals(fontFamily)) {
+          return;
+        }
+
+        FontDO fontDO = TypefaceUtil.getFontDO(fontFamily);
+        if (fontDO != null && fontDO.getTypeface() != null && getHostView() != null) {
+          WXTextView hostView = getHostView();
+          Layout layout = hostView.getTextLayout();
+          if (layout != null) {
+            layout.getPaint().setTypeface(fontDO.getTypeface());
+            WXLogUtils.d("WXText", "Apply font family " + fontFamily + " to paint");
+          } else {
+            WXLogUtils.w("WXText", "Layout not created");
+          }
+          hostView.invalidate();
+        }
+        WXLogUtils.d("WXText", "Font family " + fontFamily + " is available");
+      }
+    };
+
+    LocalBroadcastManager.getInstance(WXEnvironment.getApplication()).registerReceiver(mTypefaceObserver, new IntentFilter(TypefaceUtil.ACTION_TYPE_FACE_AVAILABLE));
+  }
 }