http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java index 4f9712f..5434bc0 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java @@ -23,9 +23,9 @@ import android.text.TextUtils; import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.common.WXRuntimeException; -import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.IFComponentHolder; import com.taobao.weex.ui.WXComponentRegistry; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.utils.WXLogUtils; import java.util.HashMap; @@ -37,42 +37,45 @@ import java.util.Set; * Component factory */ public class WXComponentFactory { - private static Map<String,Set<String>> sComponentTypes=new HashMap<>(); - public static Set<String> getComponentTypesByInstanceId(String instanceId){ + private static Map<String, Set<String>> sComponentTypes = new HashMap<>(); + + public static Set<String> getComponentTypesByInstanceId(String instanceId) { return sComponentTypes.get(instanceId); } - public static void removeComponentTypesByInstanceId(String instanceId){ + + public static void removeComponentTypesByInstanceId(String instanceId) { sComponentTypes.remove(instanceId); } - public static WXComponent newInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) { - if (instance == null || node == null || TextUtils.isEmpty(node.getType()) ) { + public static WXComponent newInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { + if (instance == null || TextUtils.isEmpty(basicComponentData.mComponentType)) { return null; } - - if(sComponentTypes.get(instance.getInstanceId())==null){ - Set<String> types=new HashSet<>(); - sComponentTypes.put(instance.getInstanceId(),types); + if (sComponentTypes.get(instance.getInstanceId()) == null) { + Set<String> types = new HashSet<>(); + sComponentTypes.put(instance.getInstanceId(), types); } - sComponentTypes.get(instance.getInstanceId()).add(node.getType()); + sComponentTypes.get(instance.getInstanceId()).add(basicComponentData.mComponentType); - IFComponentHolder holder = WXComponentRegistry.getComponent(node.getType()); + IFComponentHolder holder = WXComponentRegistry.getComponent(basicComponentData.mComponentType); if (holder == null) { + if (WXEnvironment.isApkDebugable()) { String tag = "WXComponentFactory error type:[" + - node.getType() + "]" + " class not found"; + basicComponentData.mComponentType + "]" + " class not found"; WXLogUtils.e(tag); + } //For compatible reason of JS framework, unregistered type will be treated as container. holder = WXComponentRegistry.getComponent(WXBasicComponentType.CONTAINER); - if(holder == null){ + if (holder == null) { throw new WXRuntimeException("Container component not found."); } } try { - return holder.createInstance(instance, node, parent); - } catch (Exception e) { - WXLogUtils.e("WXComponentFactory Exception type:[" + node.getType() + "] ", e); + return holder.createInstance(instance, parent, basicComponentData); + } catch (Throwable e) { + WXLogUtils.e("WXComponentFactory Exception type:[" + basicComponentData.mComponentType + "] ", e); } return null;
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java index 31364f0..65b9b51 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentProp.java @@ -20,11 +20,10 @@ package com.taobao.weex.ui.component; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -@Retention(RUNTIME) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface WXComponentProp { http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java index b9b97e1..b9f5ada 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java @@ -22,13 +22,14 @@ import android.content.Context; import android.support.annotation.NonNull; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; -import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.ComponentCreator; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.flat.FlatComponent; import com.taobao.weex.ui.flat.WidgetContainer; import com.taobao.weex.ui.flat.widget.WidgetGroup; import com.taobao.weex.ui.view.WXFrameLayout; import java.lang.reflect.InvocationTargetException; +import java.util.LinkedList; /** * div component @@ -39,24 +40,20 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone private WidgetGroup mWidgetGroup; public static class Ceator implements ComponentCreator { - - public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) - throws IllegalAccessException, InvocationTargetException, InstantiationException { - return new WXDiv(instance, node, parent); + public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException { + return new WXDiv(instance, parent, basicComponentData); } } @Deprecated - public WXDiv(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, - boolean isLazy) { - this(instance, dom, parent); + public WXDiv(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, basicComponentData); } - public WXDiv(WXSDKInstance instance, WXDomObject node, WXVContainer parent) { - super(instance, node, parent); + public WXDiv(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { + super(instance, parent, basicComponentData); } - @Override protected WXFrameLayout initComponentHostView(@NonNull Context context) { WXFrameLayout frameLayout = new WXFrameLayout(context); @@ -67,7 +64,7 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone @Override public boolean promoteToView(boolean checkAncestor) { return !intendToBeFlatContainer() || - getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXDiv.class); + getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXDiv.class); } /** @@ -89,6 +86,9 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone @Override protected void mountFlatGUI() { + if(widgets == null){ + widgets = new LinkedList<>(); + } if (promoteToView(true)) { if(getHostView()!=null) { getHostView().mountFlatGUI(widgets); @@ -114,5 +114,4 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone public boolean isVirtualComponent() { return !promoteToView(true); } - } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java index 87f5859..018612b 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java @@ -27,7 +27,7 @@ import android.webkit.WebView; import android.widget.FrameLayout; import android.widget.ImageView; -import com.taobao.weappplus_sdk.R; +import com.taobao.weex.R; import com.taobao.weex.IWXRenderListener; import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; @@ -36,7 +36,7 @@ import com.taobao.weex.common.Constants; import com.taobao.weex.common.WXErrorCode; import com.taobao.weex.common.WXPerformance; import com.taobao.weex.common.WXRenderStrategy; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; import com.taobao.weex.utils.WXViewUtils; @@ -45,8 +45,7 @@ import java.util.Comparator; import java.util.PriorityQueue; @Component(lazyload = false) -public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleListener,NestedContainer{ - +public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleListener,NestedContainer { public static final String STRATEGY_NONE = "none"; public static final String STRATEGY_NORMAL = "normal"; @@ -113,7 +112,7 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis @Override public void onException(NestedContainer container, String errCode, String msg) { if (TextUtils.equals(errCode, WXErrorCode. - WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode()) && container instanceof WXEmbed) { + WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode()) && container instanceof WXEmbed) { final WXEmbed comp = ((WXEmbed)container); final ImageView imageView = new ImageView(comp.getContext()); imageView.setImageResource(R.drawable.error); @@ -188,24 +187,24 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis } @Deprecated - public WXEmbed(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance,dom,parent); + public WXEmbed(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, basicComponentData); } - public WXEmbed(WXSDKInstance instance, WXDomObject node, WXVContainer parent) { - super(instance, node, parent); + public WXEmbed(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { + super(instance, parent, basicComponentData); mListener = new EmbedRenderListener(this); - ERROR_IMG_WIDTH = (int) WXViewUtils.getRealPxByWidth(270,instance.getInstanceViewPortWidth()); - ERROR_IMG_HEIGHT = (int) WXViewUtils.getRealPxByWidth(260,instance.getInstanceViewPortWidth()); - if(instance instanceof EmbedManager) { - Object itemId = node.getAttrs().get(ITEM_ID); + ERROR_IMG_WIDTH = (int) WXViewUtils.getRealPxByWidth(270, instance.getInstanceViewPortWidth()); + ERROR_IMG_HEIGHT = (int) WXViewUtils.getRealPxByWidth(260, instance.getInstanceViewPortWidth()); + if (instance instanceof EmbedManager) { + Object itemId = getAttrs().get(ITEM_ID); if (itemId != null) { ((EmbedManager) instance).putEmbed(itemId.toString(), this); } } - this.priority = WXUtils.getString(node.getAttrs().get(Constants.Name.PRIORITY), PRIORITY_NORMAL); - this.strategy = WXUtils.getString(node.getAttrs().get(Constants.Name.STRATEGY), STRATEGY_NONE); + this.priority = WXUtils.getString(getAttrs().get(Constants.Name.PRIORITY), PRIORITY_NORMAL); + this.strategy = WXUtils.getString(getAttrs().get(Constants.Name.STRATEGY), STRATEGY_NONE); } @Override @@ -229,7 +228,7 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis case Constants.Name.PRIORITY: String priority = WXUtils.getString(param,null); if (priority != null){ - setPriority(priority); + setPriority(priority); } return true; } @@ -278,10 +277,10 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis @WXComponentProp(name = Constants.Name.PRIORITY) public void setPriority(String priority) { - if(TextUtils.isEmpty(priority)){ - return; - } - this.priority = priority; + if(TextUtils.isEmpty(priority)){ + return; + } + this.priority = priority; } /** @@ -327,18 +326,16 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis if(TextUtils.isEmpty(url)){ mListener.mEventListener.onException(this, - WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(), + WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(), WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorMsg() + "!!wx embed src url is null" - ); + ); return sdkInstance; } - ViewGroup.LayoutParams layoutParams = getHostView().getLayoutParams(); sdkInstance.renderByUrl(WXPerformance.DEFAULT, - url, - null, null, layoutParams.width, - layoutParams.height, - WXRenderStrategy.APPEND_ASYNC); + url, + null, null, + WXRenderStrategy.APPEND_ASYNC); return sdkInstance; } @@ -376,7 +373,6 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis } } - private void doAutoEmbedMemoryStrategy(){ /** * auto manage embed amount in current instance, save memory @@ -491,16 +487,16 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis private void destoryNestInstance(){ if(getInstance().hiddenEmbeds != null && getInstance().hiddenEmbeds.contains(this)){ - getInstance().hiddenEmbeds.remove(this); + getInstance().hiddenEmbeds.remove(this); } if (mNestedInstance != null) { - mNestedInstance.destroy(); - mNestedInstance = null; + mNestedInstance.destroy(); + mNestedInstance = null; } if(WXEnvironment.isApkDebugable()){ - WXLogUtils.w("WXEmbed destoryNestInstance priority " + priority + " index " + getDomObject().getAttrs().get("index") - + " " + hiddenTime + " embeds size " + (getInstance().hiddenEmbeds == null ? 0 : getInstance().hiddenEmbeds.size()) - + " strategy " + this.strategy); + WXLogUtils.w("WXEmbed destoryNestInstance priority " + priority + " index " + getAttrs().get("index") + + " " + hiddenTime + " embeds size " + (getInstance().hiddenEmbeds == null ? 0 : getInstance().hiddenEmbeds.size()) + + " strategy " + this.strategy); } } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java index 82744c2..d55106e 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java @@ -21,7 +21,7 @@ package com.taobao.weex.ui.component; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.component.list.WXCell; /** @@ -31,13 +31,13 @@ import com.taobao.weex.ui.component.list.WXCell; public class WXHeader extends WXCell { @Deprecated - public WXHeader(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance,dom,parent,isLazy); + public WXHeader(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, isLazy, basicComponentData); } - public WXHeader(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) { - super(instance, node, parent, lazy); - String parantType = parent.getDomObject().getType(); + public WXHeader(WXSDKInstance instance, WXVContainer parent, boolean lazy, BasicComponentData basicComponentData) { + super(instance, parent, lazy, basicComponentData); + String parantType = parent.getComponentType(); if(WXBasicComponentType.LIST.equals(parantType) || WXBasicComponentType.RECYCLE_LIST.equals(parantType)){ setSticky(Constants.Value.STICKY); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java index ff32c0f..6d37506 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java @@ -18,11 +18,16 @@ */ package com.taobao.weex.ui.component; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; -import android.graphics.Bitmap; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -32,11 +37,9 @@ import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.text.TextUtils; -import android.util.Log; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ImageView.ScaleType; - import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.adapter.IWXImgLoaderAdapter; @@ -48,26 +51,19 @@ import com.taobao.weex.common.Constants; import com.taobao.weex.common.WXImageSharpen; import com.taobao.weex.common.WXImageStrategy; import com.taobao.weex.common.WXRuntimeException; -import com.taobao.weex.dom.ImmutableDomObject; -import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.ComponentCreator; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.view.WXImageView; import com.taobao.weex.ui.view.border.BorderDrawable; import com.taobao.weex.utils.ImageDrawable; import com.taobao.weex.utils.ImgURIUtil; import com.taobao.weex.utils.SingleFunctionParser; -import com.taobao.weex.utils.WXViewToImageUtil; import com.taobao.weex.utils.WXDomUtils; import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; +import com.taobao.weex.utils.WXViewToImageUtil; import com.taobao.weex.utils.WXViewUtils; -import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - /** * Image component */ @@ -89,21 +85,20 @@ public class WXImage extends WXComponent<ImageView> { } }; - public static class Ceator implements ComponentCreator { - public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException { - return new WXImage(instance,node,parent); + public static class Creator implements ComponentCreator { + @Override + public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException { + return new WXImage(instance, parent, basicComponentData); } } - @Deprecated - public WXImage(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance,dom,parent); + public WXImage(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, basicComponentData); } - public WXImage(WXSDKInstance instance, WXDomObject node, - WXVContainer parent) { - super(instance, node, parent); + public WXImage(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { + super(instance, parent, basicComponentData); } @Override @@ -117,47 +112,45 @@ public class WXImage extends WXComponent<ImageView> { return view; } - @Override - protected boolean setProperty(String key, Object param) { - switch (key) { - case Constants.Name.RESIZE_MODE: - String resize_mode = WXUtils.getString(param, null); - if (resize_mode != null) - setResizeMode(resize_mode); - return true; - case Constants.Name.RESIZE: - String resize = WXUtils.getString(param, null); - if (resize != null) - setResize(resize); - return true; - case Constants.Name.SRC: - String src = WXUtils.getString(param, null); - if (src != null) - setSrc(src); - return true; - case Constants.Name.IMAGE_QUALITY: - return true; - case Constants.Name.AUTO_RECYCLE: - mAutoRecycle = WXUtils.getBoolean(param, mAutoRecycle); - return true; - case Constants.Name.FILTER: - int blurRadius = 0; - if(param != null && param instanceof String) { - blurRadius = parseBlurRadius((String)param); - } - if(!TextUtils.isEmpty(this.mSrc)) { - setBlurRadius(this.mSrc,blurRadius); - } - return true; - } - return super.setProperty(key, param); + @Override + protected boolean setProperty(String key, Object param) { + switch (key) { + case Constants.Name.RESIZE_MODE: + String resizeMode = WXUtils.getString(param, null); + if (resizeMode != null) { setResizeMode(resizeMode); } + return true; + case Constants.Name.RESIZE: + String resize = WXUtils.getString(param, null); + if (resize != null) { setResize(resize); } + return true; + case Constants.Name.SRC: + String src = WXUtils.getString(param, null); + if (src != null) { setSrc(src); } + return true; + case Constants.Name.IMAGE_QUALITY: + return true; + case Constants.Name.AUTO_RECYCLE: + mAutoRecycle = WXUtils.getBoolean(param, mAutoRecycle); + return true; + case Constants.Name.FILTER: + int blurRadius = 0; + if (param != null && param instanceof String) { + blurRadius = parseBlurRadius((String)param); + } + if (!TextUtils.isEmpty(this.mSrc)) { + setBlurRadius(this.mSrc, blurRadius); + } + return true; + default: + return super.setProperty(key, param); + } } @Override public void refreshData(WXComponent component) { super.refreshData(component); if (component instanceof WXImage) { - setSrc(component.getDomObject().getAttrs().getImageSrc()); + setSrc(component.getAttrs().getImageSrc()); } } @@ -182,6 +175,8 @@ public class WXImage extends WXComponent<ImageView> { case "stretch": scaleType = ScaleType.FIT_XY; break; + default: + break; } return scaleType; } @@ -217,7 +212,7 @@ public class WXImage extends WXComponent<ImageView> { if(image != null){ if(image.getDrawable() != null){ - image.setImageDrawable(null); + image.setImageDrawable(null); } } @@ -230,10 +225,8 @@ public class WXImage extends WXComponent<ImageView> { setLocalSrc(rewrited); } else { int blur = 0; - if(getDomObject() != null) { - String blurStr = getDomObject().getStyles().getBlur(); - blur = parseBlurRadius(blurStr); - } + String blurStr = getStyles().getBlur(); + blur = parseBlurRadius(blurStr); setRemoteSrc(rewrited, blur); } } @@ -254,7 +247,7 @@ public class WXImage extends WXComponent<ImageView> { SingleFunctionParser<Integer> parser = new SingleFunctionParser<Integer>(rawRadius,BLUR_RADIUS_MAPPER); List<Integer> list = null; try { - list = parser.parse("blur"); + list = parser.parse("blur"); }catch (Exception e) { return 0; } @@ -297,83 +290,89 @@ public class WXImage extends WXComponent<ImageView> { private void setRemoteSrc(Uri rewrited,int blurRadius) { - WXImageStrategy imageStrategy = new WXImageStrategy(); - imageStrategy.isClipping = true; - - WXImageSharpen imageSharpen = getDomObject().getAttrs().getImageSharpen(); - imageStrategy.isSharpen = imageSharpen == WXImageSharpen.SHARPEN; - - imageStrategy.blurRadius = Math.max(0, blurRadius); - this.mBlurRadius = blurRadius; - - imageStrategy.setImageListener(new WXImageStrategy.ImageListener() { - @Override - public void onImageFinish(String url, ImageView imageView, boolean result, Map extra) { - if (getDomObject() != null && getDomObject().getEvents().contains(Constants.Event.ONLOAD)) { - Map<String, Object> params = new HashMap<String, Object>(); - Map<String, Object> size = new HashMap<>(2); - if (imageView != null && imageView instanceof Measurable) { - size.put("naturalWidth", ((Measurable) imageView).getNaturalWidth()); - size.put("naturalHeight", ((Measurable) imageView).getNaturalHeight()); - } else { - size.put("naturalWidth", 0); - size.put("naturalHeight", 0); - } - - if (getDomObject() != null && containsEvent(Constants.Event.ONLOAD)) { - params.put("success", result); - params.put("size", size); - fireEvent(Constants.Event.ONLOAD, params); - } + WXImageStrategy imageStrategy = new WXImageStrategy(); + imageStrategy.isClipping = true; + + WXImageSharpen imageSharpen = getAttrs().getImageSharpen(); + imageStrategy.isSharpen = imageSharpen == WXImageSharpen.SHARPEN; + + imageStrategy.blurRadius = Math.max(0, blurRadius); + this.mBlurRadius = blurRadius; + + imageStrategy.setImageListener(new WXImageStrategy.ImageListener() { + @Override + public void onImageFinish(String url, ImageView imageView, boolean result, Map extra) { + if (getEvents().contains(Constants.Event.ONLOAD)) { + Map<String, Object> params = new HashMap<String, Object>(); + Map<String, Object> size = new HashMap<>(2); + if (imageView != null && imageView instanceof Measurable) { + size.put("naturalWidth", ((Measurable) imageView).getNaturalWidth()); + size.put("naturalHeight", ((Measurable) imageView).getNaturalHeight()); + } else { + size.put("naturalWidth", 0); + size.put("naturalHeight", 0); } - monitorImgSize(imageView); - } - }); - String placeholder=null; - if(getDomObject().getAttrs().containsKey(Constants.Name.PLACEHOLDER)){ - placeholder= (String) getDomObject().getAttrs().get(Constants.Name.PLACEHOLDER); - }else if(getDomObject().getAttrs().containsKey(Constants.Name.PLACE_HOLDER)){ - placeholder=(String)getDomObject().getAttrs().get(Constants.Name.PLACE_HOLDER); - } - if(!TextUtils.isEmpty(placeholder)){ - imageStrategy.placeHolder = getInstance().rewriteUri(Uri.parse(placeholder),URIAdapter.IMAGE).toString(); + if (containsEvent(Constants.Event.ONLOAD)) { + params.put("success", result); + params.put("size", size); + fireEvent(Constants.Event.ONLOAD, params); + } } - - imageStrategy.instanceId = getInstanceId(); - IWXImgLoaderAdapter imgLoaderAdapter = getInstance().getImgLoaderAdapter(); - if (imgLoaderAdapter != null) { - imgLoaderAdapter.setImage(rewrited.toString(), getHostView(), - getDomObject().getAttrs().getImageQuality(), imageStrategy); + monitorImgSize(imageView); } + }); + + String placeholder=null; + if(getAttrs().containsKey(Constants.Name.PLACEHOLDER)){ + placeholder= (String) getAttrs().get(Constants.Name.PLACEHOLDER); + }else if(getAttrs().containsKey(Constants.Name.PLACE_HOLDER)){ + placeholder=(String)getAttrs().get(Constants.Name.PLACE_HOLDER); + } + if(placeholder!=null){ + imageStrategy.placeHolder = getInstance().rewriteUri(Uri.parse(placeholder),URIAdapter.IMAGE).toString(); + } + + imageStrategy.instanceId = getInstanceId(); + IWXImgLoaderAdapter imgLoaderAdapter = getInstance().getImgLoaderAdapter(); + if (imgLoaderAdapter != null) { + imgLoaderAdapter.setImage(rewrited.toString(), getHostView(), + getDomObject().getAttrs().getImageQuality(), imageStrategy); + } + } + + @Override + protected void onFinishLayout() { + super.onFinishLayout(); + updateBorderRadius(); } @Override public void updateProperties(Map<String, Object> props) { super.updateProperties(props); - WXImageView imageView; - ImmutableDomObject imageDom; - if ((imageDom = getDomObject()) != null && - getHostView() instanceof WXImageView) { - imageView = (WXImageView) getHostView(); + updateBorderRadius(); + } + + private void updateBorderRadius() { + if (getHostView() instanceof WXImageView) { + final WXImageView imageView = (WXImageView)getHostView(); BorderDrawable borderDrawable = WXViewUtils.getBorderDrawable(getHostView()); float[] borderRadius; if (borderDrawable != null) { - RectF borderBox = new RectF(0, 0, WXDomUtils.getContentWidth(imageDom), WXDomUtils.getContentHeight(imageDom)); - borderRadius = borderDrawable.getBorderRadius(borderBox); + RectF borderBox = new RectF(0, 0, WXDomUtils.getContentWidth(this), WXDomUtils.getContentHeight(this)); + borderRadius = borderDrawable.getBorderInnerRadius(borderBox); } else { - borderRadius = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; + borderRadius = new float[] {0, 0, 0, 0, 0, 0, 0, 0}; } imageView.setBorderRadius(borderRadius); if (imageView.getDrawable() instanceof ImageDrawable) { - ImageDrawable imageDrawable = (ImageDrawable) imageView.getDrawable(); + ImageDrawable imageDrawable = (ImageDrawable)imageView.getDrawable(); float[] previousRadius = imageDrawable.getCornerRadii(); if (!Arrays.equals(previousRadius, borderRadius)) { imageDrawable.setCornerRadii(borderRadius); } } - readyToRender(); } } @@ -457,15 +456,16 @@ public class WXImage extends WXComponent<ImageView> { } if (img.getIntrinsicHeight() * img.getIntrinsicWidth() > imageView.getMeasuredHeight() * - imageView.getMeasuredWidth()){ + imageView.getMeasuredWidth()){ instance.getWXPerformance().wrongImgSizeCount++; } } + @Override public void destroy() { if(getHostView() instanceof WXImageView){ if (getInstance().getImgLoaderAdapter() != null) { - getInstance().getImgLoaderAdapter().setImage(null, mHost, null, null); + getInstance().getImgLoaderAdapter().setImage(null, mHost, null, null); } } super.destroy(); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java index 02f8a21..e8422ca 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXIndicator.java @@ -29,16 +29,12 @@ import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; import com.taobao.weex.common.WXRuntimeException; -import com.taobao.weex.dom.WXDomObject; -import com.taobao.weex.dom.WXStyle; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.view.WXCircleIndicator; import com.taobao.weex.utils.WXResourceUtils; import com.taobao.weex.utils.WXUtils; import com.taobao.weex.utils.WXViewUtils; -import java.util.HashMap; -import java.util.Map; - /** * * Slider indicator @@ -47,12 +43,12 @@ import java.util.Map; public class WXIndicator extends WXComponent<WXCircleIndicator> { @Deprecated - public WXIndicator(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance,dom,parent,isLazy); + public WXIndicator(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, isLazy, basicComponentData); } - public WXIndicator(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) { - super(instance, dom, parent, isLazy); + public WXIndicator(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) { + super(instance, parent, isLazy, basicComponentData); } @Override @@ -151,20 +147,21 @@ public class WXIndicator extends WXComponent<WXCircleIndicator> { } } - public static class IndicatorDomNode extends WXDomObject{ - public IndicatorDomNode(){ - super(); - } - - @Override - protected Map<String, String> getDefaultStyle() { - WXStyle pendingStyles = getStyles(); - Map<String,String> map = new HashMap<>(); - if(!pendingStyles.containsKey(Constants.Name.RIGHT)) - map.put(Constants.Name.LEFT,"0"); - if(!pendingStyles.containsKey(Constants.Name.BOTTOM)) - map.put(Constants.Name.TOP,"0"); - return map; - } - } + // TODO +// public static class IndicatorDomNode extends WXDomObject{ +// public IndicatorDomNode(){ +// super(); +// } +// +// @Override +// protected Map<String, String> getDefaultStyle() { +// WXStyle pendingStyles = getStyles(); +// Map<String,String> map = new HashMap<>(); +// if(!pendingStyles.containsKey(Constants.Name.RIGHT)) +// map.put(Constants.Name.LEFT,"0"); +// if(!pendingStyles.containsKey(Constants.Name.BOTTOM)) +// map.put(Constants.Name.TOP,"0"); +// return map; +// } +// } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java index 339165a..d1a272d 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXInput.java @@ -20,7 +20,7 @@ package com.taobao.weex.ui.component; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.view.WXEditText; /** @@ -31,12 +31,12 @@ import com.taobao.weex.ui.view.WXEditText; public class WXInput extends AbstractEditComponent{ @Deprecated - public WXInput(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance,dom,parent,isLazy); + public WXInput(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, isLazy, basicComponentData); } - public WXInput(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) { - super(instance, dom, parent, isLazy); + public WXInput(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) { + super(instance, parent, isLazy, basicComponentData); } @Override @@ -44,9 +44,4 @@ public class WXInput extends AbstractEditComponent{ super.appleStyleAfterCreated(editText); editText.setSingleLine();//default use single line , same to ios } - - @Override - protected MeasureOutput measure(int width, int height) { - return super.measure(width, height); - } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java index 7ab9b03..8130ace 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoading.java @@ -25,10 +25,8 @@ import android.text.TextUtils; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; -import com.taobao.weex.dom.ImmutableDomObject; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.component.list.WXListComponent; -import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList; import com.taobao.weex.ui.view.WXFrameLayout; import com.taobao.weex.ui.view.WXLoadingLayout; import com.taobao.weex.ui.view.refresh.core.WXSwipeLayout; @@ -46,8 +44,8 @@ public class WXLoading extends WXBaseRefresh implements WXSwipeLayout.WXOnLoadin public static final String HIDE = "hide"; - public WXLoading(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) { - super(instance, node, parent, lazy); + public WXLoading(WXSDKInstance instance, WXVContainer parent, boolean lazy, BasicComponentData basicComponentData) { + super(instance, parent, lazy, basicComponentData); } @Override @@ -57,16 +55,14 @@ public class WXLoading extends WXBaseRefresh implements WXSwipeLayout.WXOnLoadin @Override public void onLoading() { - ImmutableDomObject domObject = getDomObject(); - if (domObject != null && domObject.getEvents().contains(Constants.Event.ONLOADING)) { + if (getEvents().contains(Constants.Event.ONLOADING)) { fireEvent(Constants.Event.ONLOADING); } } @Override public void onPullingUp(float dy, int pullOutDistance, float viewHeight) { - ImmutableDomObject domObject = getDomObject(); - if (domObject != null && domObject.getEvents().contains(Constants.Event.ONPULLING_UP)) { + if (getEvents().contains(Constants.Event.ONPULLING_UP)) { Map<String, Object> data = new HashMap<>(); data.put(Constants.Name.DISTANCE_Y, dy); data.put(Constants.Name.PULLING_DISTANCE, pullOutDistance); @@ -96,9 +92,7 @@ public class WXLoading extends WXBaseRefresh implements WXSwipeLayout.WXOnLoadin public void setDisplay(String display) { if (!TextUtils.isEmpty(display)) { if (display.equals(HIDE)) { - if (getParent() instanceof WXRecyclerTemplateList - || getParent() instanceof WXListComponent - || getParent() instanceof WXScroller) { + if (getParent() instanceof WXListComponent || getParent() instanceof WXScroller) { if (((BaseBounceView)getParent().getHostView()).getSwipeLayout().isRefreshing()) { ((BaseBounceView) getParent().getHostView()).finishPullLoad(); ((BaseBounceView) getParent().getHostView()).onLoadmoreComplete(); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java index 5c0a886..68b7403 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXLoadingIndicator.java @@ -25,7 +25,7 @@ import android.support.annotation.NonNull; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.view.refresh.circlebar.CircleProgressBar; import com.taobao.weex.utils.WXResourceUtils; import com.taobao.weex.utils.WXUtils; @@ -35,11 +35,10 @@ import com.taobao.weex.utils.WXUtils; public class WXLoadingIndicator extends WXComponent<CircleProgressBar> { - public WXLoadingIndicator(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) { - super(instance, dom, parent, isLazy); + public WXLoadingIndicator(WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) { + super(instance, parent, isLazy, basicComponentData); } - @Override protected CircleProgressBar initComponentHostView(@NonNull Context context) { return new CircleProgressBar(context); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java index 555d895..bf8c99c 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXRefresh.java @@ -25,10 +25,8 @@ import android.text.TextUtils; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; -import com.taobao.weex.dom.ImmutableDomObject; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.component.list.WXListComponent; -import com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList; import com.taobao.weex.ui.view.WXFrameLayout; import com.taobao.weex.ui.view.WXRefreshLayout; import com.taobao.weex.ui.view.refresh.core.WXSwipeLayout; @@ -47,12 +45,12 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres public static final String HIDE = "hide"; @Deprecated - public WXRefresh(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance,dom,parent,isLazy); + public WXRefresh(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, isLazy, basicComponentData); } - public WXRefresh(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) { - super(instance, node, parent, lazy); + public WXRefresh(WXSDKInstance instance, WXVContainer parent, boolean lazy, BasicComponentData basicComponentData) { + super(instance, parent, lazy, basicComponentData); } @Override @@ -71,8 +69,7 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres return; } - ImmutableDomObject dom; - if ((dom = getDomObject())!= null && dom.getEvents().contains(Constants.Event.ONREFRESH)) { + if (getEvents().contains(Constants.Event.ONREFRESH)) { fireEvent(Constants.Event.ONREFRESH); } } @@ -80,12 +77,12 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres @Override public int getLayoutTopOffsetForSibling() { //offset siblings - return getParent() instanceof Scrollable ? -Math.round(getDomObject().getLayoutHeight()) : 0; + return getParent() instanceof Scrollable ? -Math.round(getLayoutHeight()) : 0; } @Override public void onPullingDown(float dy, int pullOutDistance, float viewHeight) { - if (getDomObject().getEvents() != null && getDomObject().getEvents().contains(Constants.Event.ONPULLING_DOWN)) { + if (getEvents() != null && getEvents().contains(Constants.Event.ONPULLING_DOWN)) { Map<String, Object> data = new HashMap<>(); data.put(Constants.Name.DISTANCE_Y, dy); data.put(Constants.Name.PULLING_DISTANCE, pullOutDistance); @@ -110,9 +107,7 @@ public class WXRefresh extends WXBaseRefresh implements WXSwipeLayout.WXOnRefres public void setDisplay(String display) { if (!TextUtils.isEmpty(display)) { if (display.equals(HIDE)) { - if (getParent() instanceof WXRecyclerTemplateList - || getParent() instanceof WXListComponent - || getParent() instanceof WXScroller) { + if (getParent() instanceof WXListComponent || getParent() instanceof WXScroller) { if (((BaseBounceView)getParent().getHostView()).getSwipeLayout().isRefreshing()) { ((BaseBounceView) getParent().getHostView()).finishPullRefresh(); ((BaseBounceView) getParent().getHostView()).onRefreshingComplete(); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java index f21d33b..94845ea 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java @@ -18,6 +18,13 @@ */ package com.taobao.weex.ui.component; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + import android.annotation.TargetApi; import android.content.Context; import android.graphics.Point; @@ -32,7 +39,6 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; - import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; @@ -41,8 +47,8 @@ import com.taobao.weex.common.Constants; import com.taobao.weex.common.ICheckBindingScroller; import com.taobao.weex.common.OnWXScrollListener; import com.taobao.weex.common.WXThread; -import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.ComponentCreator; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.component.helper.ScrollStartEndHelper; import com.taobao.weex.ui.component.helper.WXStickyHelper; import com.taobao.weex.ui.view.IWXScroller; @@ -56,15 +62,6 @@ import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; import com.taobao.weex.utils.WXViewUtils; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -//import com.taobao.weex.ui.WXRecycleImageManager; - /** * Component for scroller. It also support features like * "appear", "disappear" and "sticky" @@ -76,7 +73,8 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL public static final String DIRECTION = "direction"; protected int mOrientation = Constants.Orientation.VERTICAL; private List<WXComponent> mRefreshs=new ArrayList<>(); - private int mChildrenLayoutOffset = 0;//Use for offset children layout + /** Use for offset children layout */ + private int mChildrenLayoutOffset = 0; private boolean mForceLoadmoreNextTime = false; private int mOffsetAccuracy = 10; private Point mLastReport = new Point(-1, -1); @@ -87,11 +85,10 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL * */ private ScrollStartEndHelper mScrollStartEndHelper; - - public static class Creator implements ComponentCreator { - public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException { - return new WXScroller(instance,node,parent); + @Override + public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException { + return new WXScroller(instance, parent, basicComponentData); } } /** @@ -112,15 +109,13 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL private boolean isScrollable = true; - @Deprecated - public WXScroller(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance,dom,parent); + public WXScroller(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, basicComponentData); } - public WXScroller(WXSDKInstance instance, WXDomObject node, - WXVContainer parent) { - super(instance, node, parent); + public WXScroller(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { + super(instance, parent, basicComponentData); stickyHelper = new WXStickyHelper(this); } @@ -147,8 +142,9 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL * @return ScrollView */ public ViewGroup getInnerView() { - if(getHostView() == null) + if(getHostView() == null) { return null; + } if (getHostView() instanceof BounceScrollerView) { return ((BounceScrollerView) getHostView()).getInnerView(); } else { @@ -167,7 +163,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL @Override public void onScrollChanged(WXScrollView scrollView, int x, int y, int oldx, int oldy) { getScrollStartEndHelper().onScrolled(x, y); - if(!getDomObject().getEvents().contains(Constants.Event.SCROLL)){ + if(!getEvents().contains(Constants.Event.SCROLL)){ return; } if (shouldReport(x, y)) { @@ -195,7 +191,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL @Override public void onScrollChanged(WXHorizontalScrollView scrollView, int x, int y, int oldx, int oldy) { getScrollStartEndHelper().onScrolled(x, y); - if(!getDomObject().getEvents().contains(Constants.Event.SCROLL)){ + if(!getEvents().contains(Constants.Event.SCROLL)){ return; } if (shouldReport(x, y)) { @@ -214,7 +210,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL public Map<String, Object> getScrollEvent(int x, int y){ Rect contentFrame = new Rect(); if (getInnerView() instanceof WXScrollView) { - contentFrame = ((WXScrollView) getInnerView()).getContentFrame(); + contentFrame = ((WXScrollView) getInnerView()).getContentFrame(); }else if (getInnerView() instanceof WXHorizontalScrollView) { contentFrame = ((WXHorizontalScrollView) getInnerView()).getContentFrame(); } @@ -283,6 +279,16 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL @Override protected int getChildrenLayoutTopOffset() { + if (mChildrenLayoutOffset == 0) { + // Child LayoutSize data set after call Layout. So init mChildrenLayoutOffset here + final int listSize = mRefreshs.size(); + if (listSize > 0) { + for (int i = 0; i < listSize; i++) { + WXComponent child = mRefreshs.get(i); + mChildrenLayoutOffset += child.getLayoutTopOffsetForSibling(); + } + } + } return mChildrenLayoutOffset; } @@ -291,14 +297,12 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL */ @Override public void addChild(WXComponent child, int index) { - mChildrenLayoutOffset += child.getLayoutTopOffsetForSibling(); if (child instanceof WXBaseRefresh) { - if (!checkRefreshOrLoading(child)) { + if (checkRefreshOrLoading(child)) { mRefreshs.add(child); } } - - super.addChild(child,index); + super.addChild(child, index); } /** @@ -317,6 +321,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL } }); handler.postDelayed(runnable,100); + result = true; } if (child instanceof WXLoading && getHostView() !=null) { @@ -364,13 +369,13 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL int screenW = WXViewUtils.getScreenWidth(WXEnvironment.sApplication); int weexW = WXViewUtils.getWeexWidth(getInstanceId()); measureOutput.width = width > (weexW >= screenW ? screenW : weexW) ? FrameLayout.LayoutParams.MATCH_PARENT - : width; + : width; measureOutput.height = height; } else { int screenH = WXViewUtils.getScreenHeight(WXEnvironment.sApplication); int weexH = WXViewUtils.getWeexHeight(getInstanceId()); measureOutput.height = height > (weexH >= screenH ? screenH : weexH) ? FrameLayout.LayoutParams.MATCH_PARENT - : height; + : height; measureOutput.width = width; } return measureOutput; @@ -379,10 +384,10 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL @Override protected ViewGroup initComponentHostView(@NonNull Context context) { String scroll; - if (getDomObject() == null || getDomObject().getAttrs().isEmpty()) { + if (getAttrs().isEmpty()) { scroll = "vertical"; } else { - scroll = getDomObject().getAttrs().getScrollDirection(); + scroll = getAttrs().getScrollDirection(); } ViewGroup host; @@ -397,7 +402,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL } }); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( - LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); scrollView.addView(mRealView, layoutParams); scrollView.setHorizontalScrollBarEnabled(false); @@ -409,10 +414,10 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL WXScrollView innerView = scrollerView.getInnerView(); innerView.addScrollViewListener(this); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( - LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); innerView.addView(mRealView, layoutParams); innerView.setVerticalScrollBarEnabled(true); - innerView.setNestedScrollingEnabled(WXUtils.getBoolean(getDomObject().getAttrs().get(Constants.Name.NEST_SCROLLING_ENABLED), true)); + innerView.setNestedScrollingEnabled(WXUtils.getBoolean(getAttrs().get(Constants.Name.NEST_SCROLLING_ENABLED), true)); innerView.addScrollViewListener(new WXScrollViewListener() { @Override public void onScrollChanged(WXScrollView scrollView, int x, int y, int oldx, int oldy) { @@ -500,8 +505,9 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL switch (key) { case Constants.Name.SHOW_SCROLLBAR: Boolean result = WXUtils.getBoolean(param,null); - if (result != null) + if (result != null) { setShowScrollbar(result); + } return true; case Constants.Name.SCROLLABLE: boolean scrollable = WXUtils.getBoolean(param, true); @@ -511,6 +517,8 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL int accuracy = WXUtils.getInteger(param, 10); setOffsetAccuracy(accuracy); return true; + default: + break; } return super.setProperty(key, param); } @@ -550,7 +558,6 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL } - // TODO Need constrain, each container can only have one sticky child @Override public void bindStickStyle(WXComponent component) { stickyHelper.bindStickStyle(component,mStickyMap); @@ -578,7 +585,8 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL item.setWatchEvent(event,isWatch); - procAppear(0,0,0,0);//check current components appearance status. + //check current components appearance status. + procAppear(0,0,0,0); } /** @@ -642,7 +650,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL return; } - getInnerView().postDelayed(WXThread.secure(new Runnable() { + getInnerView().postDelayed(new Runnable() { @Override public void run() { if (mOrientation == Constants.Orientation.VERTICAL) { @@ -660,7 +668,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL } getInnerView().invalidate(); } - }), 16); + }, 16); } @Override @@ -721,7 +729,7 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL */ protected void onLoadMore(WXScrollView scrollView, int x, int y) { try { - String offset = getDomObject().getAttrs().getLoadMoreOffset(); + String offset = getAttrs().getLoadMoreOffset(); if (TextUtils.isEmpty(offset)) { return; } @@ -751,7 +759,6 @@ public class WXScroller extends WXVContainer<ViewGroup> implements WXScrollViewL mForceLoadmoreNextTime = true; } - public ScrollStartEndHelper getScrollStartEndHelper() { if(mScrollStartEndHelper == null){ mScrollStartEndHelper = new ScrollStartEndHelper(this); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java index fb1f487..cee6520 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java @@ -29,14 +29,15 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; + import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.WXSDKManager; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; -import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.dom.WXEvent; import com.taobao.weex.ui.ComponentCreator; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.view.WXCircleIndicator; import com.taobao.weex.ui.view.WXCirclePageAdapter; import com.taobao.weex.ui.view.WXCircleViewPager; @@ -44,6 +45,7 @@ import com.taobao.weex.ui.view.gesture.WXGestureType; import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; import com.taobao.weex.utils.WXViewUtils; + import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; @@ -64,8 +66,8 @@ public class WXSlider extends WXVContainer<FrameLayout> { private boolean keepIndex = false; public static class Creator implements ComponentCreator { - public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException { - return new WXSlider(instance, node, parent); + public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException { + return new WXSlider(instance, parent, basicComponentData); } } @@ -91,20 +93,20 @@ public class WXSlider extends WXVContainer<FrameLayout> { protected OnPageChangeListener mPageChangeListener = new SliderPageChangeListener(); @Deprecated - public WXSlider(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance, dom, parent); + public WXSlider(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, basicComponentData); } - public WXSlider(WXSDKInstance instance, WXDomObject node, WXVContainer parent) { - super(instance, node, parent); + public WXSlider(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { + super(instance, parent, basicComponentData); } @Override protected FrameLayout initComponentHostView(@NonNull Context context) { FrameLayout view = new FrameLayout(context); // init view pager - if (getDomObject() != null && getDomObject().getAttrs() != null) { - Object obj = getDomObject().getAttrs().get(INFINITE); + if (getAttrs() != null) { + Object obj = getAttrs().get(INFINITE); isInfinite = WXUtils.getBoolean(obj, true); } FrameLayout.LayoutParams pagerParams = new FrameLayout.LayoutParams( @@ -130,7 +132,7 @@ public class WXSlider extends WXVContainer<FrameLayout> { */ @Override public LayoutParams getChildLayoutParams(WXComponent child,View childView, int width, int height, int left, int right, int top, int bottom) { - ViewGroup.LayoutParams lp = childView == null ? null : childView.getLayoutParams(); + ViewGroup.LayoutParams lp = childView.getLayoutParams(); if (lp == null) { lp = new FrameLayout.LayoutParams(width, height); } else { @@ -408,11 +410,11 @@ public class WXSlider extends WXVContainer<FrameLayout> { return; } - if (getDomObject().getEvents().size() == 0) { + if (getEvents().size() == 0) { return; } - WXEvent event = getDomObject().getEvents(); - String ref = getDomObject().getRef(); + WXEvent event = getEvents(); + String ref = getRef(); if (event.contains(Constants.Event.CHANGE) && WXViewUtils.onScreenArea(getHostView())) { params.put(INDEX, realPosition); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java index 0899c8d..a7e95d0 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java @@ -29,8 +29,8 @@ import android.widget.FrameLayout; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.common.WXThread; -import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.ComponentCreator; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.view.WXCircleIndicator; import com.taobao.weex.ui.view.WXCirclePageAdapter; import com.taobao.weex.ui.view.WXCircleViewPager; @@ -63,13 +63,13 @@ public class WXSliderNeighbor extends WXSlider { private ZoomTransformer mCachedTransformer; - public WXSliderNeighbor(WXSDKInstance instance, WXDomObject node, WXVContainer parent) { - super(instance, node, parent); + public WXSliderNeighbor(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { + super(instance, parent, basicComponentData); } public static class Creator implements ComponentCreator { - public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException { - return new WXSliderNeighbor(instance, node, parent); + public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException { + return new WXSliderNeighbor(instance, parent, basicComponentData); } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java index 27e4c95..a617507 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSwitch.java @@ -20,13 +20,17 @@ package com.taobao.weex.ui.component; import android.content.Context; import android.support.annotation.NonNull; +import android.view.View; import android.widget.CompoundButton; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.layout.ContentBoxMeasurement; +import com.taobao.weex.layout.MeasureSize; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.view.WXSwitchView; +import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; import java.util.HashMap; @@ -37,18 +41,48 @@ import java.util.Map; public class WXSwitch extends WXComponent<WXSwitchView> { private CompoundButton.OnCheckedChangeListener mListener; - private String mTrackTintColorNormal; - private String mTrackTintColorActivated; - private String mThumbTintColorNormal; - private String mThumbTintColorActivated; @Deprecated - public WXSwitch(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance, dom, parent, isLazy); + public WXSwitch(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, isLazy, basicComponentData); } - public WXSwitch(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) { - super(instance, dom, parent, isLazy); + public WXSwitch(final WXSDKInstance instance, WXVContainer parent, boolean isLazy, BasicComponentData basicComponentData) { + super(instance, parent, isLazy, basicComponentData); + setContentBoxMeasurement(new ContentBoxMeasurement() { + /** uiThread = false **/ + @Override + public void measureInternal(float width, float height, int widthMeasureMode, int heightMeasureMode) { + try { + WXSwitchView wxSwitchView = new WXSwitchView(instance.getContext()); + int widthSpec, heightSpec; + heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + if (Float.isNaN(width)) { + widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + } else { + widthSpec = View.MeasureSpec.makeMeasureSpec((int) width, View.MeasureSpec.AT_MOST); + } + + wxSwitchView.measure(widthSpec, heightSpec); + mMeasureWidth = wxSwitchView.getMeasuredWidth(); + mMeasureHeight = wxSwitchView.getMeasuredHeight(); + } catch (RuntimeException e) { + WXLogUtils.e(WXLogUtils.getStackTrace(e)); + } + mMeasureWidth = 0; + mMeasureHeight = 0; + } + + /** uiThread = false **/ + @Override + public void layoutBefore() { + } + + /** uiThread = false **/ + @Override + public void layoutAfter(float computedWidth, float computedHeight) { + } + }); } @Override @@ -97,22 +131,6 @@ public class WXSwitch extends WXComponent<WXSwitchView> { setChecked(result); } return true; - case Constants.Name.THUMB_TINT_COLOR: - mThumbTintColorNormal = WXUtils.getString(param, null); - setThumbColor(); - return true; - case Constants.Name.ON_THUMB_TINT_COLOR: - mThumbTintColorActivated = WXUtils.getString(param, null); - setThumbColor(); - return true; - case Constants.Name.TINT_COLOR: - mTrackTintColorNormal = WXUtils.getString(param, null); - setTrackColor(); - return true; - case Constants.Name.ON_TINT_COLOR: - mTrackTintColorActivated = WXUtils.getString(param, null); - setTrackColor(); - return true; } return super.setProperty(key, param); } @@ -123,12 +141,4 @@ public class WXSwitch extends WXComponent<WXSwitchView> { getHostView().setChecked(checked); getHostView().setOnCheckedChangeListener(mListener); } - - private void setThumbColor() { - getHostView().setThumbColor(mThumbTintColorNormal, mThumbTintColorActivated); - } - - private void setTrackColor() { - getHostView().setTrackColor(mTrackTintColorNormal, mTrackTintColorActivated); - } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java index bb1bd4b..5376d12 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXText.java @@ -18,21 +18,62 @@ */ package com.taobao.weex.ui.component; +import static com.taobao.weex.dom.WXStyle.UNSET; +import static com.taobao.weex.utils.WXUtils.isUndefined; + +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.os.Build; +import android.os.Looper; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.content.LocalBroadcastManager; +import android.text.Editable; import android.text.Layout; - +import android.text.Spannable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.SpannedString; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.AlignmentSpan; +import android.text.style.ForegroundColorSpan; +import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.annotation.Component; import com.taobao.weex.common.Constants; -import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.dom.TextDecorationSpan; +import com.taobao.weex.dom.WXAttr; +import com.taobao.weex.dom.WXCustomStyleSpan; +import com.taobao.weex.dom.WXLineHeightSpan; +import com.taobao.weex.dom.WXStyle; +import com.taobao.weex.layout.ContentBoxMeasurement; +import com.taobao.weex.layout.MeasureMode; +import com.taobao.weex.layout.MeasureSize; +import com.taobao.weex.layout.measurefunc.TextContentBoxMeasurement; import com.taobao.weex.ui.ComponentCreator; +import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.flat.FlatComponent; import com.taobao.weex.ui.flat.widget.TextWidget; import com.taobao.weex.ui.view.WXTextView; -import com.taobao.weex.utils.WXUtils; - +import com.taobao.weex.utils.FontDO; +import com.taobao.weex.utils.TypefaceUtil; +import com.taobao.weex.utils.WXDomUtils; +import com.taobao.weex.utils.WXLogUtils; +import com.taobao.weex.utils.WXResourceUtils; import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; /** * Text component @@ -46,10 +87,15 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex * The default text size **/ public static final int sDEFAULT_SIZE = 32; + private BroadcastReceiver mTypefaceObserver; + private String mFontFamily; @Override public boolean promoteToView(boolean checkAncestor) { - return getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXText.class); + if (null != getInstance().getFlatUIContext()) { + return getInstance().getFlatUIContext().promoteToView(this, checkAncestor, WXText.class); + } + return false; } @Override @@ -67,31 +113,32 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex } public static class Creator implements ComponentCreator { - - public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException { - return new WXText(instance, node, parent); + public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException { + return new WXText(instance, parent, basicComponentData); } } @Deprecated - public WXText(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { - this(instance, dom, parent); + public WXText(WXSDKInstance instance, WXVContainer parent, String instanceId, boolean isLazy, BasicComponentData basicComponentData) { + this(instance, parent, basicComponentData); } - public WXText(WXSDKInstance instance, WXDomObject node, - WXVContainer parent) { - super(instance, node, parent); + public WXText(WXSDKInstance instance, + WXVContainer parent, BasicComponentData basicComponentData) { + super(instance, parent, basicComponentData); + setContentBoxMeasurement(new TextContentBoxMeasurement(this)); } @Override protected WXTextView initComponentHostView(@NonNull Context context) { - WXTextView textView =new WXTextView(context); + WXTextView textView = new WXTextView(context); textView.holdComponent(this); return textView; } @Override public void updateExtra(Object extra) { + super.updateExtra(extra); if(extra instanceof Layout) { final Layout layout = (Layout) extra; if (!promoteToView(true)) { @@ -106,7 +153,7 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex @Override protected void setAriaLabel(String label) { WXTextView text = getHostView(); - if(text != null){ + if (text != null) { text.setAriaLabel(label); } } @@ -115,7 +162,7 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex public void refreshData(WXComponent component) { super.refreshData(component); if (component instanceof WXText) { - updateExtra(component.getDomObject().getExtra()); + updateExtra(component.getExtra()); } } @@ -134,11 +181,8 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex case Constants.Name.VALUE: return true; case Constants.Name.FONT_FAMILY: - return true; - case Constants.Name.ENABLE_COPY: - boolean enabled = WXUtils.getBoolean(param, false); - if (getHostView() != null) { - getHostView().enableCopy(enabled); + if (param != null) { + registerTypefaceObserver(param.toString()); } return true; default: @@ -167,6 +211,47 @@ public class WXText extends WXComponent<WXTextView> implements FlatComponent<Tex @Override public void destroy() { super.destroy(); + if (WXEnvironment.getApplication() != null && mTypefaceObserver != null) { + WXLogUtils.d("WXText", "Unregister the typeface observer"); + LocalBroadcastManager.getInstance(WXEnvironment.getApplication()).unregisterReceiver(mTypefaceObserver); + mTypefaceObserver = null; + } } + private void registerTypefaceObserver(String desiredFontFamily) { + if (WXEnvironment.getApplication() == null) { + WXLogUtils.w("WXText", "ApplicationContent is null on register typeface observer"); + return; + } + mFontFamily = desiredFontFamily; + if (mTypefaceObserver != null) { + return; + } + + mTypefaceObserver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String fontFamily = intent.getStringExtra("fontFamily"); + if (!mFontFamily.equals(fontFamily)) { + return; + } + + FontDO fontDO = TypefaceUtil.getFontDO(fontFamily); + if (fontDO != null && fontDO.getTypeface() != null && getHostView() != null) { + WXTextView hostView = getHostView(); + Layout layout = hostView.getTextLayout(); + if (layout != null) { + layout.getPaint().setTypeface(fontDO.getTypeface()); + WXLogUtils.d("WXText", "Apply font family " + fontFamily + " to paint"); + } else { + WXLogUtils.w("WXText", "Layout not created"); + } + hostView.invalidate(); + } + WXLogUtils.d("WXText", "Font family " + fontFamily + " is available"); + } + }; + + LocalBroadcastManager.getInstance(WXEnvironment.getApplication()).registerReceiver(mTypefaceObserver, new IntentFilter(TypefaceUtil.ACTION_TYPE_FACE_AVAILABLE)); + } }
