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:58 UTC

[30/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/animation/WXAnimationBean.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java b/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java
index 0abe3d7..fe425b7 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationBean.java
@@ -45,6 +45,11 @@ import java.util.Map.Entry;
 
 public class WXAnimationBean {
 
+  public final static String LINEAR = "linear";
+  public final static String EASE_IN_OUT = "ease-in-out";
+  public final static String EASE_IN = "ease-in";
+  public final static String EASE_OUT = "ease-out";
+  public final static String CUBIC_BEZIER = "cubic-bezier";
   public final static int NUM_CUBIC_PARAM = 4;
   public long delay;
   public long duration;
@@ -82,7 +87,7 @@ public class WXAnimationBean {
 
     static {
       wxToAndroidMap.put(WX_TRANSLATE, Arrays.asList
-          (View.TRANSLATION_X, View.TRANSLATION_Y));
+              (View.TRANSLATION_X, View.TRANSLATION_Y));
       wxToAndroidMap.put(WX_TRANSLATE_X, Collections.singletonList(View.TRANSLATION_X));
       wxToAndroidMap.put(WX_TRANSLATE_Y, Collections.singletonList(View.TRANSLATION_Y));
       wxToAndroidMap.put(WX_ROTATE, Collections.singletonList(View.ROTATION));
@@ -114,7 +119,7 @@ public class WXAnimationBean {
     private float cameraDistance = Float.MAX_VALUE;
 
     private static Map<Property<View,Float>, Float> parseTransForm(@Nullable String rawTransform, final int width,
-                                                final int height,final int viewportW) {
+                                                                   final int height,final int viewportW) {
       return  TransformParser.parseTransForm(rawTransform, width, height, viewportW);
     }
 
@@ -142,7 +147,7 @@ public class WXAnimationBean {
 
     private static Pair<Float, Float> parsePivot(@NonNull List<String> list, int width, int height,int viewportW) {
       return new Pair<>(
-          parsePivotX(list.get(0), width,viewportW), parsePivotY(list.get(1), height,viewportW));
+              parsePivotX(list.get(0), width,viewportW), parsePivotY(list.get(1), height,viewportW));
     }
 
     private static float parsePivotX(String x, int width,int viewportW) {
@@ -237,3 +242,4 @@ public class WXAnimationBean {
     }
   }
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationModule.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationModule.java b/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationModule.java
index 3b15347..11b02bc 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/animation/WXAnimationModule.java
@@ -21,31 +21,22 @@ package com.taobao.weex.ui.animation;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
-import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.annotation.JSMethod;
 import com.taobao.weex.common.WXModule;
-import com.taobao.weex.dom.DOMAction;
-import com.taobao.weex.dom.RenderAction;
-import com.taobao.weex.dom.WXDomHandler;
-import com.taobao.weex.dom.action.Actions;
+import com.taobao.weex.ui.action.GraphicActionAnimation;
 import com.taobao.weex.ui.component.WXComponent;
 
-
-import static com.taobao.weex.dom.action.Actions.getAnimationAction;
-
 public class WXAnimationModule extends WXModule {
 
   @JSMethod
-  public void transition(@Nullable String ref, @Nullable JSONObject animation, @Nullable String callBack) {
-    if (!TextUtils.isEmpty(ref) && animation != null && mWXSDKInstance != null) {
-      DOMAction animationActions = getAnimationAction(ref, animation, callBack);
+  public void transition(@Nullable String ref, @Nullable String animation, @Nullable String callBack) {
+    if (!TextUtils.isEmpty(ref) && !TextUtils.isEmpty(animation) && mWXSDKInstance != null) {
       //Due to animation module rely on the result of the css-layout and the batch mechanism of
       //css-layout, the animation.transition must be delayed the batch time.
-      WXSDKManager.getInstance().getWXDomManager().postActionDelay(mWXSDKInstance.getInstanceId(),
-                                                                   animationActions,
-                                                                   false, WXDomHandler.DELAY_TIME);
+      GraphicActionAnimation action = new GraphicActionAnimation(mWXSDKInstance.getInstanceId(), ref, animation, callBack);
+      WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(action.getPageId(), action);
     }
   }
 
@@ -55,9 +46,11 @@ public class WXAnimationModule extends WXModule {
     private WXAnimationBean wxAnimationBean;
     private String callback;
 
-    public void execute(WXSDKInstance mInstance, WXComponent component) {
-      RenderAction action = Actions.getAnimationAction(component.getRef(), wxAnimationBean, callback);
-      WXSDKManager.getInstance().getWXRenderManager().runOnThread(mInstance.getInstanceId(), action);
+    public void execute(WXSDKInstance instance, WXComponent component) {
+      if (null != instance && null != component) {
+        GraphicActionAnimation action = new GraphicActionAnimation(instance.getInstanceId(), component.getRef(), wxAnimationBean, callback);
+        WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(action.getPageId(), action);
+      }
     }
 
     public AnimationHolder(WXAnimationBean wxAnimationBean, String callback) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/AbstractEditComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/AbstractEditComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/AbstractEditComponent.java
index 1c78d42..139b1b5 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/AbstractEditComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/AbstractEditComponent.java
@@ -24,9 +24,11 @@ import android.support.annotation.NonNull;
 import android.text.Editable;
 import android.text.InputFilter;
 import android.text.InputType;
+import android.text.TextPaint;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.text.method.PasswordTransformationMethod;
+import android.util.Log;
 import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.KeyEvent;
@@ -43,11 +45,16 @@ import com.taobao.weex.annotation.JSMethod;
 import com.taobao.weex.bridge.WXBridgeManager;
 import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.WXThread;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.dom.CSSConstants;
 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.ui.action.BasicComponentData;
 import com.taobao.weex.ui.component.helper.SoftKeyboardDetector;
 import com.taobao.weex.ui.component.helper.WXTimeInputHelper;
 import com.taobao.weex.ui.view.WXEditText;
+import com.taobao.weex.utils.TypefaceUtil;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXResourceUtils;
 import com.taobao.weex.utils.WXUtils;
@@ -59,6 +66,8 @@ import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
+import static com.taobao.weex.dom.WXStyle.UNSET;
+
 /**
  * Created by sospartan on 7/11/16.
  */
@@ -84,9 +93,76 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
   private int mFormatRepeatCount = 0;
   private static final int MAX_TEXT_FORMAT_REPEAT = 3;
 
-  public AbstractEditComponent(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
-    super(instance, dom, parent, isLazy);
+  private TextPaint mPaint = new TextPaint();
+  private int mLineHeight = UNSET;
+
+  public AbstractEditComponent(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) {
+    super(instance, parent, isLazy, basicComponentData);
     mInputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+    setContentBoxMeasurement(new ContentBoxMeasurement() {
+      /** uiThread = false **/
+      @Override
+      public void measureInternal(float width, float height, int widthMeasureMode, int heightMeasureMode) {
+        if (CSSConstants.isUndefined(width) || widthMeasureMode == MeasureMode.UNSPECIFIED) {
+          width = 0;
+        }
+        mMeasureWidth = width;
+        mMeasureHeight = getMeasureHeight();
+      }
+
+      /** uiThread = false **/
+      @Override
+      public void layoutBefore() {
+        updateStyleAndAttrs();
+      }
+
+      /** uiThread = false **/
+      @Override
+      public void layoutAfter(float computedWidth, float computedHeight) {
+
+      }
+    });
+  }
+
+  protected final float getMeasuredLineHeight() {
+    return mLineHeight != UNSET && mLineHeight > 0 ? mLineHeight : mPaint.getFontMetrics(null);
+  }
+
+  protected float getMeasureHeight() {
+    return getMeasuredLineHeight();
+  }
+
+  protected void updateStyleAndAttrs() {
+    if (getStyles().size() > 0) {
+      int fontSize = UNSET, fontStyle = UNSET, fontWeight = UNSET;
+      String fontFamily = null;
+      if (getStyles().containsKey(Constants.Name.FONT_SIZE)) {
+        fontSize = WXStyle.getFontSize(getStyles(),getViewPortWidth());
+      }
+
+      if (getStyles().containsKey(Constants.Name.FONT_FAMILY)) {
+        fontFamily = WXStyle.getFontFamily(getStyles());
+      }
+
+      if (getStyles().containsKey(Constants.Name.FONT_STYLE)) {
+        fontStyle = WXStyle.getFontStyle(getStyles());
+      }
+
+      if (getStyles().containsKey(Constants.Name.FONT_WEIGHT)) {
+        fontWeight = WXStyle.getFontWeight(getStyles());
+      }
+
+      int lineHeight = WXStyle.getLineHeight(getStyles(),getViewPortWidth());
+      if (lineHeight != UNSET)
+        mLineHeight = lineHeight;
+
+      if (fontSize != UNSET)
+        mPaint.setTextSize(fontSize);
+
+      if (fontFamily != null) {
+        TypefaceUtil.applyFontStyle(mPaint, fontStyle, fontWeight, fontFamily);
+      }
+    }
   }
 
   @Override
@@ -97,7 +173,7 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
   }
 
   @Override
-  protected void onHostViewInitialized(final WXEditText host) {
+  protected void onHostViewInitialized(WXEditText host) {
     super.onHostViewInitialized(host);
     addFocusChangeListener(new OnFocusChangeListener() {
       @Override
@@ -105,7 +181,7 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
         if (!hasFocus) {
           decideSoftKeyboard();
         }
-        setPseudoClassStatus(Constants.PSEUDO.FOCUS, hasFocus);
+        setPseudoClassStatus(Constants.PSEUDO.FOCUS,hasFocus);
       }
     });
 
@@ -118,31 +194,34 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
     return !isDisabled();
   }
 
-  private void applyOnClickListener() {
-    addClickListener(new OnClickListener() {
-      @Override
-      public void onHostViewClick() {
-        switch (mType) {
-          case Constants.Value.DATE:
-            hideSoftKeyboard();
-            if (getParent() != null) {
-              getParent().interceptFocus();
-            }
-            WXTimeInputHelper.pickDate(mMax, mMin, AbstractEditComponent.this);
-            break;
-          case Constants.Value.TIME:
-            hideSoftKeyboard();
-            if (getParent() != null) {
-              getParent().interceptFocus();
-            }
-            WXTimeInputHelper.pickTime(AbstractEditComponent.this);
-            break;
-        }
+  private OnClickListener mOnClickListener = new OnClickListener() {
+    @Override
+    public void onHostViewClick() {
+      switch (mType) {
+        case Constants.Value.DATE:
+          hideSoftKeyboard();
+          if (getParent() != null) {
+            getParent().interceptFocus();
+          }
+          WXTimeInputHelper.pickDate(mMax, mMin, AbstractEditComponent.this);
+          break;
+        case Constants.Value.TIME:
+          hideSoftKeyboard();
+          if (getParent() != null) {
+            getParent().interceptFocus();
+          }
+          WXTimeInputHelper.pickTime(AbstractEditComponent.this);
+          break;
       }
-    });
+    }
+  };
+
+  private void applyOnClickListener() {
+    addClickListener(mOnClickListener);
   }
 
-  protected int getVerticalGravity() {
+
+  protected int getVerticalGravity(){
     return Gravity.CENTER_VERTICAL;
   }
 
@@ -152,7 +231,7 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
    * @param editText
    */
   protected void appleStyleAfterCreated(final WXEditText editText) {
-    String alignStr = (String) getDomObject().getStyles().get(Constants.Name.TEXT_ALIGN);
+    String alignStr = (String) getStyles().get(Constants.Name.TEXT_ALIGN);
     int textAlign = getTextAlign(alignStr);
     if (textAlign <= 0) {
       textAlign = Gravity.START;
@@ -209,7 +288,7 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
     };
     editText.addTextChangedListener(mTextChangedEventDispatcher);
 
-    editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, WXStyle.getFontSize(getDomObject().getStyles(), getInstance().getInstanceViewPortWidth()));
+    editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, WXStyle.getFontSize(getStyles(), getInstance().getInstanceViewPortWidth()));
   }
 
 
@@ -278,7 +357,6 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
           mBeforeText = s.toString();
 
           fireEvent(Constants.Event.INPUT, s.toString());
-
         }
 
         @Override
@@ -320,13 +398,13 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
       attrsChanges.put("value", value);
       domChanges.put("attrs", attrsChanges);
 
-      WXSDKManager.getInstance().fireEvent(getInstanceId(), getDomObject().getRef(), event, params, domChanges);
+      WXSDKManager.getInstance().fireEvent(getInstanceId(), getRef(), event, params, domChanges);
     }
   }
 
   public void performOnChange(String value) {
-    if (getDomObject() != null && getDomObject().getEvents() != null) {
-      String event = getDomObject().getEvents().contains(Constants.Event.CHANGE) ? Constants.Event.CHANGE : null;
+    if (getEvents() != null) {
+      String event = getEvents().contains(Constants.Event.CHANGE) ? Constants.Event.CHANGE : null;
       fireEvent(event, value);
     }
   }
@@ -466,6 +544,7 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
 
   @WXComponentProp(name = Constants.Name.TYPE)
   public void setType(String type) {
+    Log.e("weex", "setType=" + type);
     if (type == null || getHostView() == null) {
       return;
     }
@@ -522,7 +601,7 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
 
   @WXComponentProp(name = Constants.Name.FONT_SIZE)
   public void setFontSize(String fontSize) {
-    if (getHostView() != null && fontSize != null) {
+    if (getHostView() != null && fontSize != null ) {
       Map<String, Object> map = new HashMap<>(1);
       map.put(Constants.Name.FONT_SIZE, fontSize);
       getHostView().setTextSize(TypedValue.COMPLEX_UNIT_PX, WXStyle.getFontSize(map, getInstance().getInstanceViewPortWidth()));
@@ -555,7 +634,6 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
 
   /**
    * Compatible with both 'max-length' and 'maxlength'
-   *
    * @param maxLength
    */
   @WXComponentProp(name = Constants.Name.MAX_LENGTH)
@@ -568,7 +646,6 @@ public abstract class AbstractEditComponent extends WXComponent<WXEditText> {
 
   /**
    * Compatible with both 'max-length' and 'maxlength'
-   *
    * @param maxLength
    */
   @WXComponentProp(name = Constants.Name.MAXLENGTH)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/ComponentUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/ComponentUtils.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/ComponentUtils.java
index b28a94f..373d9cd 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/ComponentUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/ComponentUtils.java
@@ -20,9 +20,6 @@ package com.taobao.weex.ui.component;
 
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKManager;
-import com.taobao.weex.dom.DOMActionContext;
-import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.action.TraceableAction;
 import com.taobao.weex.utils.WXLogUtils;
 
 /**
@@ -54,69 +51,71 @@ public class ComponentUtils {
     /**
      * build component tree and dom tree for template list
      * */
-    public static synchronized final WXComponent buildTree(WXDomObject domObject, WXVContainer parent){
-        DOMActionContext domActionContext = WXSDKManager.getInstance().getWXDomManager().getDomContext(parent.getInstanceId());
-        if(domActionContext == null){
-            return null;
-        }
-        DomTreeBuilder builder = new DomTreeBuilder();
-        domObject.traverseTree(
-                domActionContext.getAddDOMConsumer(),
-                domActionContext.getApplyStyleConsumer()
-        );
-        return builder.buildComponentTree(domActionContext, domObject, parent);
-    }
+    // TODO
+//    public static synchronized final WXComponent buildTree(WXDomObject domObject, WXVContainer parent){
+//        DOMActionContext domActionContext = WXSDKManager.getInstance().getWXDomManager().getDomContext(parent.getInstanceId());
+//        if(domActionContext == null){
+//            return null;
+//        }
+//        DomTreeBuilder builder = new DomTreeBuilder();
+//        domObject.traverseTree(
+//                domActionContext.getAddDOMConsumer(),
+//                domActionContext.getApplyStyleConsumer()
+//        );
+//        return builder.buildComponentTree(domActionContext, domObject, parent);
+//    }
 
 
     /**
      * dom tree build
      * */
-    static class DomTreeBuilder extends TraceableAction {
-
-        private WXComponent buildComponentTree(DOMActionContext context, WXDomObject dom, WXVContainer parent) {
-            if (dom == null) {
-                return null;
-            }
-            long startNanos = System.nanoTime();
-            dom.setCloneThis(true);
-            WXComponent component = WXComponentFactory.newInstance(context.getInstance(), dom, parent);
-            if (component != null) {
-                component.mTraceInfo.domThreadStart = dom.mDomThreadTimestamp;
-                component.mTraceInfo.rootEventId = mTracingEventId;
-                component.mTraceInfo.domQueueTime = mDomQueueTime;
-            }
-            context.registerComponent(dom.getRef(), component);
-            if (component instanceof WXVContainer) {
-                WXVContainer container = (WXVContainer) component;
-                WXDomObject parentDom = (WXDomObject) container.getDomObject();
-                for (int i = 0; i < dom.childCount(); ++i) {
-                    WXDomObject child = dom.getChild(i);
-                    if (child != null) {
-                        WXComponent childComponent = buildComponentTree(context, child, container);
-                        container.addChild(childComponent);
-                        WXDomObject childDomObject = (WXDomObject) childComponent.getDomObject();
-                        if(childDomObject != child) {
-                            int index = parentDom.index(child);
-                            parentDom.add(childDomObject, index);
-                            if(index >= 0) {
-                                parentDom.remove(child);
-                                i--;
-                            }
-                            RuntimeException exception = new IllegalArgumentException(childDomObject.getClass().getName()
-                                    + " not support clone this");
-                            WXLogUtils.e("weex", exception);
-                            if(WXEnvironment.isApkDebugable()){
-                                throw  exception;
-                            }
-                        }
-                    }
-                }
-            }
-            dom.setCloneThis(false);
-            if (component != null) {
-                component.mTraceInfo.domThreadNanos = System.nanoTime() - startNanos;
-            }
-            return component;
-        }
-    }
+    // TODO
+//    static class DomTreeBuilder extends TraceableAction {
+//
+//        private WXComponent buildComponentTree(DOMActionContext context, WXDomObject dom, WXVContainer parent) {
+//            if (dom == null) {
+//                return null;
+//            }
+//            long startNanos = System.nanoTime();
+//            dom.setCloneThis(true);
+//            WXComponent component = WXComponentFactory.newInstance(context.getInstance(), dom, parent);
+//            if (component != null) {
+//                component.mTraceInfo.domThreadStart = dom.mDomThreadTimestamp;
+//                component.mTraceInfo.rootEventId = mTracingEventId;
+//                component.mTraceInfo.domQueueTime = mDomQueueTime;
+//            }
+//            context.registerComponent(dom.getRef(), component);
+//            if (component instanceof WXVContainer) {
+//                WXVContainer container = (WXVContainer) component;
+//                WXDomObject parentDom = (WXDomObject) container.getDomObject();
+//                for (int i = 0; i < dom.childCount(); ++i) {
+//                    WXDomObject child = dom.getChild(i);
+//                    if (child != null) {
+//                        WXComponent childComponent = buildComponentTree(context, child, container);
+//                        container.addChild(childComponent);
+//                        WXDomObject childDomObject = (WXDomObject) childComponent.getDomObject();
+//                        if(childDomObject != child) {
+//                            int index = parentDom.index(child);
+//                            parentDom.add(childDomObject, index);
+//                            if(index >= 0) {
+//                                parentDom.remove(child);
+//                                i--;
+//                            }
+//                            RuntimeException exception = new IllegalArgumentException(childDomObject.getClass().getName()
+//                                    + " not support clone this");
+//                            WXLogUtils.e("weex", exception);
+//                            if(WXEnvironment.isApkDebugable()){
+//                                throw  exception;
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//            dom.setCloneThis(false);
+//            if (component != null) {
+//                component.mTraceInfo.domThreadNanos = System.nanoTime() - startNanos;
+//            }
+//            return component;
+//        }
+//    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/Textarea.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/Textarea.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/Textarea.java
index 7e36d27..acc9100 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/Textarea.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/Textarea.java
@@ -23,8 +23,7 @@ import android.view.Gravity;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.TextAreaEditTextDomObject;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXEditText;
 import com.taobao.weex.utils.WXUtils;
 
@@ -32,8 +31,12 @@ import com.taobao.weex.utils.WXUtils;
  * Created by sospartan on 7/11/16.
  */
 public class Textarea extends AbstractEditComponent {
-  public Textarea(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
-    super(instance, dom, parent, isLazy);
+
+  public static final int DEFAULT_ROWS = 2;
+  private int mNumberOfLines = DEFAULT_ROWS;
+
+  public Textarea(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) {
+    super(instance, parent, isLazy, basicComponentData);
   }
 
   @Override
@@ -45,9 +48,9 @@ public class Textarea extends AbstractEditComponent {
   @Override
   protected void appleStyleAfterCreated(WXEditText editText) {
     super.appleStyleAfterCreated(editText);
-    String rowsStr = (String) getDomObject().getStyles().get(Constants.Name.ROWS);
+    String rowsStr = (String) getStyles().get(Constants.Name.ROWS);
 
-    int rows = TextAreaEditTextDomObject.DEFAULT_ROWS;
+    int rows = DEFAULT_ROWS;
     try{
       if(!TextUtils.isEmpty(rowsStr)) {
         rows = Integer.parseInt(rowsStr);
@@ -87,4 +90,30 @@ public class Textarea extends AbstractEditComponent {
 
     text.setLines(rows);
   }
+
+  @Override
+  protected float getMeasureHeight(){
+    return getMeasuredLineHeight() * mNumberOfLines;
+  }
+
+  @Override
+  protected void updateStyleAndAttrs() {
+    super.updateStyleAndAttrs();
+    Object raw = getAttrs().get(Constants.Name.ROWS);
+    if (raw == null) {
+      return;
+    } else if (raw instanceof String) {
+      String rowsStr = (String) raw;
+      try {
+        int lines = Integer.parseInt(rowsStr);
+        if (lines > 0) {
+          mNumberOfLines = lines;
+        }
+      } catch (NumberFormatException e) {
+        e.printStackTrace();
+      }
+    } else if (raw instanceof Integer) {
+      mNumberOfLines = (Integer) raw;
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXA.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXA.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXA.java
index aae667f..e0b8442 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXA.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXA.java
@@ -21,43 +21,36 @@ 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.ImmutableDomObject;
 import com.taobao.weex.dom.WXAttr;
-import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXFrameLayout;
 import com.taobao.weex.utils.ATagUtil;
-import com.taobao.weex.utils.WXLogUtils;
 
 @Component(lazyload = false)
 public class WXA extends WXDiv {
 
   @Deprecated
-  public WXA(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
-    this(instance, dom, parent);
+  public WXA(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
+    this(instance, parent, basicComponentData);
   }
 
-  public WXA(WXSDKInstance instance, WXDomObject dom, WXVContainer parent) {
-    super(instance, dom, parent);
+  public WXA(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
+    super(instance, parent, basicComponentData);
   }
 
   @Override
   protected void onHostViewInitialized(WXFrameLayout host) {
-    super.onHostViewInitialized(host);
     addClickListener(new OnClickListener() {
       @Override
       public void onHostViewClick() {
         String href;
-        ImmutableDomObject domObject = getDomObject();
-        if (domObject != null) {
-          WXAttr attr = domObject.getAttrs();
-          if (attr !=null && (href = (String)attr.get("href")) != null) {
-            ATagUtil.onClick(null, getInstanceId(), href);
-          }
-        } else {
-          WXLogUtils.d("WXA", "Property href is empty.");
+        WXAttr attr = getAttrs();
+        if (attr !=null && (href = (String)attr.get("href")) != null) {
+          ATagUtil.onClick(null, getInstanceId(), href);
         }
       }
     });
+    super.onHostViewInitialized(host);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBaseRefresh.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBaseRefresh.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBaseRefresh.java
index 146fd27..45a21e8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBaseRefresh.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBaseRefresh.java
@@ -22,7 +22,7 @@ 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.action.BasicComponentData;
 import com.taobao.weex.ui.view.WXFrameLayout;
 
 /**
@@ -34,8 +34,8 @@ public class WXBaseRefresh extends WXVContainer<WXFrameLayout> {
 
   private WXLoadingIndicator mLoadingIndicator;
 
-  public WXBaseRefresh(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
-    super(instance, node, parent, lazy);
+  public WXBaseRefresh(WXSDKInstance instance, WXVContainer parent, boolean lazy, BasicComponentData basicComponentData) {
+    super(instance, parent, lazy, basicComponentData);
   }
 
   @Override