[WEEX-376][Android] Fix div layeroverflow event
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/2a757359 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/2a757359 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/2a757359 Branch: refs/heads/master Commit: 2a7573591eb0bd563ed2e2a5bc13baa52dd16937 Parents: 4dd5b4f Author: miomin <[email protected]> Authored: Tue May 22 15:02:46 2018 +0800 Committer: miomin <[email protected]> Committed: Tue May 22 15:14:00 2018 +0800 ---------------------------------------------------------------------- .../java/com/taobao/weex/WXSDKInstance.java | 21 +++++++++++++++ .../java/com/taobao/weex/common/Constants.java | 6 +++++ .../taobao/weex/ui/component/WXComponent.java | 19 ++++++++++++- .../com/taobao/weex/ui/component/WXEmbed.java | 13 ++++++++- .../taobao/weex/ui/component/WXVContainer.java | 10 ------- .../com/taobao/weex/ui/view/WXFrameLayout.java | 28 +++++++++++++++++++- .../Source/android/base/string/string_utils.h | 2 ++ weex_core/Source/core/render/node/render_list.h | 3 --- 8 files changed, 86 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java index 5abad4a..a75092d 100644 --- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java +++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java @@ -162,6 +162,23 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan private List<OnWXScrollListener> mWXScrollListeners; + private List<String> mLayerOverFlowListeners; + + public List<String> getLayerOverFlowListeners() { + return mLayerOverFlowListeners; + } + + public void addLayerOverFlowListener(String ref) { + if (mLayerOverFlowListeners == null) + mLayerOverFlowListeners = new ArrayList<>(); + mLayerOverFlowListeners.add(ref); + } + + public void removeLayerOverFlowListener(String ref) { + if (mLayerOverFlowListeners != null) + mLayerOverFlowListeners.remove(ref); + } + /** * whether we are in preRender mode * */ @@ -1339,6 +1356,10 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan mComponentObserver = null; } + if (mLayerOverFlowListeners != null) { + mLayerOverFlowListeners.clear(); + } + getFlatUIContext().destroy(); mFlatGUIContext = null; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/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 c5c8cb9..fdf5e82 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 @@ -26,6 +26,12 @@ public class Constants { int VERTICAL = 1; } + public interface Weex { + String REF = "ref"; + String INSTANCEID = "instanceid"; + String TYPE = "type"; + } + public interface Name { String DEFAULT_WIDTH = "defaultWidth"; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/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 74a81fd..e5a7660 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 @@ -65,7 +65,6 @@ import android.support.v4.view.AccessibilityDelegateCompat; import android.support.v4.view.ViewCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.text.TextUtils; -import android.util.Log; import android.util.Pair; import android.view.Menu; import android.view.View; @@ -304,6 +303,10 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple return; } final View view = getRealView(); + + if (type.equals(Constants.Event.LAYEROVERFLOW)) + addLayerOverFlowListener(getRef()); + if (type.equals(Constants.Event.CLICK)) { if (view == null) { // wait next time to add. @@ -1402,6 +1405,10 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple if (getEvents() == null || mAppendEvents == null || mGestureType == null) { return; } + + if (type.equals(Constants.Event.LAYEROVERFLOW)) + removeLayerOverFlowListener(getRef()); + getEvents().remove(type); mAppendEvents.remove(type);//only clean append events, not dom's events. mGestureType.remove(type); @@ -2276,4 +2283,14 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple updateNativeStyle(objectEntry.getKey(), objectEntry.getValue()); } } + + public void addLayerOverFlowListener(String ref) { + if (getInstance() != null) + getInstance().addLayerOverFlowListener(ref); + } + + public void removeLayerOverFlowListener(String ref) { + if (getInstance() != null) + getInstance().removeLayerOverFlowListener(ref); + } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/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 254b3dc..3160172 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 @@ -20,7 +20,6 @@ package com.taobao.weex.ui.component; import android.annotation.SuppressLint; import android.text.TextUtils; -import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -501,4 +500,16 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis + " strategy " + this.strategy); } } + + @Override + public void addLayerOverFlowListener(String ref) { + if (mNestedInstance != null) + mNestedInstance.addLayerOverFlowListener(getRef()); + } + + @Override + public void removeLayerOverFlowListener(String ref) { + if (mNestedInstance != null) + mNestedInstance.removeLayerOverFlowListener(ref); + } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java index 85dfbf2..88c9818 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java @@ -351,16 +351,6 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> { } } - public void notifyLayerOverFlow() { - if (containsEvent(Constants.Event.LAYEROVERFLOW)) { - Map<String, Object> params = new HashMap<>(); - params.put("ref", getRef()); - params.put("instanceid", getInstanceId()); - fireEvent(Constants.Event.LAYEROVERFLOW, params); - } - } - - /******************************************************** * begin hook Activity life cycle callback * ********************************************************/ http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java index e1c375a..551a0e2 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java @@ -28,7 +28,11 @@ import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; +import com.taobao.weex.WXSDKInstance; +import com.taobao.weex.WXSDKManager; +import com.taobao.weex.common.Constants; import com.taobao.weex.common.WXErrorCode; +import com.taobao.weex.ui.component.WXComponent; import com.taobao.weex.ui.component.WXDiv; import com.taobao.weex.ui.flat.widget.Widget; import com.taobao.weex.ui.view.gesture.WXGesture; @@ -37,7 +41,9 @@ import com.taobao.weex.utils.WXExceptionUtils; import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXViewUtils; import java.lang.ref.WeakReference; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * FrameLayout wrapper @@ -105,7 +111,7 @@ public class WXFrameLayout extends FrameLayout implements WXGestureObservable,IR dispatchDrawInterval(canvas); } catch (Throwable e) { if (getComponent() != null) { - getComponent().notifyLayerOverFlow(); + notifyLayerOverFlow(); reportLayerOverFlowError(); } WXLogUtils.e("Layer overflow limit error", WXLogUtils.getStackTrace(e)); @@ -145,4 +151,24 @@ public class WXFrameLayout extends FrameLayout implements WXGestureObservable,IR } return deep; } + + public void notifyLayerOverFlow() { + if (getComponent() == null) + return; + + WXSDKInstance instance = getComponent().getInstance(); + if (instance == null) + return; + + if (instance.getLayerOverFlowListeners() == null) + return; + + for (String ref : instance.getLayerOverFlowListeners()) { + WXComponent component = WXSDKManager.getInstance().getWXRenderManager().getWXComponent(instance.getInstanceId(), ref); + Map<String, Object> params = new HashMap<>(); + params.put(Constants.Weex.REF, ref); + params.put(Constants.Weex.INSTANCEID, component.getInstanceId()); + component.fireEvent(Constants.Event.LAYEROVERFLOW, params); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/weex_core/Source/android/base/string/string_utils.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/base/string/string_utils.h b/weex_core/Source/android/base/string/string_utils.h index aeda0c5..8c51873 100644 --- a/weex_core/Source/android/base/string/string_utils.h +++ b/weex_core/Source/android/base/string/string_utils.h @@ -58,6 +58,8 @@ static inline std::string jString2Str(JNIEnv *env, const jstring &jstr) { } static inline std::string jString2StrFast(JNIEnv *env, const jstring &jstr){ + if (jstr == nullptr) + return std::string(""); const char *nativeString = env->GetStringUTFChars(jstr, JNI_FALSE); return std::string(nativeString); } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2a757359/weex_core/Source/core/render/node/render_list.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/node/render_list.h b/weex_core/Source/core/render/node/render_list.h index a1cb190..25b6ed0 100644 --- a/weex_core/Source/core/render/node/render_list.h +++ b/weex_core/Source/core/render/node/render_list.h @@ -196,7 +196,6 @@ namespace WeexCore { } if(mColumnWidth != 0 && !isnan(mColumnWidth)) { - //LOGE("listen child->ApplyStyle %s %s", child->Ref().c_str(), std::to_string(mColumnWidth).c_str()); AddRenderObjectWidth(child, false); } return index; @@ -241,8 +240,6 @@ namespace WeexCore { int count = getChildCount(); for (Index i = 0; i < count; i++) { RenderObject *child = GetChild(i); - //LOGE("listen child->UpdateAttr %s %s", child->Ref().c_str(), std::to_string(mColumnWidth).c_str()); - // ApplyStyle(WIDTH, std::to_string(mColumnWidth)); AddRenderObjectWidth(this, true); } }
