You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by gu...@apache.org on 2017/11/14 06:06:43 UTC

[1/8] incubator-weex git commit: * [android] android bugfixed logwatcher

Repository: incubator-weex
Updated Branches:
  refs/heads/master 8dc19169f -> 464be58bd


* [android] android  bugfixed logwatcher


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/946385a5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/946385a5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/946385a5

Branch: refs/heads/master
Commit: 946385a5fbf5ded5f3175f9ca0496a3f75b0cc46
Parents: 086bddf
Author: atomtong <to...@qq.com>
Authored: Thu Nov 9 11:40:52 2017 +0800
Committer: jianbai.gbj <ji...@alibaba-inc.com>
Committed: Mon Nov 13 10:35:57 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/946385a5/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
index 1f5b4b2..af20f22 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
@@ -71,6 +71,10 @@ public class WXLogUtils {
   }
 
   private static void log(String tag, String msg, LogLevel level){
+	if(msg != null && tag != null && sLogWatcher !=null){
+	  sLogWatcher.onLog(level.getName(), tag, msg);
+	}
+
     if (msg != null && WXEnvironment.sLogLevel.compare(level) >= 0) {
       if (sLogWatcher != null ) {
         sLogWatcher.onLog(level.getName(), tag, msg);


[8/8] incubator-weex git commit: Merge branch 'release-0.16'

Posted by gu...@apache.org.
Merge branch 'release-0.16'


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/464be58b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/464be58b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/464be58b

Branch: refs/heads/master
Commit: 464be58bdb65d4349cf431ba9bc8c86fe34b2d58
Parents: 8dc1916 3c3536a
Author: gurisxie <27...@qq.com>
Authored: Tue Nov 14 14:06:20 2017 +0800
Committer: gurisxie <27...@qq.com>
Committed: Tue Nov 14 14:06:20 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/common/Constants.java  |  11 +
 .../com/taobao/weex/dom/DOMActionContext.java   |   2 +
 .../taobao/weex/dom/DOMActionContextImpl.java   |  17 +-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |  15 +-
 .../java/com/taobao/weex/dom/WXDomObject.java   |  33 +-
 .../taobao/weex/dom/action/AnimationAction.java |  43 +-
 .../weex/dom/action/UpdateStyleAction.java      |  20 +-
 .../weex/dom/transition/WXTransition.java       | 626 +++++++++++++++++++
 .../weex/ui/animation/TransformParser.java      | 296 +++++++++
 .../weex/ui/animation/WXAnimationBean.java      | 128 +---
 .../com/taobao/weex/utils/FunctionParser.java   |   2 +-
 .../java/com/taobao/weex/utils/WXViewUtils.java |   5 +
 .../weex/dom/transition/WXTransitionTest.java   |  96 +++
 .../weex/ui/animation/TransformParserTest.java  |  38 ++
 14 files changed, 1173 insertions(+), 159 deletions(-)
----------------------------------------------------------------------



[3/8] incubator-weex git commit: * [android] weex transition support on android platform, improve batch time when layout

Posted by gu...@apache.org.
* [android] weex transition support on android platform, improve batch time when layout


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/6486bc91
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/6486bc91
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/6486bc91

Branch: refs/heads/master
Commit: 6486bc912e41b0e587053ed03935478bba185050
Parents: 946385a
Author: jianbai.gbj <ji...@alibaba-inc.com>
Authored: Fri Nov 10 21:11:28 2017 +0800
Committer: jianbai.gbj <ji...@alibaba-inc.com>
Committed: Mon Nov 13 10:51:18 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/WXEnvironment.java     |   1 -
 .../java/com/taobao/weex/common/Constants.java  |  11 +
 .../com/taobao/weex/dom/DOMActionContext.java   |   2 +
 .../taobao/weex/dom/DOMActionContextImpl.java   |  17 +-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |  15 +-
 .../java/com/taobao/weex/dom/WXDomObject.java   |  33 +-
 .../taobao/weex/dom/action/AnimationAction.java |  43 +-
 .../weex/dom/action/UpdateStyleAction.java      |  20 +-
 .../weex/dom/transition/WXTransition.java       | 626 +++++++++++++++++++
 .../weex/ui/animation/TransformParser.java      | 296 +++++++++
 .../weex/ui/animation/WXAnimationBean.java      |   5 -
 .../com/taobao/weex/utils/FunctionParser.java   |   2 +-
 .../java/com/taobao/weex/utils/WXViewUtils.java |   5 +
 .../weex/dom/transition/WXTransitionTest.java   |  96 +++
 .../weex/ui/animation/TransformParserTest.java  |  38 ++
 15 files changed, 1172 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
index c042f34..d1e0779 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -68,7 +68,6 @@ public class WXEnvironment {
   public static boolean sDebugServerConnectable = false;
   public static boolean sRemoteDebugMode = false;
   public static String sRemoteDebugProxyUrl = "";
-  public static boolean sDebugNetworkEventReporterEnable = false;//debugtool network switch
   public static long sJSLibInitTime = 0;
 
   public static long sSDKInitStart = 0;// init start timestamp

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
index 32c91ba..dc67cd7 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
@@ -287,6 +287,8 @@ public class Constants {
     String UNSTICKY = "unsticky";
     String STICKY = "sticky";
 
+    String ON_TRANSITION_END = "transitionEnd";
+
     interface SLOT_LIFECYCLE{
       String CREATE = "create";
       String ATTACH = "attach";
@@ -318,4 +320,13 @@ public class Constants {
     String BANNER_DIGEST = "digest";
     String SAVE_PATH = "v8";
   }
+
+  public interface  TimeFunction{
+    String LINEAR = "linear";
+    String EASE_IN_OUT = "ease-in-out";
+    String EASE_IN = "ease-in";
+    String EASE_OUT = "ease-out";
+    String EASE = "ease";
+    String CUBIC_BEZIER = "cubic-bezier";
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContext.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContext.java b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContext.java
index bbde73f..7668d3d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContext.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContext.java
@@ -60,6 +60,8 @@ public interface DOMActionContext {
 
   boolean isDestory();
 
+  void markDirty();
+
   WXSDKInstance getInstance();
 
   WXDomObject getDomByRef(String ref);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
index 5a2e88d..a8f7615 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
@@ -185,6 +185,9 @@ class DOMActionContextImpl implements DOMActionContext {
       batchEvent.ph = "X";
       WXTracing.submit(batchEvent);
     }
+    if(WXEnvironment.isApkDebugable()){
+       WXLogUtils.d("mInstanceId  " + mInstanceId  + " batch used " + (System.currentTimeMillis() - start));
+    }
   }
 
   void layout(WXDomObject rootDom) {
@@ -212,6 +215,7 @@ class DOMActionContextImpl implements DOMActionContext {
       instance.cssLayoutTime(System.currentTimeMillis() - start);
     }
 
+    start = System.currentTimeMillis();
     rootDom.traverseTree( new WXDomObject.Consumer() {
       @Override
       public void accept(WXDomObject dom) {
@@ -220,10 +224,8 @@ class DOMActionContextImpl implements DOMActionContext {
         }
         dom.layoutAfter();
       }
-    });
+    }, new ApplyUpdateConsumer());
 
-    start = System.currentTimeMillis();
-    rootDom.traverseTree(new ApplyUpdateConsumer());
 
     if (instance != null) {
       instance.applyUpdateTime(System.currentTimeMillis() - start);
@@ -377,6 +379,15 @@ class DOMActionContextImpl implements DOMActionContext {
   }
 
   @Override
+  public void markDirty() {
+    if(!mDestroy){
+      if(!mDirty){
+        mDirty = true;
+      }
+    }
+  }
+
+  @Override
   public WXSDKInstance getInstance() {
     return mWXRenderManager.getWXSDKInstance(mInstanceId);
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
index ca79066..a11e820 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
@@ -35,6 +35,8 @@ public class WXDomHandler implements Handler.Callback {
    * The batch operation in dom thread will run at most once in 16ms.
    */
   public static final int DELAY_TIME = 16;//ms
+  public static final int TRANSITION_DELAY_TIME = 2;//2ms, start transition as soon as
+
   private WXDomManager mWXDomManager;
   private boolean mHasBatch = false;
 
@@ -61,8 +63,14 @@ public class WXDomHandler implements Handler.Callback {
 
     if (!mHasBatch) {
       mHasBatch = true;
-      mWXDomManager.sendEmptyMessageDelayed(WXDomHandler.MsgType.WX_DOM_BATCH, DELAY_TIME);
-    }
+      if(what != WXDomHandler.MsgType.WX_DOM_BATCH) {
+        int delayTime = DELAY_TIME;
+        if(what == MsgType.WX_DOM_TRANSITION_BATCH){
+          delayTime = TRANSITION_DELAY_TIME;
+        }
+        mWXDomManager.sendEmptyMessageDelayed(WXDomHandler.MsgType.WX_DOM_BATCH, delayTime);
+      }
+     }
     switch (what) {
       case MsgType.WX_EXECUTE_ACTION:
         mWXDomManager.executeAction(task.instanceId, (DOMAction) task.args.get(0), (boolean) task.args.get(1));
@@ -125,6 +133,9 @@ public class WXDomHandler implements Handler.Callback {
     public static final int WX_DOM_BATCH = 0xff;
     public static final int WX_CONSUME_RENDER_TASKS = 0xfa;
 
+
+    public static final int WX_DOM_TRANSITION_BATCH = 0xfb;
+
     @Deprecated
     public static final int WX_COMPONENT_SIZE= 0xff1;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
index 03f3057..127309c 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
@@ -33,6 +33,7 @@ import com.taobao.weex.common.Constants.Name;
 import com.taobao.weex.dom.flex.CSSLayoutContext;
 import com.taobao.weex.dom.flex.CSSNode;
 import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.transition.WXTransition;
 import com.taobao.weex.ui.component.WXBasicComponentType;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXViewUtils;
@@ -43,6 +44,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+
+
 /**
  * WXDomObject contains all the info about the given node, including style, attribute and event.
  * Unlike {@link com.taobao.weex.ui.component.WXComponent}, WXDomObject only contains info about
@@ -87,6 +90,8 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
 
   /** package **/ WXEvent mEvents;
 
+  private  WXTransition transition;;
+
 
 
 
@@ -165,6 +170,9 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
     return mEvents;
   }
 
+  public WXTransition getTransition() {
+    return transition;
+  }
 
   public @NonNull DomContext getDomContext() {
     return mDomContext;
@@ -221,6 +229,7 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
       WXStyle styles = new WXStyle();
       styles.putAll((JSONObject) style,false);
       this.mStyles = styles;
+      this.transition = WXTransition.fromMap(styles, this);
     }
     Object attr = map.get("attr");
     if (attr != null && attr instanceof JSONObject) {
@@ -453,18 +462,38 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
     if (styles == null || styles.isEmpty()) {
       return;
     }
+    if(transition != null){
+      if(transition.hasTransitionProperty(styles)){
+        transition.startTransition(styles);
+      }
+    }
     if (mStyles == null) {
       mStyles = new WXStyle();
     }
     mStyles.putAll(styles,byPesudo);
+    if(transition == null){
+      this.transition = WXTransition.fromMap(mStyles, this);
+    }
     super.dirty();
   }
 
-  /** package **/ void applyStyleToNode() {
+
+  public void applyStyle(Map<String, Object> styles){
+     applyStyleToNode(styles);
+  }
+
+  void applyStyleToNode() {
+    applyStyleToNode(getStyles());
+  }
+
+  /** package **/ void applyStyleToNode(Map<String, Object> updates) {
+    if(updates.size() == 0){
+      return;
+    }
     WXStyle stylesMap = getStyles();
     int vp = getViewPortWidth();
     if (!stylesMap.isEmpty()) {
-      for(Map.Entry<String,Object> item:stylesMap.entrySet()) {
+      for(Map.Entry<String,Object> item: updates.entrySet()) {
         switch (item.getKey()) {
           case Constants.Name.ALIGN_ITEMS:
             setAlignItems(stylesMap.getAlignItems());

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java
index 5510ea9..93d376f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AnimationAction.java
@@ -61,6 +61,13 @@ import com.taobao.weex.utils.WXViewUtils;
 import java.util.HashMap;
 import java.util.List;
 
+import static com.taobao.weex.common.Constants.TimeFunction.CUBIC_BEZIER;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE_IN;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE_IN_OUT;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE_OUT;
+import static com.taobao.weex.common.Constants.TimeFunction.LINEAR;
+
 
 class AnimationAction implements DOMAction, RenderAction {
 
@@ -245,29 +252,31 @@ class AnimationAction implements DOMAction, RenderAction {
     String interpolator = mAnimationBean.timingFunction;
     if (!TextUtils.isEmpty(interpolator)) {
       switch (interpolator) {
-        case WXAnimationBean.EASE_IN:
-          return new AccelerateInterpolator();
-        case WXAnimationBean.EASE_OUT:
-          return new DecelerateInterpolator();
-        case WXAnimationBean.EASE_IN_OUT:
-          return new AccelerateDecelerateInterpolator();
-        case WXAnimationBean.LINEAR:
-          return new LinearInterpolator();
+        case EASE_IN:
+          return PathInterpolatorCompat.create(0.42f,0f, 1f,1f);
+        case EASE_OUT:
+          return PathInterpolatorCompat.create(0f,0f, 0.58f,1f);
+        case EASE_IN_OUT:
+          return PathInterpolatorCompat.create(0.42f,0f, 0.58f,1f);
+        case EASE:
+          return PathInterpolatorCompat.create(0.25f,0.1f, 0.25f,1f);
+        case LINEAR:
+          return PathInterpolatorCompat.create(0.0f,0f, 1f,1f);
         default:
           //Parse cubic-bezier
           try {
             SingleFunctionParser<Float> parser = new SingleFunctionParser<>(
-                mAnimationBean.timingFunction,
-                new SingleFunctionParser.FlatMapper<Float>() {
-                  @Override
-                  public Float map(String raw) {
-                    return Float.parseFloat(raw);
-                  }
-                });
-            List<Float> params = parser.parse(WXAnimationBean.CUBIC_BEZIER);
+                    mAnimationBean.timingFunction,
+                    new SingleFunctionParser.FlatMapper<Float>() {
+                      @Override
+                      public Float map(String raw) {
+                        return Float.parseFloat(raw);
+                      }
+                    });
+            List<Float> params = parser.parse(CUBIC_BEZIER);
             if (params != null && params.size() == WXAnimationBean.NUM_CUBIC_PARAM) {
               return PathInterpolatorCompat.create(
-                  params.get(0), params.get(1), params.get(2), params.get(3));
+                      params.get(0), params.get(1), params.get(2), params.get(3));
             } else {
               return null;
             }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
index a4dc8e9..bb19b32 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
@@ -73,16 +73,22 @@ class UpdateStyleAction extends TraceableAction implements DOMAction, RenderActi
     mPadding = domObject.getPadding();
     mBorder = domObject.getBorder();
 
-    Map<String, Object> animationMap = new ArrayMap<>(2);
-    animationMap.put(WXDomObject.TRANSFORM, mData.get(WXDomObject.TRANSFORM));
-    animationMap.put(WXDomObject.TRANSFORM_ORIGIN, mData.get(WXDomObject.TRANSFORM_ORIGIN));
+    if(mData.get(WXDomObject.TRANSFORM) != null || mData.get(WXDomObject.TRANSFORM_ORIGIN) != null){
+      if(domObject.getTransition() == null) {
+        Map<String, Object> animationMap = new ArrayMap<>(2);
+        animationMap.put(WXDomObject.TRANSFORM, mData.get(WXDomObject.TRANSFORM));
+        animationMap.put(WXDomObject.TRANSFORM_ORIGIN, mData.get(WXDomObject.TRANSFORM_ORIGIN));
+        context.addAnimationForElement(mRef, animationMap);
+      }
+    }
 
-    context.addAnimationForElement(mRef, animationMap);
 
     if (!mData.isEmpty()) {
-      domObject.updateStyle(mData, mIsCausedByPesudo);
-      domObject.traverseTree(context.getApplyStyleConsumer());
-      context.postRenderTask(this);
+      domObject.updateStyle(mData);
+      domObject.applyStyle(mData);
+      if(!mData.isEmpty()) {
+        context.postRenderTask(this);
+      }
     }
 
     if (instance != null) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/dom/transition/WXTransition.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/transition/WXTransition.java b/android/sdk/src/main/java/com/taobao/weex/dom/transition/WXTransition.java
new file mode 100644
index 0000000..fc477bb
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/transition/WXTransition.java
@@ -0,0 +1,626 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.dom.transition;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ArgbEvaluator;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.animation.ValueAnimator;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Handler;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.ArraySet;
+import android.support.v4.view.animation.PathInterpolatorCompat;
+import android.text.TextUtils;
+import android.util.Property;
+import android.view.View;
+import android.view.animation.Interpolator;
+
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.common.Constants;
+import com.taobao.weex.dom.DOMActionContext;
+import com.taobao.weex.dom.WXDomHandler;
+import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.ui.animation.BackgroundColorProperty;
+import com.taobao.weex.ui.animation.TransformParser;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.utils.SingleFunctionParser;
+import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.WXResourceUtils;
+import com.taobao.weex.utils.WXUtils;
+import com.taobao.weex.utils.WXViewUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import static com.taobao.weex.common.Constants.TimeFunction.CUBIC_BEZIER;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE_IN;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE_IN_OUT;
+import static com.taobao.weex.common.Constants.TimeFunction.EASE_OUT;
+import static com.taobao.weex.common.Constants.TimeFunction.LINEAR;
+
+/**
+ *   transition on dom thread
+ *   transition-property: height;
+ *   transition-duration: .3s;
+ *   transition-delay: .05s;
+ *   transition-timing-function: ease-in-out;
+ *
+ *   Created by furture on 2017/10/18.
+ */
+public class WXTransition {
+
+    public static final  String TRANSITION_PROPERTY = "transitionProperty";
+    public static final  String TRANSITION_DURATION = "transitionDuration";
+    public static final  String TRANSITION_DELAY = "transitionDelay";
+    public static final  String TRANSITION_TIMING_FUNCTION = "transitionTimingFunction";
+    public static final  Pattern PROPERTY_SPLIT_PATTERN = Pattern.compile("\\||,");
+
+
+    /**
+     * layout animation property
+     * */
+    private static final Set<String> LAYOUT_PROPERTIES = new ArraySet<>();
+    static {
+        LAYOUT_PROPERTIES.add(Constants.Name.WIDTH);
+        LAYOUT_PROPERTIES.add(Constants.Name.HEIGHT);
+        LAYOUT_PROPERTIES.add(Constants.Name.MARGIN_TOP);
+        LAYOUT_PROPERTIES.add(Constants.Name.MARGIN_BOTTOM);
+        LAYOUT_PROPERTIES.add(Constants.Name.MARGIN_LEFT);
+        LAYOUT_PROPERTIES.add(Constants.Name.MARGIN_RIGHT);
+    }
+
+    /**
+     * transform animation property, use android system animaton ability
+     * */
+    private static final Set<String> TRANSFORM_PROPERTIES = new ArraySet<>();
+    static {
+        TRANSFORM_PROPERTIES.add(Constants.Name.OPACITY);
+        TRANSFORM_PROPERTIES.add(Constants.Name.BACKGROUND_COLOR);
+        TRANSFORM_PROPERTIES.add(Constants.Name.TRANSFORM);
+    }
+
+    private List<String> properties;
+    private Interpolator  interpolator;
+    private float  duration;
+    private float delay;
+    private WXDomObject domObject;
+    private Handler handler;
+    private ValueAnimator layoutValueAnimator;
+    private Map<String, Object> layoutPendingUpdates;
+    private ObjectAnimator transformAnimator;
+    private Map<String, Object> transformPendingUpdates;
+    private Runnable transitionEndEvent;
+    private Map<String, Object> targetStyles;
+    private Runnable animationRunnable;
+
+
+    public WXTransition() {
+        this.properties = new ArrayList<>(4);
+        this.handler = new Handler();
+        this.layoutPendingUpdates = new ArrayMap<>();
+        this.transformPendingUpdates = new ArrayMap<>();
+        this.targetStyles = new ArrayMap<>();
+    }
+
+    /**
+     * create transition from map styles if style contains transitionProperty
+     * */
+    public static WXTransition fromMap(Map<String, Object> style, WXDomObject domObject){
+        if(style.get(TRANSITION_PROPERTY) == null){
+            return  null;
+        }
+        String propertyString = WXUtils.getString(style.get(TRANSITION_PROPERTY), null);
+        if(propertyString == null){
+            return null;
+        }
+        WXTransition transition  = new WXTransition();
+        String[] propertiesArray = PROPERTY_SPLIT_PATTERN.split(propertyString);
+        for(String property : propertiesArray){
+            String trim = property.trim();
+            if(TextUtils.isEmpty(trim)){
+                continue;
+            }
+            if(!(LAYOUT_PROPERTIES.contains(trim) || TRANSFORM_PROPERTIES.contains(trim))){
+                if(WXEnvironment.isApkDebugable()){
+                    WXLogUtils.e("WXTransition Property Not Supported" + trim + " in " + propertyString);
+                }
+                continue;
+            }
+            transition.properties.add(trim);
+        }
+        if(transition.properties.isEmpty()){
+            return  null;
+        }
+        transition.duration = parseTimeMillis(style, TRANSITION_DURATION, 1);
+        transition.delay =  parseTimeMillis(style, TRANSITION_DELAY, 0);
+        transition.interpolator = createTimeInterpolator(WXUtils.getString(style.get(TRANSITION_TIMING_FUNCTION), null));
+        transition.domObject = domObject;
+        return  transition;
+    }
+
+
+    /**
+     * check updates has transition property
+     * */
+    public boolean hasTransitionProperty(Map<String, Object> styles){
+        for(String property : properties){
+            if(styles.containsKey(property)){
+                return  true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * start transition animation, updates maybe split two different updates,
+     * because javascript will send multi update on same transition, we assume that updates in 8ms is one transition
+     * */
+    public void  startTransition(Map<String, Object> updates){
+        final View taregtView = getTargetView();
+        if(taregtView == null){
+            return;
+        }
+        for(String property : properties){
+            if(updates.containsKey(property)){
+                Object targetValue = updates.remove(property);
+                if(LAYOUT_PROPERTIES.contains(property)) {
+                    layoutPendingUpdates.put(property, targetValue);
+                }else if(TRANSFORM_PROPERTIES.contains(property)){
+                    transformPendingUpdates.put(property, targetValue);
+                }
+            }
+        }
+        int delay = WXUtils.getNumberInt(domObject.getAttrs().get("actionDelay"), 16);
+        if(animationRunnable != null) {
+            handler.removeCallbacks(animationRunnable);
+        }
+        if(animationRunnable == null){
+            animationRunnable = new Runnable() {
+                @Override
+                public void run() {
+                    doTransitionAnimation();
+                    animationRunnable = null;
+                }
+            };
+        }
+        handler.postDelayed(animationRunnable, delay);
+    }
+
+    /**
+     * doTransitionAnimation include transform and layout animation.
+     * 1. put pre transition updates from target style to dom style
+     * 2. do transform animation and layout animation
+     * */
+    private void  doTransitionAnimation(){
+        final View taregtView = getTargetView();
+        if(taregtView == null){
+            return;
+        }
+        if(targetStyles.size() > 0){
+            for(String property : properties){
+                if(!(LAYOUT_PROPERTIES.contains(property) || TRANSFORM_PROPERTIES.contains(property))){
+                    continue;
+                }
+                if(layoutPendingUpdates.containsKey(property)){
+                    continue;
+                }
+                if(transformPendingUpdates.containsKey(property)){
+                    continue;
+                }
+                synchronized (targetStyles){
+                    if(targetStyles.containsKey(property)){
+                        //reset pre transition style
+                        Object targetValue = targetStyles.remove(property);
+                        domObject.getStyles().put(property, targetValue);
+                        WXComponent component = getComponent();
+                        if(component != null
+                                && component.getDomObject() != null){
+                            component.getDomObject().getStyles().put(property, targetValue);
+                        }
+                    }
+                }
+            }
+        }
+
+
+
+        if(transitionEndEvent != null){
+            taregtView.removeCallbacks(transitionEndEvent);
+        }
+        if(transitionEndEvent == null){
+            transitionEndEvent = new Runnable(){
+                @Override
+                public void run() {
+                    transitionEndEvent = null;
+                    WXComponent component = getComponent();
+                    if(component != null && domObject.getEvents().contains(Constants.Event.ON_TRANSITION_END)){
+                        component.fireEvent(Constants.Event.ON_TRANSITION_END);
+                    }
+                }
+            };
+        }
+
+        taregtView.post(new Runnable() {
+            @Override
+            public void run() {
+                doPendingTransformAnimation();
+            }
+        });
+        doPendingLayoutAnimation();
+    }
+
+
+    /**
+     *  transform, opacity, backgroundcolor which not effect layout use android system animation in main thread.
+     * */
+    private void doPendingTransformAnimation() {
+        if(transformAnimator != null){
+            transformAnimator.cancel();
+            transformAnimator = null;
+        }
+        if(transformPendingUpdates.size() == 0){
+            return;
+        }
+        final View taregtView = getTargetView();
+        if(taregtView == null){
+            return;
+        }
+        List<PropertyValuesHolder> holders = new ArrayList<>(8);
+        String transform  = WXUtils.getString(transformPendingUpdates.remove(Constants.Name.TRANSFORM), null);
+        if(!TextUtils.isEmpty(transform)){
+            Map<Property<View,Float>, Float>  properties = TransformParser.parseTransForm(transform, (int)domObject.getLayoutWidth(), (int)domObject.getLayoutHeight(), domObject.getViewPortWidth());
+            PropertyValuesHolder[]  transformHolders = TransformParser.toHolders(properties);
+            for(PropertyValuesHolder holder : transformHolders){
+                holders.add(holder);
+            }
+        }
+
+        for(String property : properties){
+            if(!TRANSFORM_PROPERTIES.contains(property)){
+                continue;
+            }
+            if(!transformPendingUpdates.containsKey(property)){
+                continue;
+            }
+            Object value = transformPendingUpdates.remove(property);
+            synchronized (targetStyles) {
+                targetStyles.put(property, value);
+            }
+            switch (property){
+                case Constants.Name.OPACITY:{
+                    holders.add(PropertyValuesHolder.ofFloat(View.ALPHA, taregtView.getAlpha(), WXUtils.getFloat(value, 1.0f)));
+                }
+                break;
+                case Constants.Name.BACKGROUND_COLOR:{
+                    int fromColor = WXResourceUtils.getColor(WXUtils.getString(domObject.getStyles().getBackgroundColor(), null), 0);
+                    int toColor = WXResourceUtils.getColor(WXUtils.getString(value, null), 0);
+                    if(WXViewUtils.getBorderDrawable(taregtView) != null){
+                        fromColor = WXViewUtils.getBorderDrawable(taregtView).getColor();
+                    }else if (taregtView.getBackground() instanceof ColorDrawable) {
+                        fromColor = ((ColorDrawable) taregtView.getBackground()).getColor();
+                    }
+                    holders.add(PropertyValuesHolder.ofObject(new BackgroundColorProperty(), new ArgbEvaluator(), fromColor,toColor));
+                }
+                break;
+                default:break;
+            }
+        }
+        transformPendingUpdates.clear();
+        transformAnimator =  ObjectAnimator.ofPropertyValuesHolder(taregtView, holders.toArray(new PropertyValuesHolder[holders.size()]));
+        transformAnimator.setDuration((long) duration);
+        transformAnimator.setStartDelay((long) delay);
+        if(interpolator != null) {
+            transformAnimator.setInterpolator(interpolator);
+        }
+        transformAnimator.addListener(new AnimatorListenerAdapter() {
+            boolean  hasCancel = false;
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                super.onAnimationCancel(animation);
+                hasCancel = true;
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                if(hasCancel){
+                    return;
+                }
+                super.onAnimationEnd(animation);
+                WXTransition.this.onTransitionAnimationEnd();
+                if(WXEnvironment.isApkDebugable()){
+                    WXLogUtils.d("WXTransition transform onTransitionAnimationEnd " +  domObject.getRef());
+                }
+            }
+        });
+        transformAnimator.start();
+    }
+
+
+    public void doPendingLayoutAnimation(){
+        if(layoutValueAnimator != null){
+            layoutValueAnimator.cancel();
+            layoutValueAnimator = null;
+        }
+        if(layoutPendingUpdates.size() == 0){
+            return;
+        }
+        PropertyValuesHolder[] holders = new PropertyValuesHolder[layoutPendingUpdates.size()];
+        int index = 0;
+        for(String property : properties){
+            if(!LAYOUT_PROPERTIES.contains(property)){
+                continue;
+            }
+            if(layoutPendingUpdates.containsKey(property)){
+                Object targetValue = layoutPendingUpdates.remove(property);
+                synchronized (targetStyles) {
+                    targetStyles.put(property, targetValue);
+                }
+                holders[index] = createLayoutPropertyValueHolder(property, targetValue);
+                index++;
+            }
+        }
+        layoutPendingUpdates.clear();
+        doLayoutPropertyValuesHolderAnimation(holders);
+    }
+
+
+    private PropertyValuesHolder createLayoutPropertyValueHolder(String property, Object value){
+        PropertyValuesHolder holder = null;
+        switch (property){
+            case Constants.Name.WIDTH:{
+                holder = PropertyValuesHolder.ofFloat(Constants.Name.WIDTH, domObject.getLayoutWidth(),
+                        WXViewUtils.getRealPxByWidth(WXUtils.getFloat(value), domObject.getViewPortWidth()));
+            }
+            break;
+            case Constants.Name.HEIGHT:{
+                holder = PropertyValuesHolder.ofFloat(Constants.Name.HEIGHT, domObject.getLayoutHeight(),
+                        WXViewUtils.getRealPxByWidth(WXUtils.getFloat(value), domObject.getViewPortWidth()));
+            }
+            break;
+            case Constants.Name.MARGIN_TOP:{
+                holder = PropertyValuesHolder.ofFloat(Constants.Name.MARGIN_TOP,  domObject.getMargin().get(Spacing.TOP),
+                        WXViewUtils.getRealPxByWidth(WXUtils.getFloatByViewport(value, domObject.getViewPortWidth()), domObject.getViewPortWidth()));
+            }
+            break;
+            case Constants.Name.MARGIN_LEFT:{
+                holder = PropertyValuesHolder.ofFloat(Constants.Name.MARGIN_LEFT,  domObject.getMargin().get(Spacing.LEFT),
+                        WXViewUtils.getRealPxByWidth(WXUtils.getFloatByViewport(value, domObject.getViewPortWidth()), domObject.getViewPortWidth()));
+            }
+            break;
+            case Constants.Name.MARGIN_RIGHT:{
+                holder = PropertyValuesHolder.ofFloat(Constants.Name.MARGIN_RIGHT,  domObject.getMargin().get(Spacing.RIGHT),
+                        WXViewUtils.getRealPxByWidth(WXUtils.getFloatByViewport(value, domObject.getViewPortWidth()), domObject.getViewPortWidth()));
+            }
+            break;
+            case Constants.Name.MARGIN_BOTTOM:{
+                holder = PropertyValuesHolder.ofFloat(Constants.Name.MARGIN_BOTTOM,  domObject.getMargin().get(Spacing.BOTTOM),
+                        WXViewUtils.getRealPxByWidth(WXUtils.getFloatByViewport(value, domObject.getViewPortWidth()), domObject.getViewPortWidth()));
+            }
+            break;
+            default:
+                break;
+        }
+        if(holder == null){
+            holder  = PropertyValuesHolder.ofFloat(property, 1, 1);
+        }
+        return  holder;
+    }
+
+    private void doLayoutPropertyValuesHolderAnimation(PropertyValuesHolder[] holders){
+        layoutValueAnimator = ValueAnimator.ofPropertyValuesHolder(holders);
+        layoutValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator animation) {
+                PropertyValuesHolder holders[] = animation.getValues();
+                for(PropertyValuesHolder holder : holders){
+                    String property =  holder.getPropertyName();
+                    switch (property){
+                        case Constants.Name.WIDTH:{
+                            domObject.setStyleWidth((Float) animation.getAnimatedValue(property));
+                        }
+                        break;
+                        case Constants.Name.HEIGHT:{
+                            domObject.setStyleHeight((Float) animation.getAnimatedValue(property));
+                        }
+                        break;
+                        case Constants.Name.MARGIN_TOP:{
+                            domObject.setMargin(Spacing.TOP, (Float) animation.getAnimatedValue(property));
+                        }
+                        break;
+                        case Constants.Name.MARGIN_LEFT:{
+                            domObject.setMargin(Spacing.LEFT, (Float) animation.getAnimatedValue(property));
+                        }
+                        break;
+                        case Constants.Name.MARGIN_RIGHT:{
+                            domObject.setMargin(Spacing.RIGHT, (Float) animation.getAnimatedValue(property));
+                        }
+                        break;
+                        case Constants.Name.MARGIN_BOTTOM:{
+                            domObject.setMargin(Spacing.BOTTOM, (Float) animation.getAnimatedValue(property));
+                        }
+                        break;
+                        default:
+                            break;
+                    }
+                }
+
+                DOMActionContext domActionContext = WXSDKManager.getInstance().getWXDomManager().getDomContext(domObject.getDomContext().getInstanceId());
+                if(domActionContext == null){
+                    return;
+                }
+                domActionContext.markDirty();
+                WXSDKManager.getInstance().getWXDomManager().sendEmptyMessageDelayed(WXDomHandler.MsgType.WX_DOM_TRANSITION_BATCH, 0);
+                if(WXEnvironment.isApkDebugable()){
+                    WXLogUtils.d("WXTransition send layout batch msg");
+                }
+            }
+        });
+        layoutValueAnimator.addListener(new AnimatorListenerAdapter() {
+
+            boolean  hasCancel = false;
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                super.onAnimationCancel(animation);
+                hasCancel = true;
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                if(hasCancel){
+                    return;
+                }
+                super.onAnimationEnd(animation);
+                if(WXEnvironment.isApkDebugable()){
+                    WXLogUtils.d("WXTransition layout onTransitionAnimationEnd " +  domObject.getRef());
+                }
+                WXTransition.this.onTransitionAnimationEnd();
+            }
+        });
+        if(interpolator != null) {
+            layoutValueAnimator.setInterpolator(interpolator);
+        }
+        layoutValueAnimator.setStartDelay((long) (delay));
+        layoutValueAnimator.setDuration((long) (duration));
+        layoutValueAnimator.start();
+    }
+
+    private synchronized void onTransitionAnimationEnd(){
+        if(transitionEndEvent != null){
+            View view = getTargetView();
+            if(view != null &&  transitionEndEvent != null){
+                view.post(transitionEndEvent);
+            }
+            transitionEndEvent = null;
+        }
+        synchronized (targetStyles){
+            if(targetStyles.size() > 0){
+                WXComponent component = getComponent();
+                for(String property : properties) {
+                    if(targetStyles.containsKey(property)){
+                        Object targetValue = targetStyles.remove(property);
+                        domObject.getStyles().put(property, targetValue);
+                        if(component != null && component.getDomObject() != null){
+                            component.getDomObject().getStyles().put(property, targetValue);
+                        }
+                    }
+                }
+                targetStyles.clear();
+            }
+        }
+    }
+
+    private WXComponent getComponent(){
+        DOMActionContext domActionContext = WXSDKManager.getInstance().getWXDomManager().getDomContext(domObject.getDomContext().getInstanceId());
+        if(domActionContext != null){
+            WXComponent component = domActionContext.getCompByRef(domObject.getRef());
+            return  component;
+        }
+        return null;
+    }
+
+
+    private View getTargetView(){
+        if(domObject.getDomContext() == null){
+            return null;
+        }
+        DOMActionContext domActionContext = WXSDKManager.getInstance().getWXDomManager().getDomContext(domObject.getDomContext().getInstanceId());
+        if(domActionContext != null){
+            WXComponent component = domActionContext.getCompByRef(domObject.getRef());
+            if(component != null && component.getHostView() != null) {
+                return  component.getHostView();
+            }
+        }
+        return null;
+    }
+
+
+
+
+    /**
+     * get time millis
+     * */
+    private static float parseTimeMillis(Map<String, Object> style, String key, float defaultValue){
+        String  duration = WXUtils.getString(style.get(key), null);
+        if(duration != null){
+            duration = duration.replaceAll("s", "");
+        }
+        if(TextUtils.isEmpty(duration)){
+            return  defaultValue;
+        }
+        try{
+           return Float.parseFloat(duration);
+        }catch (NumberFormatException e){
+            return  defaultValue;
+        }
+    }
+
+    /**
+     * create interpolcator same with web
+     * http://www.w3school.com.cn/cssref/pr_transition-timing-function.asp
+     * */
+    private static Interpolator createTimeInterpolator(String interpolator) {
+        if (!TextUtils.isEmpty(interpolator)) {
+            switch (interpolator) {
+                case EASE_IN:
+                    return PathInterpolatorCompat.create(0.42f,0f, 1f,1f);
+                case EASE_OUT:
+                    return PathInterpolatorCompat.create(0f,0f, 0.58f,1f);
+                case EASE_IN_OUT:
+                    return PathInterpolatorCompat.create(0.42f,0f, 0.58f,1f);
+                case EASE:
+                    return PathInterpolatorCompat.create(0.25f,0.1f, 0.25f,1f);
+                case LINEAR:
+                    return PathInterpolatorCompat.create(0.0f,0f, 1f,1f);
+                default:
+                    try {
+                        //Parse cubic-bezier
+                        SingleFunctionParser<Float> parser = new SingleFunctionParser<>(
+                                interpolator,
+                                new SingleFunctionParser.FlatMapper<Float>() {
+                                    @Override
+                                    public Float map(String raw) {
+                                        return Float.parseFloat(raw);
+                                    }
+                                });
+                        List<Float> params = parser.parse(CUBIC_BEZIER);
+                        if (params != null && params.size() == 4) {
+                            return PathInterpolatorCompat.create(
+                                    params.get(0), params.get(1), params.get(2), params.get(3));
+                        }
+                    } catch (RuntimeException e) {
+                        if(WXEnvironment.isApkDebugable()) {
+                            WXLogUtils.e("WXTransition", e);
+                        }
+                    }
+            }
+        }
+        return PathInterpolatorCompat.create(0.25f,0.1f, 0.25f,1f);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/ui/animation/TransformParser.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/animation/TransformParser.java b/android/sdk/src/main/java/com/taobao/weex/ui/animation/TransformParser.java
new file mode 100644
index 0000000..decc78e
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/animation/TransformParser.java
@@ -0,0 +1,296 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.ui.animation;
+
+import android.animation.PropertyValuesHolder;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.util.ArrayMap;
+import android.text.TextUtils;
+import android.util.Pair;
+import android.util.Property;
+import android.view.View;
+
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.common.Constants;
+import com.taobao.weex.ui.animation.CameraDistanceProperty;
+import com.taobao.weex.ui.animation.WXAnimationBean;
+import com.taobao.weex.utils.FunctionParser;
+import com.taobao.weex.utils.WXDataStructureUtil;
+import com.taobao.weex.utils.WXUtils;
+import com.taobao.weex.utils.WXViewUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by furture on 2017/10/24.
+ */
+
+public class TransformParser {
+
+    public final static String WX_TRANSLATE = "translate";
+    public final static String WX_TRANSLATE_X = "translateX";
+    public final static String WX_TRANSLATE_Y = "translateY";
+    public final static String WX_ROTATE = "rotate";
+    public final static String WX_ROTATE_X ="rotateX";
+    public final static String WX_ROTATE_Y ="rotateY";
+    public final static String WX_SCALE = "scale";
+    public final static String WX_SCALE_X = "scaleX";
+    public final static String WX_SCALE_Y = "scaleY";
+
+    public final static String BACKGROUND_COLOR = Constants.Name.BACKGROUND_COLOR;
+    public final static String WIDTH = Constants.Name.WIDTH;
+    public final static String HEIGHT = Constants.Name.HEIGHT;
+    public final static String TOP = "top";
+    public final static String BOTTOM = "bottom";
+    public final static String RIGHT = "right";
+    public final static String LEFT = "left";
+    public final static String CENTER = "center";
+    private static final String HALF = "50%";
+    private static final String FULL = "100%";
+    private static final String ZERO = "0%";
+    private static final String PX = "px";
+    private static final String DEG = "deg";
+    public static Map<String, List<Property<View,Float>>> wxToAndroidMap = new ArrayMap<>();
+
+
+    static {
+        wxToAndroidMap.put(WX_TRANSLATE, Arrays.asList
+                (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));
+        wxToAndroidMap.put(WX_ROTATE_X, Collections.singletonList(View.ROTATION_X));
+        wxToAndroidMap.put(WX_ROTATE_Y, Collections.singletonList(View.ROTATION_Y));
+        wxToAndroidMap.put(WX_SCALE, Arrays.asList(View.SCALE_X, View.SCALE_Y));
+        wxToAndroidMap.put(WX_SCALE_X, Collections.singletonList(View.SCALE_X));
+        wxToAndroidMap.put(WX_SCALE_Y, Collections.singletonList(View.SCALE_Y));
+        wxToAndroidMap.put(Constants.Name.PERSPECTIVE, Collections.singletonList(CameraDistanceProperty.getInstance()));
+        wxToAndroidMap = Collections.unmodifiableMap(wxToAndroidMap);
+    }
+
+    public static PropertyValuesHolder[] toHolders(Map<Property<View,Float>, Float> transformMap){
+        PropertyValuesHolder[]  holders = new PropertyValuesHolder[transformMap.size()];
+        int i=0;
+        for (Map.Entry<Property<View, Float>, Float> entry : transformMap.entrySet()) {
+            holders[i] = PropertyValuesHolder.ofFloat(entry.getKey(), entry.getValue());
+            i++;
+        }
+        return holders;
+    }
+
+    public static Map<Property<View,Float>, Float> parseTransForm(@Nullable String rawTransform, final int width,
+                                                                   final int height, final int viewportW) {
+        if (!TextUtils.isEmpty(rawTransform)) {
+            FunctionParser<Property<View,Float>, Float> parser = new FunctionParser<>
+                    (rawTransform, new FunctionParser.Mapper<Property<View,Float>, Float>() {
+                        @Override
+                        public Map<Property<View,Float>, Float> map(String functionName, List<String> raw) {
+                            if (raw != null && !raw.isEmpty()) {
+                                if (wxToAndroidMap.containsKey(functionName)) {
+                                    return convertParam(width, height,viewportW, wxToAndroidMap.get(functionName), raw);
+                                }
+                            }
+                            return new HashMap<>();
+                        }
+
+                        private Map<Property<View,Float>, Float> convertParam(int width, int height,int viewportW,
+                                                                              @NonNull List<Property<View,Float>> propertyList,
+                                                                              @NonNull List<String> rawValue) {
+
+                            Map<Property<View,Float>, Float> result = WXDataStructureUtil.newHashMapWithExpectedSize(propertyList.size());
+                            List<Float> convertedList = new ArrayList<>(propertyList.size());
+                            if (propertyList.contains(View.ROTATION) ||
+                                    propertyList.contains(View.ROTATION_X) ||
+                                    propertyList.contains(View.ROTATION_Y)) {
+                                convertedList.addAll(parseRotationZ(rawValue));
+                            }else if (propertyList.contains(View.TRANSLATION_X) ||
+                                    propertyList.contains(View.TRANSLATION_Y)) {
+                                convertedList.addAll(parseTranslation(propertyList, width, height, rawValue,viewportW));
+                            } else if (propertyList.contains(View.SCALE_X) ||
+                                    propertyList.contains(View.SCALE_Y)) {
+                                convertedList.addAll(parseScale(propertyList.size(), rawValue));
+                            }
+                            else if(propertyList.contains(CameraDistanceProperty.getInstance())){
+                                convertedList.add(parseCameraDistance(rawValue));
+                            }
+                            if (propertyList.size() == convertedList.size()) {
+                                for (int i = 0; i < propertyList.size(); i++) {
+                                    result.put(propertyList.get(i), convertedList.get(i));
+                                }
+                            }
+                            return result;
+                        }
+
+                        private List<Float> parseScale(int size, @NonNull List<String> rawValue) {
+                            List<Float> convertedList = new ArrayList<>(rawValue.size() * 2);
+                            List<Float> rawFloat = new ArrayList<>(rawValue.size());
+                            for (String item : rawValue) {
+                                rawFloat.add(WXUtils.fastGetFloat(item));
+                            }
+                            convertedList.addAll(rawFloat);
+                            if (size != 1 && rawValue.size() == 1) {
+                                convertedList.addAll(rawFloat);
+                            }
+                            return convertedList;
+                        }
+
+                        private @NonNull List<Float> parseRotationZ(@NonNull List<String> rawValue) {
+                            List<Float> convertedList = new ArrayList<>(1);
+                            int suffix;
+                            for (String raw : rawValue) {
+                                if ((suffix = raw.lastIndexOf(DEG)) != -1) {
+                                    convertedList.add(WXUtils.fastGetFloat(raw.substring(0, suffix)));
+                                } else {
+                                    convertedList.add((float) Math.toDegrees(Double.parseDouble(raw)));
+                                }
+                            }
+                            return convertedList;
+                        }
+
+                        /**
+                         * As "translate(50%, 25%)" or "translate(25px, 30px)" both are valid,
+                         * parsing translate is complicated than other method.
+                         * Add your waste time here if you try to optimize this method like {@link #parseScale(int, List)}
+                         * Time: 0.5h
+                         */
+                        private List<Float> parseTranslation(List<Property<View,Float>> propertyList,
+                                                             int width, int height,
+                                                             @NonNull List<String> rawValue,int viewportW) {
+                            List<Float> convertedList = new ArrayList<>(2);
+                            String first = rawValue.get(0);
+                            if (propertyList.size() == 1) {
+                                parseSingleTranslation(propertyList, width, height, convertedList, first,viewportW);
+                            } else {
+                                parseDoubleTranslation(width, height, rawValue, convertedList, first,viewportW);
+                            }
+                            return convertedList;
+                        }
+
+                        private void parseSingleTranslation(List<Property<View,Float>> propertyList, int width, int height,
+                                                            List<Float> convertedList, String first,int viewportW) {
+                            if (propertyList.contains(View.TRANSLATION_X)) {
+                                convertedList.add(parsePercentOrPx(first, width,viewportW));
+                            } else if (propertyList.contains(View.TRANSLATION_Y)) {
+                                convertedList.add(parsePercentOrPx(first, height,viewportW));
+                            }
+                        }
+
+                        private void parseDoubleTranslation(int width, int height,
+                                                            @NonNull List<String> rawValue,
+                                                            List<Float> convertedList, String first,int viewportW) {
+                            String second;
+                            if (rawValue.size() == 1) {
+                                second = first;
+                            } else {
+                                second = rawValue.get(1);
+                            }
+                            convertedList.add(parsePercentOrPx(first, width,viewportW));
+                            convertedList.add(parsePercentOrPx(second, height,viewportW));
+                        }
+
+                        private Float parseCameraDistance(List<String> rawValue){
+                            float ret=Float.MAX_VALUE;
+                            if(rawValue.size() == 1){
+                                float value = WXViewUtils.getRealPxByWidth(WXUtils.getFloat(rawValue.get(0)), viewportW);
+                                float scale = WXEnvironment.getApplication().getResources().getDisplayMetrics().density;
+                                if (!Float.isNaN(value) && value > 0) {
+                                    ret = value * scale;
+                                }
+                            }
+                            return ret;
+                        }
+                    });
+            return parser.parse();
+        }
+        return new LinkedHashMap<>();
+    }
+
+    private static Pair<Float, Float> parsePivot(@Nullable String transformOrigin,
+                                                 int width, int height, int viewportW) {
+        if (!TextUtils.isEmpty(transformOrigin)) {
+            int firstSpace = transformOrigin.indexOf(FunctionParser.SPACE);
+            if (firstSpace != -1) {
+                int i = firstSpace;
+                for (; i < transformOrigin.length(); i++) {
+                    if (transformOrigin.charAt(i) != FunctionParser.SPACE) {
+                        break;
+                    }
+                }
+                if (i < transformOrigin.length() && transformOrigin.charAt(i) != FunctionParser.SPACE) {
+                    List<String> list = new ArrayList<>(2);
+                    list.add(transformOrigin.substring(0, firstSpace).trim());
+                    list.add(transformOrigin.substring(i, transformOrigin.length()).trim());
+                    return parsePivot(list, width, height,viewportW);
+                }
+            }
+        }
+        return null;
+    }
+
+    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));
+    }
+
+    private static float parsePivotX(String x, int width,int viewportW) {
+        String value = x;
+        if (WXAnimationBean.Style.LEFT.equals(x)) {
+            value = ZERO;
+        } else if (WXAnimationBean.Style.RIGHT.equals(x)) {
+            value = FULL;
+        } else if (WXAnimationBean.Style.CENTER.equals(x)) {
+            value = HALF;
+        }
+        return parsePercentOrPx(value, width,viewportW);
+    }
+
+    private static float parsePivotY(String y, int height,int viewportW) {
+        String value = y;
+        if (WXAnimationBean.Style.TOP.equals(y)) {
+            value = ZERO;
+        } else if (WXAnimationBean.Style.BOTTOM.equals(y)) {
+            value = FULL;
+        } else if (WXAnimationBean.Style.CENTER.equals(y)) {
+            value = HALF;
+        }
+        return parsePercentOrPx(value, height,viewportW);
+    }
+
+    private static float parsePercentOrPx(String raw, int unit,int viewportW) {
+        final int precision = 1;
+        int suffix;
+        if ((suffix = raw.lastIndexOf(WXUtils.PERCENT)) != -1) {
+            return parsePercent(raw.substring(0, suffix), unit, precision);
+        } else if ((suffix = raw.lastIndexOf(PX)) != -1) {
+            return WXViewUtils.getRealPxByWidth(WXUtils.fastGetFloat(raw.substring(0, suffix), precision),viewportW);
+        }
+        return WXViewUtils.getRealPxByWidth(WXUtils.fastGetFloat(raw, precision),viewportW);
+    }
+
+    private static float parsePercent(String percent, int unit, int precision) {
+        return WXUtils.fastGetFloat(percent, precision) / 100 * unit;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/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 f3f7be5..e66b270 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,11 +45,6 @@ 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;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/utils/FunctionParser.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/FunctionParser.java b/android/sdk/src/main/java/com/taobao/weex/utils/FunctionParser.java
index ba9103e..2756071 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/FunctionParser.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/FunctionParser.java
@@ -84,7 +84,7 @@ public class FunctionParser<K, V> {
       lexer.moveOn();
       return value;
     }
-    throw new WXInterpretationException("Token doesn't match");
+    throw new WXInterpretationException(token + "Token doesn't match" + lexer.source);
   }
 
   private enum Token {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java
index 4a1b304..da90490 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXViewUtils.java
@@ -136,6 +136,11 @@ public class WXViewUtils {
     return getScreenWidth(WXEnvironment.sApplication);
   }
 
+  @Deprecated
+  public static int setScreenWidth(int screenWidth) {
+     return mScreenWidth = screenWidth;
+  }
+
   public static float getScreenDensity(Context ctx){
     if(ctx != null){
       try{

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java
new file mode 100644
index 0000000..7374026
--- /dev/null
+++ b/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.dom.transition;
+
+import android.app.Application;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.taobao.weappplus_sdk.BuildConfig;
+import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.utils.WXViewUtils;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by furture on 2017/10/18.
+ */
+@RunWith(RobolectricTestRunner.class)
+@Config(constants = BuildConfig.class, sdk = 19)
+@PowerMockIgnore( {"org.mockito.*", "org.robolectric.*", "android.*"})
+public class WXTransitionTest extends Application{
+
+
+
+    @Test
+    public void  testFrom(){
+        WXViewUtils.setScreenWidth(750);
+        WXDomObject domObject = new WXDomObject();
+        domObject.setViewPortWidth(750);
+        JSONObject map = JSON.parseObject("{\n" +
+                "    \"style\": {\n" +
+                "        \"width\": 600, \n" +
+                "        \"marginLeft\": 75, \n" +
+                "        \"marginTop\": 35, \n" +
+                "        \"marginBottom\": 35, \n" +
+                "        \"flexDirection\": \"column\", \n" +
+                "        \"justifyContent\": \"center\", \n" +
+                "        \"borderWidth\": 2, \n" +
+                "        \"borderStyle\": \"solid\", \n" +
+                "        \"borderColor\": \"rgb(0,180,255)\", \n" +
+                "        \"backgroundColor\": \"rgba(0,180,255,0.2)\", \n" +
+                "        \"transitionProperty\": \"height\", \n" +
+                "        \"transitionDuration\": 300, \n" +
+                "        \"transitionDelay\": 50, \n" +
+                "        \"transitionTimingFunction\": \"ease-in-out\"\n" +
+                "    }\n" +
+                "}");
+        domObject.parseFromJson(map);
+        Assert.assertNotNull("transition success",domObject.getTransition());
+        WXTransition transition = domObject.getTransition();
+        Map<String, Object> updates = new HashMap();
+        updates.put("height", "1000");
+        Assert.assertTrue(transition.hasTransitionProperty(updates));
+        transition.startTransition(updates);
+
+
+
+    }
+
+    @Test
+    public void testSplit(){
+
+        Assert.assertTrue(Arrays.equals(new String[]{"height", "width"}, WXTransition.PROPERTY_SPLIT_PATTERN.split("height|width")));
+        Assert.assertTrue(Arrays.equals(new String[]{"height", "width"}, WXTransition.PROPERTY_SPLIT_PATTERN.split("height,width")));
+
+
+        System.out.println(Arrays.toString(WXTransition.PROPERTY_SPLIT_PATTERN.split("height|width")));
+        System.out.println(Arrays.toString(WXTransition.PROPERTY_SPLIT_PATTERN.split("height,width")));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6486bc91/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java
new file mode 100644
index 0000000..28b94ab
--- /dev/null
+++ b/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.ui.animation;
+
+import android.util.Property;
+import android.view.View;
+
+import junit.framework.TestCase;
+
+import java.util.Map;
+
+/**
+ * Created by furture on 2017/10/24.
+ */
+
+public class TransformParserTest extends TestCase {
+
+    public void testParseTransform(){
+        Map<Property<View,Float>, Float> transforms =  TransformParser.parseTransForm("rotate(7deg) translate(1, 2)", 100, 100, 750);
+        System.out.println(transforms.size());
+    }
+}


[2/8] incubator-weex git commit: * [devtool] fix devtool network mode

Posted by gu...@apache.org.
* [devtool] fix devtool network mode


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/086bddf2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/086bddf2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/086bddf2

Branch: refs/heads/master
Commit: 086bddf2718abd375f6a12d0c3ff08a8e40602a6
Parents: db0ae56
Author: atomtong <to...@qq.com>
Authored: Tue Oct 31 17:27:08 2017 +0800
Committer: jianbai.gbj <ji...@alibaba-inc.com>
Committed: Mon Nov 13 10:35:57 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/086bddf2/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
index d1e0779..c042f34 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -68,6 +68,7 @@ public class WXEnvironment {
   public static boolean sDebugServerConnectable = false;
   public static boolean sRemoteDebugMode = false;
   public static String sRemoteDebugProxyUrl = "";
+  public static boolean sDebugNetworkEventReporterEnable = false;//debugtool network switch
   public static long sJSLibInitTime = 0;
 
   public static long sSDKInitStart = 0;// init start timestamp


[6/8] incubator-weex git commit: remove unused log edit

Posted by gu...@apache.org.
remove unused log edit


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/86d87219
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/86d87219
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/86d87219

Branch: refs/heads/master
Commit: 86d872196941850eaee4247f2cfa9bf7f3186c30
Parents: 1cb5e17
Author: jianbai.gbj <ji...@alibaba-inc.com>
Authored: Mon Nov 13 20:48:00 2017 +0800
Committer: jianbai.gbj <ji...@alibaba-inc.com>
Committed: Mon Nov 13 20:48:00 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/86d87219/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
index d92db14..1f5b4b2 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
@@ -71,7 +71,6 @@ public class WXLogUtils {
   }
 
   private static void log(String tag, String msg, LogLevel level){
-
     if (msg != null && WXEnvironment.sLogLevel.compare(level) >= 0) {
       if (sLogWatcher != null ) {
         sLogWatcher.onLog(level.getName(), tag, msg);


[4/8] incubator-weex git commit: * [android] abstract transform parse code, share code

Posted by gu...@apache.org.
* [android] abstract transform parse code, share code


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/48c083d2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/48c083d2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/48c083d2

Branch: refs/heads/master
Commit: 48c083d2ca1ff0c48d70c61fa74ef1af2a6010a7
Parents: 6486bc9
Author: jianbai.gbj <ji...@alibaba-inc.com>
Authored: Mon Nov 13 10:59:00 2017 +0800
Committer: jianbai.gbj <ji...@alibaba-inc.com>
Committed: Mon Nov 13 10:59:00 2017 +0800

----------------------------------------------------------------------
 .../weex/ui/animation/WXAnimationBean.java      | 123 +------------------
 1 file changed, 1 insertion(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/48c083d2/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 e66b270..0abe3d7 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
@@ -115,128 +115,7 @@ public class WXAnimationBean {
 
     private static Map<Property<View,Float>, Float> parseTransForm(@Nullable String rawTransform, final int width,
                                                 final int height,final int viewportW) {
-      if (!TextUtils.isEmpty(rawTransform)) {
-        FunctionParser<Property<View,Float>, Float> parser = new FunctionParser<>
-            (rawTransform, new FunctionParser.Mapper<Property<View,Float>, Float>() {
-              @Override
-              public Map<Property<View,Float>, Float> map(String functionName, List<String> raw) {
-                if (raw != null && !raw.isEmpty()) {
-                  if (wxToAndroidMap.containsKey(functionName)) {
-                    return convertParam(width, height,viewportW, wxToAndroidMap.get(functionName), raw);
-                  }
-                }
-                return new HashMap<>();
-              }
-
-              private Map<Property<View,Float>, Float> convertParam(int width, int height,int viewportW,
-                                                      @NonNull List<Property<View,Float>> propertyList,
-                                                      @NonNull List<String> rawValue) {
-                Map<Property<View,Float>, Float> result = WXDataStructureUtil.newHashMapWithExpectedSize(propertyList.size());
-                List<Float> convertedList = new ArrayList<>(propertyList.size());
-                if (propertyList.contains(View.ROTATION) ||
-                    propertyList.contains(View.ROTATION_X) ||
-                    propertyList.contains(View.ROTATION_Y)) {
-                  convertedList.addAll(parseRotationZ(rawValue));
-                }else if (propertyList.contains(View.TRANSLATION_X) ||
-                           propertyList.contains(View.TRANSLATION_Y)) {
-                  convertedList.addAll(parseTranslation(propertyList, width, height, rawValue,viewportW));
-                } else if (propertyList.contains(View.SCALE_X) ||
-                           propertyList.contains(View.SCALE_Y)) {
-                  convertedList.addAll(parseScale(propertyList.size(), rawValue));
-                }
-                else if(propertyList.contains(CameraDistanceProperty.getInstance())){
-                  convertedList.add(parseCameraDistance(rawValue));
-                }
-                if (propertyList.size() == convertedList.size()) {
-                  for (int i = 0; i < propertyList.size(); i++) {
-                    result.put(propertyList.get(i), convertedList.get(i));
-                  }
-                }
-                return result;
-              }
-
-              private List<Float> parseScale(int size, @NonNull List<String> rawValue) {
-                List<Float> convertedList = new ArrayList<>(rawValue.size() * 2);
-                List<Float> rawFloat = new ArrayList<>(rawValue.size());
-                for (String item : rawValue) {
-                  rawFloat.add(WXUtils.fastGetFloat(item));
-                }
-                convertedList.addAll(rawFloat);
-                if (size != 1 && rawValue.size() == 1) {
-                  convertedList.addAll(rawFloat);
-                }
-                return convertedList;
-              }
-
-              private @NonNull List<Float> parseRotationZ(@NonNull List<String> rawValue) {
-                List<Float> convertedList = new ArrayList<>(1);
-                int suffix;
-                for (String raw : rawValue) {
-                  if ((suffix = raw.lastIndexOf(DEG)) != -1) {
-                    convertedList.add(WXUtils.fastGetFloat(raw.substring(0, suffix)));
-                  } else {
-                    convertedList.add((float) Math.toDegrees(Double.parseDouble(raw)));
-                  }
-                }
-                return convertedList;
-              }
-
-              /**
-               * As "translate(50%, 25%)" or "translate(25px, 30px)" both are valid,
-               * parsing translate is complicated than other method.
-               * Add your waste time here if you try to optimize this method like {@link #parseScale(int, List)}
-               * Time: 0.5h
-               */
-              private List<Float> parseTranslation(List<Property<View,Float>> propertyList,
-                                                   int width, int height,
-                                                   @NonNull List<String> rawValue,int viewportW) {
-                List<Float> convertedList = new ArrayList<>(2);
-                String first = rawValue.get(0);
-                if (propertyList.size() == 1) {
-                  parseSingleTranslation(propertyList, width, height, convertedList, first,viewportW);
-                } else {
-                  parseDoubleTranslation(width, height, rawValue, convertedList, first,viewportW);
-                }
-                return convertedList;
-              }
-
-              private void parseSingleTranslation(List<Property<View,Float>> propertyList, int width, int height,
-                                                  List<Float> convertedList, String first,int viewportW) {
-                if (propertyList.contains(View.TRANSLATION_X)) {
-                  convertedList.add(parsePercentOrPx(first, width,viewportW));
-                } else if (propertyList.contains(View.TRANSLATION_Y)) {
-                  convertedList.add(parsePercentOrPx(first, height,viewportW));
-                }
-              }
-
-              private void parseDoubleTranslation(int width, int height,
-                                                  @NonNull List<String> rawValue,
-                                                  List<Float> convertedList, String first,int viewportW) {
-                String second;
-                if (rawValue.size() == 1) {
-                  second = first;
-                } else {
-                  second = rawValue.get(1);
-                }
-                convertedList.add(parsePercentOrPx(first, width,viewportW));
-                convertedList.add(parsePercentOrPx(second, height,viewportW));
-              }
-
-              private Float parseCameraDistance(List<String> rawValue){
-                float ret=Float.MAX_VALUE;
-                if(rawValue.size() == 1){
-                  float value = WXViewUtils.getRealPxByWidth(WXUtils.getFloat(rawValue.get(0)), viewportW);
-                  float scale = WXEnvironment.getApplication().getResources().getDisplayMetrics().density;
-                  if (!Float.isNaN(value) && value > 0) {
-                    ret = value * scale;
-                  }
-                }
-                return ret;
-              }
-            });
-        return parser.parse();
-      }
-      return new LinkedHashMap<>();
+      return  TransformParser.parseTransForm(rawTransform, width, height, viewportW);
     }
 
     private static Pair<Float, Float> parsePivot(@Nullable String transformOrigin,


[5/8] incubator-weex git commit: remove unused log edit

Posted by gu...@apache.org.
remove unused log edit


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/1cb5e17e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/1cb5e17e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/1cb5e17e

Branch: refs/heads/master
Commit: 1cb5e17e652d9d4c118491802ac7816504f922d6
Parents: 48c083d
Author: jianbai.gbj <ji...@alibaba-inc.com>
Authored: Mon Nov 13 20:37:12 2017 +0800
Committer: jianbai.gbj <ji...@alibaba-inc.com>
Committed: Mon Nov 13 20:37:12 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java | 3 ---
 1 file changed, 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1cb5e17e/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
index af20f22..d92db14 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
@@ -71,9 +71,6 @@ public class WXLogUtils {
   }
 
   private static void log(String tag, String msg, LogLevel level){
-	if(msg != null && tag != null && sLogWatcher !=null){
-	  sLogWatcher.onLog(level.getName(), tag, msg);
-	}
 
     if (msg != null && WXEnvironment.sLogLevel.compare(level) >= 0) {
       if (sLogWatcher != null ) {


[7/8] incubator-weex git commit: [WEEX-107] [android] weex transition support on android platform

Posted by gu...@apache.org.
[WEEX-107] [android] weex transition support on android platform


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/3c3536a1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/3c3536a1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/3c3536a1

Branch: refs/heads/master
Commit: 3c3536a1ba854bf6e23e7e711ad095d0d0f8a51b
Parents: 8a19b9b 86d8721
Author: gurisxie <27...@qq.com>
Authored: Tue Nov 14 10:24:24 2017 +0800
Committer: gurisxie <27...@qq.com>
Committed: Tue Nov 14 10:38:50 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/common/Constants.java  |  11 +
 .../com/taobao/weex/dom/DOMActionContext.java   |   2 +
 .../taobao/weex/dom/DOMActionContextImpl.java   |  17 +-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |  15 +-
 .../java/com/taobao/weex/dom/WXDomObject.java   |  33 +-
 .../taobao/weex/dom/action/AnimationAction.java |  43 +-
 .../weex/dom/action/UpdateStyleAction.java      |  20 +-
 .../weex/dom/transition/WXTransition.java       | 626 +++++++++++++++++++
 .../weex/ui/animation/TransformParser.java      | 296 +++++++++
 .../weex/ui/animation/WXAnimationBean.java      | 128 +---
 .../com/taobao/weex/utils/FunctionParser.java   |   2 +-
 .../java/com/taobao/weex/utils/WXViewUtils.java |   5 +
 .../weex/dom/transition/WXTransitionTest.java   |  96 +++
 .../weex/ui/animation/TransformParserTest.java  |  38 ++
 14 files changed, 1173 insertions(+), 159 deletions(-)
----------------------------------------------------------------------