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/05/14 04:15:52 UTC
[2/2] incubator-weex git commit: [WEEX-355][android] recycle-list
adapter for weex-core new architecture
[WEEX-355][android] recycle-list adapter for weex-core new architecture
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/b049f80e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b049f80e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b049f80e
Branch: refs/heads/master
Commit: b049f80ee63c9a2a2b13fde6144ee6e462693f1b
Parents: 0d2681f
Author: jianbai.gbj <ji...@alibaba-inc.com>
Authored: Mon May 7 20:54:22 2018 +0800
Committer: YorkShen <sh...@gmail.com>
Committed: Mon May 14 12:15:29 2018 +0800
----------------------------------------------------------------------
.../java/com/taobao/weex/bridge/WXBridge.java | 10 +-
.../com/taobao/weex/bridge/WXBridgeManager.java | 13 +-
.../java/com/taobao/weex/common/Constants.java | 2 +
.../java/com/taobao/weex/common/IWXBridge.java | 4 +-
.../main/java/com/taobao/weex/dom/WXAttr.java | 50 +++-
.../main/java/com/taobao/weex/dom/WXEvent.java | 47 +++-
.../main/java/com/taobao/weex/dom/WXStyle.java | 77 ++++--
.../com/taobao/weex/dom/binding/ELUtils.java | 13 +-
.../com/taobao/weex/dom/binding/JSONUtils.java | 51 ++++
.../weex/ui/action/BasicComponentData.java | 43 ++++
.../weex/ui/action/GraphicActionAddElement.java | 2 +-
.../weex/ui/action/GraphicActionLayout.java | 2 +-
.../ui/action/GraphicActionUpdateStyle.java | 2 +-
.../taobao/weex/ui/action/GraphicPosition.java | 8 +
.../com/taobao/weex/ui/action/GraphicSize.java | 5 +
.../ui/action/UpdateComponentDataAction.java | 69 ++++++
.../weex/ui/component/ComponentUtils.java | 121 ---------
.../taobao/weex/ui/component/WXComponent.java | 91 ++++++-
.../ui/component/basic/WXBasicComponent.java | 12 +-
.../ui/component/binding/AsynLayoutTask.java | 60 +++++
.../weex/ui/component/binding/Layouts.java | 146 +++--------
.../weex/ui/component/binding/Statements.java | 98 ++++++--
.../ui/component/list/BasicListComponent.java | 30 ++-
.../taobao/weex/ui/component/list/WXCell.java | 35 ++-
.../weex/ui/component/list/WXListComponent.java | 6 +-
.../list/template/AsyncCellLoadTask.java | 1 +
.../ui/component/list/template/PositionRef.java | 10 +-
.../list/template/TemplateViewHolder.java | 27 +-
.../list/template/WXRecyclerTemplateList.java | 247 +++++++++++++------
.../template/jni/NativeRenderObjectUtils.java | 78 ++++++
.../com/taobao/weex/ui/module/WXDomModule.java | 10 +
weex_core/Source/CMakeLists.txt | 1 +
.../android/bridge/impl/bridge_impl_android.cpp | 7 +-
.../android/bridge/impl/bridge_impl_android.h | 3 +-
.../native_render_object_utils_impl_android.cpp | 209 ++++++++++++++++
.../native_render_object_utils_impl_android.h | 34 +++
.../bridge/impl/weexcore_impl_android.cpp | 9 +
weex_core/Source/android/jniprebuild/jni_files | 1 +
.../Source/android/jniprebuild/jni_load.cc | 2 +
.../jniheader/ContentBoxMeasurement_jni.h | 2 +-
.../jniheader/NativeRenderObjectUtils_jni.h | 200 +++++++++++++++
.../jniprebuild/jniheader/WXBridge_jni.h | 12 +-
.../Source/android/jniprebuild/prebuild.sh | 2 +-
weex_core/Source/core/bridge/bridge.h | 3 +-
weex_core/Source/core/layout/layout.h | 16 ++
weex_core/Source/core/parser/dom_parser.cpp | 151 +++++-------
weex_core/Source/core/parser/dom_parser.h | 4 +
.../render/action/render_action_add_element.cpp | 5 +-
.../render/action/render_action_add_element.h | 3 +-
.../core/render/node/factory/i_render_object.h | 7 +
.../core/render/node/factory/render_creator.cpp | 6 +-
.../core/render/node/factory/render_type.h | 2 +
weex_core/Source/core/render/node/render_list.h | 94 +++++--
.../Source/core/render/node/render_object.h | 45 +++-
weex_core/Source/core/render/node/render_text.h | 3 -
.../Source/core/render/page/render_page.cpp | 25 +-
weex_core/Source/core/render/page/render_page.h | 2 +-
weex_core/debug.sh | 2 +
58 files changed, 1655 insertions(+), 565 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index 667d8e0..37e4493 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -65,6 +65,7 @@ public class WXBridge implements IWXBridge {
private native void nativeTakeHeapSnapshot(String filename);
private native void nativeBindMeasurementToWXCore(String instanceId, String ref, ContentBoxMeasurement contentBoxMeasurement);
+ private native void nativeBindMeasurementToRenderObject(long ptr, ContentBoxMeasurement contentBoxMeasurement);
private native void nativeSetRenderContainerWrapContent(boolean wrap, String instanceId);
@@ -327,12 +328,12 @@ public class WXBridge implements IWXBridge {
@Override
public int callAddElement(String instanceId, String componentType, String ref, int index, String parentRef,
HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
- float[] margins, float[] paddings, float[] borders) {
+ float[] margins, float[] paddings, float[] borders, boolean willLayout) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callAddElement(instanceId, componentType, ref, index, parentRef,
- styles, attributes, events, margins, paddings, borders);
+ styles, attributes, events, margins, paddings, borders, willLayout);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
@@ -516,6 +517,11 @@ public class WXBridge implements IWXBridge {
}
@Override
+ public void bindMeasurementToRenderObject(long ptr, ContentBoxMeasurement contentBoxMeasurement){
+ nativeBindMeasurementToRenderObject(ptr, contentBoxMeasurement);
+ }
+
+ @Override
public void setRenderContainerWrapContent(boolean wrap, String instanceId) {
nativeSetRenderContainerWrapContent(wrap, instanceId);
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index ea27602..560358d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -2285,7 +2285,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
public int callAddElement(String pageId, String componentType, String ref, int index, String parentRef,
HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
- float[] margins, float[] paddings, float[] borders) {
+ float[] margins, float[] paddings, float[] borders,boolean willLayout) {
long start = System.currentTimeMillis();
if (TextUtils.isEmpty(pageId) || TextUtils.isEmpty(componentType) || TextUtils.isEmpty(ref)) {
WXLogUtils.d("[WXBridgeManager] callAddElement: call CreateBody tasks is null");
@@ -2315,7 +2315,11 @@ public class WXBridgeManager implements Callback, BactchExecutor {
if (WXSDKManager.getInstance().getSDKInstance(pageId) != null) {
final GraphicActionAddElement action = new GraphicActionAddElement(pageId, ref, componentType, parentRef, index,
styles, attributes, events, margins, paddings, borders);
- WXSDKManager.getInstance().getSDKInstance(pageId).addInActiveAddElementAction(ref, action);
+ if(willLayout) {
+ WXSDKManager.getInstance().getSDKInstance(pageId).addInActiveAddElementAction(ref, action);
+ }else{
+ WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(pageId, action);
+ }
}
} catch (Exception e) {
WXLogUtils.e("[WXBridgeManager] callAddElement exception: ", e);
@@ -2627,6 +2631,11 @@ public class WXBridgeManager implements Callback, BactchExecutor {
mWXBridge.bindMeasurementToWXCore(instanceId, ref, contentBoxMeasurement);
}
+ public void bindMeasurementToRenderObject(long ptr, ContentBoxMeasurement contentBoxMeasurement){
+ mWXBridge.bindMeasurementToRenderObject(ptr, contentBoxMeasurement);
+ }
+
+
/**
* Native: Layout
* @param instanceId
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/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 d5e4ee1..7731bd3 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
@@ -233,6 +233,8 @@ public class Constants {
String NEST_SCROLLING_ENABLED = "nestedScrollingEnabled";
+
+ String ORIENTATION = "orientation";
}
public interface Value {
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
index 5213854..35f6bf1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -126,7 +126,7 @@ public interface IWXBridge extends IWXObject {
public int callAddElement(String instanceId, String componentType, String ref, int index, String parentRef,
HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
- float[] margins, float[] paddings, float[] borders);
+ float[] margins, float[] paddings, float[] borders, boolean willLayout);
int callRemoveElement(String instanceId, String ref);
@@ -155,6 +155,8 @@ public interface IWXBridge extends IWXObject {
void bindMeasurementToWXCore(String instanceId, String ref, ContentBoxMeasurement contentBoxMeasurement);
+ void bindMeasurementToRenderObject(long ptr, ContentBoxMeasurement contentBoxMeasurement);
+
void setRenderContainerWrapContent(boolean wrap, String instanceId);
int printFirstScreenRenderTime(String instanceId);
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
index ab009bd..80a330b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
@@ -52,7 +52,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
/**
* static attrs
* */
- private @NonNull final Map<String, Object> attr;
+ private @NonNull Map<String, Object> attr;
/**
* dynamic binding attrs, can be null, only weex use
@@ -70,11 +70,12 @@ public class WXAttr implements Map<String, Object>,Cloneable {
public WXAttr(@NonNull Map<String,Object> standardMap) {
this();
- attr.putAll(filterBindingStatement(standardMap));
+ attr.putAll(standardMap);
}
public WXAttr(@NonNull Map<String,Object> standardMap, int extra){
- attr = standardMap;
+ this();
+ attr.putAll(standardMap);
}
public static String getPrefix(Map<String, Object> attr) {
@@ -254,6 +255,20 @@ public class WXAttr implements Map<String, Object>,Cloneable {
return scrollDirection.toString();
}
+ public int getOrientation() {
+ String direction = getScrollDirection();
+ if(!TextUtils.isEmpty(direction)){
+ if(direction.equals(Constants.Value.HORIZONTAL.equals(direction))){
+ return Constants.Orientation.HORIZONTAL;
+ }
+ }
+ Object value = get(Name.ORIENTATION);
+ if(value != null && Constants.Value.HORIZONTAL.equals(value.toString())){
+ return Constants.Orientation.HORIZONTAL;
+ }
+ return Constants.Orientation.VERTICAL;
+ }
+
public float getElevation(int viewPortW) {
Object obj = get(Constants.Name.ELEVATION);
float ret = Float.NaN;
@@ -402,7 +417,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
@Override
public Object put(String key, Object value) {
- if(filterBindingStatement(key, value)){
+ if(addBindingAttrIfStatement(key, value)){
return null;
}
return attr.put(key,value);
@@ -410,7 +425,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
@Override
public void putAll(Map<? extends String, ?> map) {
- this.attr.putAll(filterBindingStatement(map));
+ this.attr.putAll(map);
}
@Override
@@ -453,10 +468,18 @@ public class WXAttr implements Map<String, Object>,Cloneable {
}
+
+ public void parseStatements(){
+ if(this.attr != null){
+ this.attr = filterStatementsFromAttrs(this.attr);
+ }
+ }
+
+
/**
* filter dynamic state ment
* */
- public Map<String, Object> filterBindingStatement(Map attrs) {
+ private Map<String, Object> filterStatementsFromAttrs(Map attrs) {
if(attrs == null || attrs.size() == 0){
return attrs;
}
@@ -464,7 +487,12 @@ public class WXAttr implements Map<String, Object>,Cloneable {
Iterator<Entry<String,Object>> it = entries.iterator();
while (it.hasNext()){
Map.Entry<String,Object> entry = it.next();
- if(filterBindingStatement(entry.getKey(), entry.getValue())){
+ if(COMPONENT_PROPS.equals(entry.getKey())){
+ Object blockValue = ELUtils.bindingBlock(entry.getValue());
+ entry.setValue(blockValue);
+ continue;
+ }
+ if(addBindingAttrIfStatement(entry.getKey(), entry.getValue())){
it.remove();
}
}
@@ -474,11 +502,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
/**
* filter dynamic attrs and statements
* */
- private boolean filterBindingStatement(String key, Object value) {
- if(COMPONENT_PROPS.equals(key)){
- ELUtils.bindingBlock(value);
- return false;
- }
+ private boolean addBindingAttrIfStatement(String key, Object value) {
for(String exclude : EXCLUDES_BINDING){
if(key.equals(exclude)){
return false;
@@ -527,7 +551,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
}
@Override
- protected WXAttr clone() {
+ public WXAttr clone() {
WXAttr wxAttr = new WXAttr();
wxAttr.skipFilterPutAll(attr);
if (mBindingAttrs != null) {
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/dom/WXEvent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXEvent.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXEvent.java
index 7a77fa9..5ee2456 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXEvent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXEvent.java
@@ -23,9 +23,11 @@ import android.support.v4.util.ArrayMap;
import com.alibaba.fastjson.JSONObject;
import com.taobao.weex.dom.binding.ELUtils;
+import com.taobao.weex.dom.binding.JSONUtils;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
/**
@@ -95,20 +97,22 @@ public class WXEvent extends ArrayList<String> implements Serializable, Cloneabl
public void addEvent(Object event) {
if(event instanceof CharSequence){
+ if(JSONUtils.isJSON(event.toString())){
+ addEvent(JSONUtils.toJSON(event.toString()));
+ return;
+ }
String eventName = event.toString();
if(!contains(eventName)){
add(eventName);
}
}else if(event instanceof JSONObject){
JSONObject bindings = (JSONObject) event;
- String eventName = bindings.getString(WXEvent.EVENT_KEY_TYPE);
- Object args = bindings.get(WXEvent.EVENT_KEY_ARGS);
- if (eventName != null) {
- putEventBindingArgs(eventName, args);
- }
+ addBindingEvent(bindings);
}
}
+
+
public static String getEventName(Object event){
if(event instanceof CharSequence){
return event.toString();
@@ -123,15 +127,38 @@ public class WXEvent extends ArrayList<String> implements Serializable, Cloneabl
return event.toString();
}
- public void putEventBindingArgs(String event, Object args){
- if(!contains(event)){
- add(event);
+
+ public void parseStatements() {
+ if(!isEmpty()){
+ for(int i=0; i<size(); i++){
+ String event = get(i);
+ if(JSONUtils.isJSON(event)){
+ JSONObject object = JSONUtils.toJSON(event);
+ String eventName = addBindingEvent(object);
+ set(i, eventName);
+ }
+ }
+ }
+ }
+
+ private String addBindingEvent(JSONObject bindings){
+ String eventName = bindings.getString(WXEvent.EVENT_KEY_TYPE);
+ Object args = bindings.get(WXEvent.EVENT_KEY_ARGS);
+ if (eventName != null) {
+ addBindingArgsEvent(eventName, args);
+ }
+ return eventName;
+ }
+
+ private void addBindingArgsEvent(String eventName, Object args){
+ if(!contains(eventName)){
+ add(eventName);
}
if(args != null){
if(mEventBindingArgs == null){
mEventBindingArgs = new ArrayMap();
}
- mEventBindingArgs.put(event, ELUtils.bindingBlock(args));
+ mEventBindingArgs.put(eventName, ELUtils.bindingBlock(args));
}
}
@@ -156,4 +183,6 @@ public class WXEvent extends ArrayList<String> implements Serializable, Cloneabl
event.mEventBindingArgsValues = null; //this should not be clone, it dynamic args
return event;
}
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java
index 393a435..2a317d5 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java
@@ -45,7 +45,7 @@ public class WXStyle implements Map<String, Object>,Cloneable {
public static final int UNSET = -1;
@NonNull
- private final Map<String,Object> mStyles;
+ private Map<String,Object> mStyles;
@Nullable
private Map<String,Map<String,Object>> mPesudoStyleMap;// clz_group:{styleMap}
@@ -69,7 +69,7 @@ public class WXStyle implements Map<String, Object>,Cloneable {
public WXStyle(Map<String, Object> mStyles, boolean byPesudo) {
this();
- this.putAll(filterBindingStyles(mStyles), byPesudo);
+ this.putAll(mStyles, byPesudo);
}
@Nullable
@@ -360,6 +360,9 @@ public class WXStyle implements Map<String, Object>,Cloneable {
@Override
public Object put(String key, Object value) {
+ if(addBindingStyleIfStatement(key, value)){
+ return null;
+ }
return mStyles.put(key,value);
}
@@ -380,6 +383,11 @@ public class WXStyle implements Map<String, Object>,Cloneable {
}
}
+ public void updateStyle(Map<? extends String, ?> map, boolean byPesudo){
+ parseBindingStylesStatements(map);
+ putAll(map, byPesudo);
+ }
+
public Map<String, Object> getPesudoResetStyles() {
if(mPesudoResetStyleMap == null){
@@ -447,26 +455,7 @@ public class WXStyle implements Map<String, Object>,Cloneable {
return mStyles.values();
}
- @Override
- protected WXStyle clone(){
- WXStyle style = new WXStyle();
- style.mStyles.putAll(this.mStyles);
-
- if(mPesudoStyleMap != null) {
- style.mPesudoStyleMap = new ArrayMap<>();
- for (Entry<String, Map<String, Object>> entry : this.mPesudoStyleMap.entrySet()) {
- Map<String, Object> valueClone = new ArrayMap<>();
- valueClone.putAll(entry.getValue());
- style.mPesudoStyleMap.put(entry.getKey(), valueClone);
- }
- }
- if(mPesudoResetStyleMap!=null) {
- style.mPesudoResetStyleMap = new ArrayMap<>();
- style.mPesudoResetStyleMap.putAll(this.mPesudoResetStyleMap);
- }
- return style;
- }
private void initPesudoMapsIfNeed(Map<? extends String, ?> styles){
if(mPesudoStyleMap == null){
@@ -480,10 +469,18 @@ public class WXStyle implements Map<String, Object>,Cloneable {
}
}
+
+
+ public void parseStatements(){
+ if(this.mStyles != null){
+ this.mStyles = parseBindingStylesStatements(this.mStyles);
+ }
+ }
+
/**
* filter dynamic state ment
* */
- private Map<String, Object> filterBindingStyles(Map styles) {
+ private Map<String, Object> parseBindingStylesStatements(Map styles) {
if(styles == null || styles.size() == 0){
return styles;
}
@@ -491,7 +488,13 @@ public class WXStyle implements Map<String, Object>,Cloneable {
Iterator<Entry<String,Object>> it = entries.iterator();
while (it.hasNext()){
Map.Entry<String,Object> entry = it.next();
- if(filterBindingStyle(entry.getKey(), entry.getValue())){
+ if(addBindingStyleIfStatement(entry.getKey(), entry.getValue())){
+ if(mPesudoStyleMap != null){
+ mPesudoStyleMap.remove(entry.getKey());
+ }
+ if(mPesudoResetStyleMap != null){
+ mPesudoResetStyleMap.remove(entry.getKey());
+ }
it.remove();
}
}
@@ -501,7 +504,7 @@ public class WXStyle implements Map<String, Object>,Cloneable {
/**
* filter dynamic attrs and statements
* */
- private boolean filterBindingStyle(String key, Object value) {
+ private boolean addBindingStyleIfStatement(String key, Object value) {
if(ELUtils.isBinding(value)){
if(mBindingStyle == null){
mBindingStyle = new ArrayMap<String, Object>();
@@ -516,4 +519,30 @@ public class WXStyle implements Map<String, Object>,Cloneable {
public ArrayMap<String, Object> getBindingStyle() {
return mBindingStyle;
}
+
+ @Override
+ public WXStyle clone(){
+ WXStyle style = new WXStyle();
+ style.mStyles.putAll(this.mStyles);
+ if(mBindingStyle != null){
+ style.mBindingStyle = new ArrayMap<>(mBindingStyle);
+ }
+ if(mPesudoStyleMap != null) {
+ style.mPesudoStyleMap = new ArrayMap<>();
+ for (Entry<String, Map<String, Object>> entry : this.mPesudoStyleMap.entrySet()) {
+ Map<String, Object> valueClone = new ArrayMap<>();
+ valueClone.putAll(entry.getValue());
+ style.mPesudoStyleMap.put(entry.getKey(), valueClone);
+ }
+ }
+
+ if(mPesudoResetStyleMap!=null) {
+ style.mPesudoResetStyleMap = new ArrayMap<>();
+ style.mPesudoResetStyleMap.putAll(this.mPesudoResetStyleMap);
+ }
+
+
+ return style;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/dom/binding/ELUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/binding/ELUtils.java b/android/sdk/src/main/java/com/taobao/weex/dom/binding/ELUtils.java
index dac03b2..390b611 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/binding/ELUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/binding/ELUtils.java
@@ -18,6 +18,7 @@
*/
package com.taobao.weex.dom.binding;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.taobao.weex.WXEnvironment;
@@ -60,6 +61,8 @@ public class ELUtils {
return true;
}
}
+ }else if(value instanceof String){
+ return ((String) value).indexOf(BINDING) >= 0;
}
return false;
}
@@ -92,6 +95,13 @@ public class ELUtils {
for(int i=0; i<array.size(); i++){
bindingBlock(array.get(i));
}
+ }else if(value instanceof String){
+ String json = value.toString();
+ if(json.startsWith("{")){
+ return bindingBlock(JSON.parseObject(json));
+ }else if(json.startsWith("[")){
+ return bindingBlock(JSON.parseArray(json));
+ }
}
return value;
}
@@ -104,6 +114,8 @@ public class ELUtils {
((JSONObject) vfor).put(WXStatement.WX_FOR_LIST, Parser.parse(list.toString()));
}
}
+ }else if(vfor instanceof String){
+ return vforBlock(JSONObject.parseObject(vfor.toString()));
}else{
if(WXEnvironment.isApkDebugable()){
WXLogUtils.e("weex", "weex vfor is illegal " + vfor);
@@ -112,5 +124,4 @@ public class ELUtils {
return vfor;
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/dom/binding/JSONUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/binding/JSONUtils.java b/android/sdk/src/main/java/com/taobao/weex/dom/binding/JSONUtils.java
new file mode 100644
index 0000000..30d72d5
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/binding/JSONUtils.java
@@ -0,0 +1,51 @@
+/**
+ * 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.binding;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * Created by furture on 2018/5/8.
+ */
+
+public class JSONUtils {
+
+
+ public static boolean isJSON(Object json){
+ if(json instanceof JSONObject){
+ return true;
+ }
+ if(json instanceof String){
+ return ((String) json).startsWith("{");
+ }
+ return false;
+ }
+
+ public static JSONObject toJSON(Object json){
+ if(json instanceof JSONObject){
+ return (JSONObject) json;
+ }
+ return JSONObject.parseObject(json.toString());
+ }
+
+
+ public static boolean isJSON(String json){
+ return json.startsWith("{");
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/action/BasicComponentData.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/BasicComponentData.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/BasicComponentData.java
index b544cb9..e70af17 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/BasicComponentData.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/BasicComponentData.java
@@ -26,6 +26,7 @@ import com.taobao.weex.dom.CSSShorthand;
import com.taobao.weex.dom.WXAttr;
import com.taobao.weex.dom.WXEvent;
import com.taobao.weex.dom.WXStyle;
+import com.taobao.weex.ui.component.list.template.jni.NativeRenderObjectUtils;
import com.taobao.weex.utils.WXUtils;
import java.util.Map;
@@ -42,6 +43,7 @@ public class BasicComponentData<T extends View> {
private CSSShorthand mMargins;
private CSSShorthand mPaddings;
private CSSShorthand mBorders;
+ private long renderObjectPr = 0;
public BasicComponentData(String ref, String componentType, String parentRef) {
this.mRef = ref;
@@ -262,4 +264,45 @@ public class BasicComponentData<T extends View> {
public final void setBorders(@NonNull CSSShorthand mBorders) {
this.mBorders = mBorders;
}
+
+
+
+ @Override
+ public BasicComponentData clone() throws CloneNotSupportedException {
+ BasicComponentData basicComponentData = new BasicComponentData(mRef, mComponentType, mParentRef);
+ basicComponentData.setBorders(getBorder().clone());
+ basicComponentData.setMargins(getMargin().clone());
+ basicComponentData.setPaddings(getPadding().clone());
+ if(mAttributes != null){
+ basicComponentData.mAttributes = mAttributes.clone();
+ }
+ if(mStyles != null){
+ basicComponentData.mStyles = mStyles.clone();
+ }
+ if(mEvents != null){
+ basicComponentData.mEvents = mEvents.clone();
+ }
+
+ if(renderObjectPr != 0){
+ basicComponentData.setRenderObjectPr(NativeRenderObjectUtils.nativeCopyRenderObject(renderObjectPr));
+ }
+ return basicComponentData;
+ }
+
+ public long getRenderObjectPr() {
+ return renderObjectPr;
+ }
+
+ public boolean isRenderPtrEmpty(){
+ return renderObjectPr == 0;
+ }
+
+ public synchronized void setRenderObjectPr(long renderObjectPr) {
+ if(this.renderObjectPr != renderObjectPr){
+ if(this.renderObjectPr != 0){
+ throw new RuntimeException("RenderObjectPr has " + renderObjectPr + " old renderObjectPtr " + this.renderObjectPr);
+ }
+ this.renderObjectPr = renderObjectPr;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
index aa60a73..347b7fa 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
@@ -100,7 +100,7 @@ public class GraphicActionAddElement extends GraphicActionAbstractAddElement {
long start = System.currentTimeMillis();
if(layoutPosition !=null && layoutSize != null) {
- child.updateDemission(layoutSize, layoutPosition);
+ child.setDemission(layoutSize, layoutPosition);
}
child.applyLayoutAndEvent(child);
WXSDKManager.getInstance().getSDKInstance(getPageId()).callLayoutaAplyLayoutAndEventTime(System.currentTimeMillis() - start);
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
index 777df14..693096a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
@@ -40,7 +40,7 @@ public class GraphicActionLayout extends BasicGraphicAction {
}
long start = System.currentTimeMillis();
- component.updateDemission(mLayoutSize, mLayoutPosition);
+ component.setDemission(mLayoutSize, mLayoutPosition);
WXSDKManager.getInstance().getSDKInstance(getPageId()).callLayoutUpdateDemissionTime(System.currentTimeMillis() - start);
component.setLayout(component);
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java
index fffed20..31b52fd 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java
@@ -57,7 +57,7 @@ public class GraphicActionUpdateStyle extends BasicGraphicAction {
return;
}
if (null != mStyle) {
- component.addStyle(mStyle, mIsCausedByPesudo);
+ component.updateStyle(mStyle, mIsCausedByPesudo);
if(style.containsKey(Constants.Name.TRANSFORM) && component.getTransition() == null) {
Map<String, Object> animationMap = new ArrayMap<>(2);
animationMap.put(Constants.Name.TRANSFORM, style.get(Constants.Name.TRANSFORM));
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicPosition.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicPosition.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicPosition.java
index 9cb0e2d..9837809 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicPosition.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicPosition.java
@@ -63,4 +63,12 @@ public class GraphicPosition {
public void setBottom(float bottom) {
this.mBottom = bottom;
}
+
+
+ public void update(float top, float bottom, float left, float right) {
+ this.mTop = top;
+ this.mBottom = bottom;
+ this.mLeft = left;
+ this.mRight = right;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicSize.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicSize.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicSize.java
index 371b196..35d6439 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicSize.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicSize.java
@@ -43,4 +43,9 @@ public class GraphicSize {
public void setHeight(float height) {
this.mHeight = height;
}
+
+ public void update(float width, float height) {
+ this.mWidth = width;
+ this.mHeight = height;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/action/UpdateComponentDataAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/UpdateComponentDataAction.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/UpdateComponentDataAction.java
new file mode 100644
index 0000000..8e69f47
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/UpdateComponentDataAction.java
@@ -0,0 +1,69 @@
+/**
+ * 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.action;
+
+import android.text.TextUtils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.bridge.SimpleJSCallback;
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.list.template.CellDataManager;
+import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList;
+import com.taobao.weex.utils.WXLogUtils;
+
+
+/**
+ * Created by furture on 2018/1/23.
+ */
+
+public class UpdateComponentDataAction extends BasicGraphicAction{
+
+ private String virtualComponentId;
+ private JSONObject data;
+ private String callback;
+
+
+ public UpdateComponentDataAction(String pageId, String virtualComponentId,
+ JSONObject data, String callback) {
+ super(pageId, CellDataManager.getListRef(virtualComponentId));
+ this.virtualComponentId = virtualComponentId;
+ this.data = data;
+ this.callback = callback;
+ }
+
+ @Override
+ public void executeAction() {
+ if(TextUtils.isEmpty(getRef())){
+ WXLogUtils.e("wrong virtualComponentId split error " + virtualComponentId);
+ return;
+ }
+ WXComponent component = WXSDKManager.getInstance().getWXRenderManager().getWXComponent(getPageId(), getRef());
+ if(component instanceof WXRecyclerTemplateList){
+ WXRecyclerTemplateList templateList = (WXRecyclerTemplateList) component;
+ templateList.getCellDataManager().updateVirtualComponentData(virtualComponentId, data);
+ templateList.notifyUpdateList();
+ SimpleJSCallback jsCallback = new SimpleJSCallback(component.getInstanceId(), callback);
+ jsCallback.invoke(true);
+ }else{
+ WXLogUtils.e("recycler-list wrong virtualComponentId " + virtualComponentId);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/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
deleted file mode 100644
index 373d9cd..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/ComponentUtils.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * 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.component;
-
-import com.taobao.weex.WXEnvironment;
-import com.taobao.weex.WXSDKManager;
-import com.taobao.weex.utils.WXLogUtils;
-
-/**
- * Created by furture on 2018/1/25.
- */
-
-public class ComponentUtils {
-
- private static final String TAG = "ComponentUtils";
-
- /**
- * init component if component is lazy,
- * if component is not lazy, do nothing
- * */
- public static void initLazyComponent(WXComponent component, WXVContainer mParent){
- if(component.isLazy()){
- component.lazy(false);
- if(mParent != null){
- int index = mParent.indexOf(component);
- mParent.createChildViewAt(index);
- }else {
- component.createView();
- }
- component.applyLayoutAndEvent(component);
- component.bindData(component);
- }
- }
-
- /**
- * build component tree and dom tree for template list
- * */
- // 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
- * */
- // 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/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
index ce47a6f..8c8b003 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
@@ -27,6 +27,7 @@ import java.lang.annotation.Target;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -99,6 +100,7 @@ import com.taobao.weex.ui.animation.WXAnimationBean;
import com.taobao.weex.ui.animation.WXAnimationModule;
import com.taobao.weex.ui.component.basic.WXBasicComponent;
import com.taobao.weex.ui.component.binding.Statements;
+import com.taobao.weex.ui.component.list.template.jni.NativeRenderObjectUtils;
import com.taobao.weex.ui.component.pesudo.OnActivePseudoListner;
import com.taobao.weex.ui.component.pesudo.PesudoStatus;
import com.taobao.weex.ui.component.pesudo.TouchActivePseudoListener;
@@ -219,7 +221,7 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple
protected void setContentBoxMeasurement(final ContentBoxMeasurement contentBoxMeasurement) {
this.contentBoxMeasurement = contentBoxMeasurement;
- WXBridgeManager.getInstance().bindMeasurementToWXCore(getInstanceId(), getRef(), contentBoxMeasurement);
+ WXBridgeManager.getInstance().bindMeasurementToRenderObject(getRenderObjectPtr(), contentBoxMeasurement);
}
public void updateStyles(WXComponent component) {
@@ -626,11 +628,25 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple
}
}
- public void updateDemission(GraphicSize size, GraphicPosition position) {
+ public void setDemission(GraphicSize size, GraphicPosition position) {
setLayoutPosition(position);
setLayoutSize(size);
}
+ public void updateDemission(float top, float bottom, float left, float right, float height, float width) {
+ getLayoutPosition().update(top, bottom, left, right);
+ getLayoutSize().update(width, height);
+ }
+
+
+ public void applyLayoutOnly(){
+ if(!isLazy()) {
+ setLayout(this);
+ setPadding(this.getPadding(), this.getBorder());
+ }
+ }
+
+
public void refreshData(WXComponent component) {
}
@@ -2073,7 +2089,11 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple
public void setWaste(boolean waste) {
if(this.waste != waste){
this.waste = waste;
- if(waste){
+ if(!WXBasicComponentType.RECYCLE_LIST.equals(getParent().getComponentType())){
+ NativeRenderObjectUtils.nativeRenderObjectChildWaste(getRenderObjectPtr(), waste);
+ }
+
+ if(waste){
//update dom not show, and put style to hidden
getStyles().put(Constants.Name.VISIBILITY, Constants.Value.HIDDEN);
//if component not init, mark lazy init when use, reduce view count
@@ -2085,13 +2105,13 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple
getHostView().setVisibility(View.GONE);
}
}else{
- getStyles().put(Constants.Name.VISIBILITY, Constants.Value.VISIBLE);
+ getStyles().put(Constants.Name.VISIBILITY, Constants.Value.VISIBLE);
if(getHostView() == null){
if(mLazy) { // when parent is lazy just mark node lazy false
if(mParent != null && mParent.isLazy()){
lazy(false);
}else{
- ComponentUtils.initLazyComponent(this, mParent);
+ Statements.initLazyComponent(this, mParent);
}
}
}else{
@@ -2182,4 +2202,65 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple
public void lazy(boolean lazy) {
mLazy = lazy;
}
+
+ public long getRenderObjectPtr(){
+ if(getBasicComponentData().isRenderPtrEmpty()){
+ getBasicComponentData().setRenderObjectPr(NativeRenderObjectUtils.nativeGetRenderObject(getInstanceId(), getRef()));
+ }
+ return getBasicComponentData().getRenderObjectPr();
+ }
+
+
+ public void updateNativeAttr(String key, Object value){
+ if(key == null){
+ return;
+ }
+ if(value == null){
+ value = "";
+ }
+ getBasicComponentData().getAttrs().put(key, value);
+ NativeRenderObjectUtils.nativeUpdateRenderObjectAttr(getRenderObjectPtr(), key, value.toString());
+ }
+
+ public void nativeUpdateAttrs(Map<String, Object> dynamic){
+ Set<Map.Entry<String, Object>> entries = dynamic.entrySet();
+ /**
+ * diff attrs, see attrs has update, remove none update attrs
+ * */
+ Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
+ while (iterator.hasNext()){
+ Map.Entry<String, Object> objectEntry = iterator.next();
+ if(objectEntry.getKey() == null){
+ continue;
+ }
+ updateNativeAttr(objectEntry.getKey(), objectEntry.getValue());
+ }
+ }
+
+
+ public void updateNativeStyle(String key, Object value){
+ if(key == null){
+ return;
+ }
+ if(value == null){
+ value = "";
+ }
+ getBasicComponentData().getStyles().put(key, value);
+ NativeRenderObjectUtils.nativeUpdateRenderObjectStyle(getRenderObjectPtr(), key, value.toString());
+ }
+
+ public void updateNativeStyles(Map<String, Object> dynamic){
+ Set<Map.Entry<String, Object>> entries = dynamic.entrySet();
+ /**
+ * diff attrs, see attrs has update, remove none update attrs
+ * */
+ Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
+ while (iterator.hasNext()){
+ Map.Entry<String, Object> objectEntry = iterator.next();
+ if(objectEntry.getKey() == null){
+ continue;
+ }
+ updateNativeStyle(objectEntry.getKey(), objectEntry.getValue());
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/basic/WXBasicComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/basic/WXBasicComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/basic/WXBasicComponent.java
index 67296a0..6452559 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/basic/WXBasicComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/basic/WXBasicComponent.java
@@ -27,6 +27,7 @@ import com.taobao.weex.dom.WXStyle;
import com.taobao.weex.ui.action.BasicComponentData;
import com.taobao.weex.ui.action.GraphicPosition;
import com.taobao.weex.ui.action.GraphicSize;
+import com.taobao.weex.ui.component.WXBasicComponentType;
import com.taobao.weex.ui.component.WXComponent;
import java.util.Map;
import java.util.Set;
@@ -129,6 +130,13 @@ public abstract class WXBasicComponent<T extends View> {
mBasicComponentData.addStyle(styles, byPesudo);
}
+ public final void updateStyle(Map<String, Object> styles, boolean byPesudo){
+ if (styles == null || styles.isEmpty()) {
+ return;
+ }
+ mBasicComponentData.getStyles().updateStyle(styles, byPesudo);
+ }
+
public final void addEvent(Set<String> events) {
if (events == null || events.isEmpty()) {
return;
@@ -167,7 +175,7 @@ public abstract class WXBasicComponent<T extends View> {
return mRef;
}
- protected GraphicPosition getLayoutPosition() {
+ public GraphicPosition getLayoutPosition() {
if (mLayoutPosition == null) {
mLayoutPosition = new GraphicPosition(0, 0, 0, 0);
}
@@ -178,7 +186,7 @@ public abstract class WXBasicComponent<T extends View> {
this.mLayoutPosition = mLayoutPosition;
}
- protected GraphicSize getLayoutSize() {
+ public GraphicSize getLayoutSize() {
if (mLayoutSize == null) {
mLayoutSize = new GraphicSize(0, 0);
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/AsynLayoutTask.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/AsynLayoutTask.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/AsynLayoutTask.java
new file mode 100644
index 0000000..9f99925
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/AsynLayoutTask.java
@@ -0,0 +1,60 @@
+/**
+ * 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.component.binding;
+
+import android.os.AsyncTask;
+
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.ui.component.list.template.TemplateViewHolder;
+
+/**
+ * Created by furture on 2018/5/11.
+ */
+
+class AsynLayoutTask extends AsyncTask<Void, Void, Void> {
+
+ private final TemplateViewHolder templateViewHolder;
+ private final int position;
+ private final WXComponent component;
+
+ AsynLayoutTask(TemplateViewHolder templateViewHolder, int position, WXComponent component) {
+ this.templateViewHolder = templateViewHolder;
+ this.position = position;
+ this.component = component;
+ }
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ if(templateViewHolder.getHolderPosition() == position){
+ if(component.getInstance() != null && !component.getInstance().isDestroy()) {
+ Layouts.doLayoutOnly(component, templateViewHolder);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void aVoid) {
+ if(position == templateViewHolder.getHolderPosition()) {
+ if(component.getInstance() != null && !component.getInstance().isDestroy()) {
+ Layouts.setLayout(component, false);
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
index e9307bb..bdbcea9 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
@@ -21,14 +21,16 @@ package com.taobao.weex.ui.component.binding;
import android.os.AsyncTask;
+import android.util.Log;
import com.taobao.weex.WXEnvironment;
-import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.common.Constants;
import com.taobao.weex.ui.component.WXComponent;
import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.ui.component.list.WXCell;
import com.taobao.weex.ui.component.list.template.TemplateViewHolder;
import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList;
+import com.taobao.weex.ui.component.list.template.jni.NativeRenderObjectUtils;
import com.taobao.weex.utils.WXLogUtils;
/**
@@ -47,60 +49,45 @@ public class Layouts {
templateViewHolder.asyncTask = null;
}
if(async){
- AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- if(templateViewHolder.getHolderPosition() == position){
- if(component.getInstance() != null && !component.getInstance().isDestroy()) {
- doSafeLayout(component
- // TODO
-// , templateViewHolder.getLayoutContext()
- );
- }
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void aVoid) {
- if(position == templateViewHolder.getHolderPosition()) {
- if(component.getInstance() != null && !component.getInstance().isDestroy()) {
- setLayout(component, false);
- }
- }
- }
- };
+ AsyncTask<Void, Void, Void> asyncTask = new AsynLayoutTask(templateViewHolder, position, component);
templateViewHolder.asyncTask = asyncTask;
asyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); //serial executor is better
}else{
- doSafeLayout(component
-// , templateViewHolder.getLayoutContext() // TODO
- );
+ doLayoutOnly(component, templateViewHolder);
setLayout(component, false);
}
}
-
/**
- * safe layout
+ * @param layoutHeight height
+ * @param layoutWidth width
* */
- public static void doSafeLayout(WXComponent component
- // TODO
-// , final CSSLayoutContext layoutContext
- ){
+ public static void doLayoutSync(WXCell component, float layoutWidth, float layoutHeight){
+ doSafeLayout(component, layoutWidth, layoutHeight);
+ setLayout(component, false);
+ }
+
+ /**
+ * safe layout
+ * */
+ public static void doLayoutOnly(WXComponent component, TemplateViewHolder holder){
+ doSafeLayout(component, holder.getTemplateList().getLayoutWidth(), holder.getTemplateList().getLayoutHeight());
+ }
+
+ private static void doSafeLayout(WXComponent component, float layoutWidth, float layoutHeight){
try{
long start = System.currentTimeMillis();
- doLayout(component
-// , layoutContext
- );
+ int height = NativeRenderObjectUtils.nativeLayoutRenderObject(component.getRenderObjectPtr(),
+ layoutWidth,
+ layoutHeight);
if(WXEnvironment.isOpenDebugLog() && WXRecyclerTemplateList.ENABLE_TRACE_LOG) {
- WXLogUtils.d(WXRecyclerTemplateList.TAG, "WXTemplateList doSafeLayout" +
- component.getAttrs().get(Constants.Name.Recycler.SLOT_TEMPLATE_CASE) + Thread.currentThread().getName() + " doSafeLayout used " +
+ WXLogUtils.d(WXRecyclerTemplateList.TAG, "WXTemplateList doSafeLayout " +
+ component.getAttrs().get(Constants.Name.Recycler.SLOT_TEMPLATE_CASE) + " " + Thread.currentThread().getName() + " doSafeLayout used " +
(System.currentTimeMillis() - start));
}
- if(!(component.getLayoutHeight() > 0)){
+ if(!(height > 0)){
WXLogUtils.e(WXRecyclerTemplateList.TAG, " WXTemplateList doSafeLayout wrong template " +
- component.getAttrs().get(Constants.Name.Recycler.SLOT_TEMPLATE_CASE) + " cell height " + component.getLayoutHeight());
+ component.getAttrs().get(Constants.Name.Recycler.SLOT_TEMPLATE_CASE) + " cell height " + height);
}
}catch (Exception e){
if(WXEnvironment.isApkDebugable()){
@@ -109,48 +96,6 @@ public class Layouts {
}
}
- private static void doLayout(WXComponent component
-// , final CSSLayoutContext layoutContext
- ){
- // TODO
-// WXDomObject domObject = (WXDomObject) component.getDomObject();
-// final WXSDKInstance instance = component.getInstance();
-// domObject.traverseUpdateTree(new WXDomObject.Consumer() {
-// @Override
-// public void accept(WXDomObject dom) {
-// if(instance == null || instance.isDestroy()){
-// return;
-// }
-// if(!dom.hasUpdate()){
-// return;
-// }
-// if(!dom.isShow()){ //not show just skip
-// return;
-// }
-// dom.layoutBefore();
-// }
-// });
-// if(instance != null && !instance.isDestroy()){
-// domObject.markDirty(layoutContext);
-// }
-// domObject.traverseUpdateTree( new WXDomObject.Consumer() {
-// @Override
-// public void accept(WXDomObject dom) {
-// if(instance == null || instance.isDestroy()){
-// return;
-// }
-// if(!dom.isShow()){
-// return;
-// }
-// if (dom.hasUpdate()) {
-// dom.layoutAfter();
-// }
-// }
-// });
- }
-
-
-
/**
* recursive set layout to component,
@@ -161,46 +106,17 @@ public class Layouts {
if(component.isWaste()){
return;
}
- // TODO
-// WXDomObject domObject = (WXDomObject) component.getDomObject();
-// if(domObject.hasUpdate() || force){
-// domObject.markUpdateSeen();
-// if(domObject.hasUpdate()){
-// domObject.markLayoutStateUpdated();
-// }
-// component.setLayout(component.getDomObject());
-// if(component.getDomObject().getExtra() != null){
-// component.updateExtra(component.getDomObject().getExtra());
-// }
-// }
- if(component instanceof WXVContainer){
- WXVContainer container = (WXVContainer) component;
- int count = container.getChildCount();
- for (int i = 0; i < count; ++i) {
- WXComponent child = container.getChild(i);
- if (child != null) {
- setLayout(child, force);
- }
- }
+ long ptr = component.getRenderObjectPtr();
+ if(NativeRenderObjectUtils.nativeRenderObjectHasNewLayout(ptr)){
+ NativeRenderObjectUtils.nativeRenderObjectUpdateComponent(ptr, component);
}
- }
-
- private static final void setLayoutWaste(WXComponent component, boolean force){
- // TODO
-// WXDomObject domObject = (WXDomObject) component.getDomObject();
-// if(domObject.hasUpdate() || force){
-// domObject.markUpdateSeen();
-// if(domObject.hasUpdate()){
-// domObject.markLayoutStateUpdated();
-// }
-// }
if(component instanceof WXVContainer){
WXVContainer container = (WXVContainer) component;
int count = container.getChildCount();
for (int i = 0; i < count; ++i) {
WXComponent child = container.getChild(i);
if (child != null) {
- setLayoutWaste(child, force);
+ setLayout(child, force);
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
index 0448029..2e1cb92 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
@@ -32,10 +32,14 @@ import com.taobao.weex.dom.WXAttr;
import com.taobao.weex.dom.WXEvent;
import com.taobao.weex.dom.WXStyle;
import com.taobao.weex.dom.binding.ELUtils;
+import com.taobao.weex.dom.binding.JSONUtils;
import com.taobao.weex.dom.binding.WXStatement;
import com.taobao.weex.el.parse.ArrayStack;
import com.taobao.weex.el.parse.Operators;
import com.taobao.weex.el.parse.Token;
+import com.taobao.weex.ui.action.BasicComponentData;
+import com.taobao.weex.ui.action.GraphicPosition;
+import com.taobao.weex.ui.action.GraphicSize;
import com.taobao.weex.ui.component.WXComponent;
import com.taobao.weex.ui.component.WXComponentFactory;
import com.taobao.weex.ui.component.WXImage;
@@ -45,6 +49,7 @@ import com.taobao.weex.ui.component.list.template.CellDataManager;
import com.taobao.weex.ui.component.list.template.CellRenderContext;
import com.taobao.weex.ui.component.list.template.VirtualComponentLifecycle;
import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList;
+import com.taobao.weex.ui.component.list.template.jni.NativeRenderObjectUtils;
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.utils.WXUtils;
@@ -61,6 +66,52 @@ import java.util.Set;
* simple statement execute, render component for template list
*/
public class Statements {
+
+
+ /**
+ * parse statements token from attrs and style and event
+ * */
+ public static void parseStatementsToken(WXComponent component){
+ if(component.getBasicComponentData().isRenderPtrEmpty()){
+ component.getBasicComponentData().setRenderObjectPr(component.getRenderObjectPtr());
+ }
+ if(component.getBasicComponentData() != null){
+ BasicComponentData basicComponentData = component.getBasicComponentData();
+ basicComponentData.getAttrs().parseStatements();
+ basicComponentData.getStyles().parseStatements();
+ basicComponentData.getEvents().parseStatements();
+ }
+ if(component instanceof WXVContainer){
+ WXVContainer container = (WXVContainer) component;
+ int count = container.getChildCount();
+ for (int i = 0; i < count; ++i) {
+ parseStatementsToken(container.getChild(i));
+ }
+ }
+ }
+
+
+
+ /**
+ * init component if component is lazy,
+ * if component is not lazy, do nothing
+ * */
+ public static void initLazyComponent(WXComponent component, WXVContainer mParent){
+ if(component.isLazy() || component.getHostView() == null){
+ component.lazy(false);
+ if(mParent != null){
+ int index = mParent.indexOf(component);
+ mParent.createChildViewAt(index);
+ }else {
+ component.createView();
+ }
+ component.applyLayoutAndEvent(component);
+ component.bindData(component);
+ }
+ }
+
+
+
/**
* recursive copy component, none parent connect
* */
@@ -73,16 +124,28 @@ public class Statements {
* recursive copy component,
* */
private static final WXComponent copyComponentTree(WXComponent source, WXVContainer parent){
- WXComponent component = WXComponentFactory.newInstance(source.getInstance(), parent, source.getBasicComponentData());
+ BasicComponentData basicComponentData = null;
+ try {
+ basicComponentData = source.getBasicComponentData().clone();
+ } catch (CloneNotSupportedException e) {
+ e.printStackTrace();
+ }
+ WXComponent component = WXComponentFactory.newInstance(source.getInstance(), parent, basicComponentData);
+ GraphicPosition graphicPosition = source.getLayoutPosition();
+ GraphicSize graphicSize = source.getLayoutSize();
+ component.updateDemission(graphicPosition.getTop(), graphicPosition.getBottom(), graphicPosition.getLeft(), graphicPosition.getRight(),
+ graphicSize.getHeight(), graphicSize.getWidth());
+ component.updateExtra(source.getExtra());
if(source instanceof WXVContainer){
WXVContainer container = (WXVContainer) source;
WXVContainer childParent = (WXVContainer) component;
int count = container.getChildCount();
for (int i = 0; i < count; ++i) {
- WXComponent child = container.getChild(i);
- if (child != null) {
- WXComponent targetChild = copyComponentTree(child, childParent);
- childParent.addChild(targetChild);
+ WXComponent sourceChild = container.getChild(i);
+ if (sourceChild != null) {
+ WXComponent targetChild = copyComponentTree(sourceChild, childParent);childParent.addChild(targetChild);
+ NativeRenderObjectUtils.nativeAddChildRenderObject(childParent.getRenderObjectPtr(),
+ targetChild.getRenderObjectPtr());
}
}
}
@@ -185,7 +248,7 @@ public class Statements {
if(map == null){
key = index;
value = item;
- index++;
+ index ++;
}else{
key = item;
value = map.get(item);
@@ -233,6 +296,8 @@ public class Statements {
renderNode.getAttrs().getStatement().remove(WXStatement.WX_IF); //clear node's statement
}
parent.addChild(renderNode, renderIndex);
+ NativeRenderObjectUtils.nativeAddChildRenderObject(parent.getRenderObjectPtr(),
+ renderNode.getRenderObjectPtr());
updates.add(renderNode);
if(WXEnvironment.isApkDebugable()){
WXLogUtils.d(WXRecyclerTemplateList.TAG, Thread.currentThread().getName() + renderNode.getRef() + renderNode.getComponentType() + "statements copy component tree used " + (System.currentTimeMillis() - start));
@@ -295,7 +360,7 @@ public class Statements {
if(attr.get(ELUtils.IS_COMPONENT_ROOT) != null
&& WXUtils.getBoolean(attr.get(ELUtils.IS_COMPONENT_ROOT), false)){
if(attr.get(ELUtils.COMPONENT_PROPS) != null
- && attr.get(ELUtils.COMPONENT_PROPS) instanceof JSONObject){
+ && JSONUtils.isJSON(attr.get(ELUtils.COMPONENT_PROPS))){
String compoentId = (String) attr.get(CellDataManager.SUB_COMPONENT_TEMPLATE_ID);
Object compoentData = null;
if(!TextUtils.isEmpty(compoentId)){
@@ -303,7 +368,7 @@ public class Statements {
if(virtualComponentId == null){ //none virtualComponentId, create and do attach
virtualComponentId = CellDataManager.createVirtualComponentId(context.templateList.getRef(),
component.getViewTreeKey(), context.templateList.getItemId(context.position));
- Map<String, Object> props = renderProps((JSONObject) attr.get(ELUtils.COMPONENT_PROPS), context.stack);
+ Map<String, Object> props = renderProps(JSONUtils.toJSON(attr.get(ELUtils.COMPONENT_PROPS)), context.stack);
EventResult result = WXBridgeManager.getInstance().syncCallJSEventWithResult(WXBridgeManager.METHD_COMPONENT_HOOK_SYNC, component.getInstanceId(), null, compoentId, VirtualComponentLifecycle.LIFECYCLE, VirtualComponentLifecycle.CREATE, new Object[]{
virtualComponentId,
props
@@ -367,8 +432,10 @@ public class Statements {
doRenderBindingAttrsAndEvent(component, context);
if(component instanceof WXVContainer){
- if(!(component instanceof WXCell)){
- return;
+ if(component.isWaste()){
+ if(!(component instanceof WXCell)){
+ return;
+ }
}
WXVContainer container = (WXVContainer) component;
for(int k=0; k<container.getChildCount();){
@@ -431,7 +498,7 @@ public class Statements {
//for image avoid dirty layout, only update src attrs
component.getAttrs().put(Constants.Name.SRC, dynamic.get(Constants.Name.SRC));
}else {
-// domObject.updateAttr(dynamic); //dirty layout
+ component.nativeUpdateAttrs(dynamic);
}
if(isMainThread()) {
component.updateProperties(dynamic);
@@ -467,9 +534,7 @@ public class Statements {
}
}
if(dynamic.size() > 0) {
- // TODO
-// domObject.updateStyle(dynamic, false);
-// domObject.applyStyle(dynamic);
+ component.updateNativeStyles(dynamic);
if(isMainThread()) {
component.updateProperties(dynamic);
}
@@ -598,8 +663,6 @@ public class Statements {
return params;
}
- private static volatile int componentIdNext = 0;
-
private static boolean isMainThread(){
return Thread.currentThread() == Looper.getMainLooper().getThread();
@@ -625,4 +688,7 @@ public class Statements {
}
return getComponentId(component.getParent());
}
+
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
index fb57c32..a147f03 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
@@ -66,7 +66,6 @@ import com.taobao.weex.ui.view.listview.adapter.IOnLoadMoreListener;
import com.taobao.weex.ui.view.listview.adapter.IRecyclerAdapterListener;
import com.taobao.weex.ui.view.listview.adapter.ListBaseViewHolder;
import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
-import com.taobao.weex.ui.view.listview.adapter.TransformItemDecoration;
import com.taobao.weex.ui.view.listview.adapter.WXRecyclerViewOnScrollListener;
import com.taobao.weex.ui.view.refresh.wrapper.BounceRecyclerView;
import com.taobao.weex.utils.WXLogUtils;
@@ -81,7 +80,6 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
@@ -98,8 +96,8 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
private static final Pattern transformPattern = Pattern.compile("([a-z]+)\\(([0-9\\.]+),?([0-9\\.]+)?\\)");
private Map<String, AppearanceHelper> mAppearComponents = new HashMap<>();
- private Runnable mAppearComponentsRunnable = null;
- private long mAppearDelay = 50;
+ private Runnable mAppearChangeRunnable = null;
+ private long mAppearChangeRunnableDelay = 50;
private boolean isScrollable = true;
private ArrayMap<String, Long> mRefToViewType;
@@ -226,9 +224,9 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
@Override
public void destroy() {
- if(mAppearComponentsRunnable != null) {
- getHostView().removeCallbacks(mAppearComponentsRunnable);
- mAppearComponentsRunnable = null;
+ if(mAppearChangeRunnable != null) {
+ getHostView().removeCallbacks(mAppearChangeRunnable);
+ mAppearChangeRunnable = null;
}
super.destroy();
if (mStickyMap != null)
@@ -269,7 +267,7 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
keepPositionLayoutDelay = WXUtils.getNumberInt(getAttrs().get(Constants.Name.KEEP_POSITION_LAYOUT_DELAY), (int)keepPositionLayoutDelay);
}
if(getAttrs().get("appearActionDelay") != null){
- mAppearDelay = WXUtils.getNumberInt(getAttrs().get("appearActionDelay"), (int)mAppearDelay);
+ mAppearChangeRunnableDelay = WXUtils.getNumberInt(getAttrs().get("appearActionDelay"), (int) mAppearChangeRunnableDelay);
}
mItemAnimator=bounceRecyclerView.getInnerView().getItemAnimator();
@@ -466,19 +464,19 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
@Override
public void bindAppearEvent(WXComponent component) {
setAppearanceWatch(component, AppearanceHelper.APPEAR, true);
- if(mAppearComponentsRunnable == null){
- mAppearComponentsRunnable = new Runnable() {
+ if(mAppearChangeRunnable == null){
+ mAppearChangeRunnable = new Runnable() {
@Override
public void run() {
- if(mAppearComponentsRunnable != null) {
+ if(mAppearChangeRunnable != null) {
notifyAppearStateChange(0, 0, 0, 0);
}
}
};
}
if (getHostView() != null) {
- getHostView().removeCallbacks(mAppearComponentsRunnable);
- getHostView().postDelayed(mAppearComponentsRunnable, mAppearDelay);
+ getHostView().removeCallbacks(mAppearChangeRunnable);
+ getHostView().postDelayed(mAppearChangeRunnable, mAppearChangeRunnableDelay);
}
}
@@ -1200,9 +1198,9 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
@Override
public void notifyAppearStateChange(int firstVisible, int lastVisible, int directionX, int directionY) {
- if(mAppearComponentsRunnable != null) {
- getHostView().removeCallbacks(mAppearComponentsRunnable);
- mAppearComponentsRunnable = null;
+ if(mAppearChangeRunnable != null) {
+ getHostView().removeCallbacks(mAppearChangeRunnable);
+ mAppearChangeRunnable = null;
}
//notify appear state
Iterator<AppearanceHelper> it = mAppearComponents.values().iterator();
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
index d6df19e..a30a1ac 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
@@ -18,8 +18,6 @@
*/
package com.taobao.weex.ui.component.list;
-import static com.taobao.weex.common.Constants.Name.STICKY_OFFSET;
-
import android.content.Context;
import android.os.Build;
import android.support.annotation.NonNull;
@@ -27,6 +25,7 @@ import android.support.annotation.RestrictTo;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
+
import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.annotation.Component;
import com.taobao.weex.common.Constants;
@@ -38,8 +37,11 @@ import com.taobao.weex.ui.view.WXFrameLayout;
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.utils.WXUtils;
import com.taobao.weex.utils.WXViewUtils;
+
import java.util.LinkedList;
+import static com.taobao.weex.common.Constants.Name.STICKY_OFFSET;
+
/**
* Root component for components in {@link WXListComponent}
*/
@@ -61,6 +63,10 @@ public class WXCell extends WidgetContainer<WXFrameLayout> {
private boolean isSourceUsed = false;
+ private boolean isAppendTreeDone;
+
+ private CellAppendTreeListener cellAppendTreeListener;
+
@Deprecated
public WXCell(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) {
super(instance, parent, basicComponentData);
@@ -224,4 +230,29 @@ public class WXCell extends WidgetContainer<WXFrameLayout> {
public void setSourceUsed(boolean sourceUsed) {
isSourceUsed = sourceUsed;
}
+
+
+ public boolean isAppendTreeDone(){
+ return isAppendTreeDone;
+ }
+
+ @Override
+ public void appendTreeCreateFinish() {
+ super.appendTreeCreateFinish();
+ isAppendTreeDone = true;
+ if(cellAppendTreeListener != null){
+ cellAppendTreeListener.onAppendTreeDone();
+ }
+ }
+
+ public void setCellAppendTreeListener(CellAppendTreeListener cellAppendTreeListener) {
+ this.cellAppendTreeListener = cellAppendTreeListener;
+ if(isAppendTreeDone){
+ cellAppendTreeListener.onAppendTreeDone();
+ }
+ }
+
+ public interface CellAppendTreeListener{
+ public void onAppendTreeDone();
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
index 3519db2..feca9f9 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
@@ -97,9 +97,9 @@ public class WXListComponent extends BasicListComponent<BounceRecyclerView> {
}
private boolean hasColumnPros() {
- return mColumnWidth != WXUtils.parseFloat(getAttrs().get(Constants.Name.COLUMN_WIDTH)) ||
- mColumnCount != WXUtils.parseInt(getAttrs().get(Constants.Name.COLUMN_COUNT)) ||
- mColumnGap != WXUtils.parseFloat(getAttrs().get(Constants.Name.COLUMN_GAP));
+ return (getAttrs().containsKey(Constants.Name.COLUMN_WIDTH) && mColumnWidth != WXUtils.parseFloat(getAttrs().get(Constants.Name.COLUMN_WIDTH))) ||
+ (getAttrs().containsKey(Constants.Name.COLUMN_COUNT) && mColumnCount != WXUtils.parseInt(getAttrs().get(Constants.Name.COLUMN_COUNT))) ||
+ (getAttrs().containsKey(Constants.Name.COLUMN_GAP) && mColumnGap != WXUtils.parseFloat(getAttrs().get(Constants.Name.COLUMN_GAP)));
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/AsyncCellLoadTask.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/AsyncCellLoadTask.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/AsyncCellLoadTask.java
index 0dae3c8..d186c81 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/AsyncCellLoadTask.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/AsyncCellLoadTask.java
@@ -59,6 +59,7 @@ class AsyncCellLoadTask extends AsyncTask<Void,Void, Void> {
WXCell component = (WXCell) templateList.copyComponentFromSourceCell(source);
if(WXEnvironment.isOpenDebugLog() && WXRecyclerTemplateList.ENABLE_TRACE_LOG){
WXLogUtils.d(WXRecyclerTemplateList.TAG, " AsyncCellLoadTask load " + template
+ + " " + component.hashCode()
+ " used " + (System.currentTimeMillis() - start));
}
if(component == null){
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/PositionRef.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/PositionRef.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/PositionRef.java
index f25c9a9..d176302 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/PositionRef.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/PositionRef.java
@@ -18,11 +18,14 @@
*/
package com.taobao.weex.ui.component.list.template;
+import com.alibaba.fastjson.JSONAware;
+import com.alibaba.fastjson.annotation.JSONType;
+
/**
* position render state, when render state change, position changed
* Created by furture on 2018/2/2.
*/
-public class PositionRef extends Number{
+public class PositionRef extends Number implements JSONAware {
private CellRenderState renderState;
@@ -61,4 +64,9 @@ public class PositionRef extends Number{
public String toString() {
return String.valueOf(getPosition());
}
+
+ @Override
+ public String toJSONString() {
+ return String.valueOf(getPosition());
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b049f80e/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateViewHolder.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateViewHolder.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateViewHolder.java
index ac69c51..c0d4fb0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateViewHolder.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateViewHolder.java
@@ -17,8 +17,10 @@
* under the License.
*/
package com.taobao.weex.ui.component.list.template;
+
import android.os.AsyncTask;
import android.view.View;
+
import com.taobao.weex.ui.component.list.WXCell;
import com.taobao.weex.ui.view.listview.adapter.ListBaseViewHolder;
@@ -33,8 +35,7 @@ public class TemplateViewHolder extends ListBaseViewHolder {
* */
private WXCell template;
- // TODO
-// private CSSLayoutContext layoutContext;
+ private WXRecyclerTemplateList templateList;
private int holderPosition = -1;
@@ -46,26 +47,18 @@ public class TemplateViewHolder extends ListBaseViewHolder {
* header position
* */
- public TemplateViewHolder(WXCell component, int viewType) {
+ public TemplateViewHolder(WXRecyclerTemplateList templateList, WXCell component, int viewType) {
super(component, viewType);
this.template = component;
+ this.templateList = templateList;
}
- public TemplateViewHolder(View view, int viewType) {
+ public TemplateViewHolder(WXRecyclerTemplateList templateList, View view, int viewType) {
super(view, viewType);
+ this.templateList = templateList;
}
- // TODO
-// public CSSLayoutContext getLayoutContext() {
-// if(layoutContext == null){
-// layoutContext = new CSSLayoutContext();
-// }
-// return layoutContext;
-// }
-//
-// public void setLayoutContext(CSSLayoutContext layoutContext){
-// this.layoutContext = layoutContext;
-// }
+
public int getHolderPosition() {
@@ -79,4 +72,8 @@ public class TemplateViewHolder extends ListBaseViewHolder {
public WXCell getTemplate() {
return template;
}
+
+ public WXRecyclerTemplateList getTemplateList() {
+ return templateList;
+ }
}