* [Core] Add callback for append tree createfinish.
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/b2d22b9a Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b2d22b9a Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b2d22b9a Branch: refs/heads/master Commit: b2d22b9a436a13d48a6fb499380b65488ba86492 Parents: 9689fae Author: miomin <691292...@qq.com> Authored: Wed May 2 18:09:53 2018 +0800 Committer: YorkShen <shenyua...@gmail.com> Committed: Mon May 7 15:52:09 2018 +0800 ---------------------------------------------------------------------- .../java/com/taobao/weex/bridge/WXBridge.java | 11 +++++ .../com/taobao/weex/bridge/WXBridgeManager.java | 36 ++++++++++++--- .../java/com/taobao/weex/common/IWXBridge.java | 2 + .../GraphicActionAppendTreeCreateFinish.java | 47 ++++++++++++++++++++ .../taobao/weex/ui/component/WXVContainer.java | 5 +++ weex_core/Source/CMakeLists.txt | 1 + .../android/bridge/impl/bridge_impl_android.cpp | 25 +++++++++++ .../android/bridge/impl/bridge_impl_android.h | 2 + weex_core/Source/core/bridge/bridge.h | 2 + weex_core/Source/core/css/constants_name.h | 1 + .../render_action_appendtree_createfinish.cpp | 14 ++++++ .../render_action_appendtree_createfinish.h | 21 +++++++++ .../Source/core/render/node/render_object.h | 8 ++++ .../Source/core/render/page/render_page.cpp | 22 +++++++-- weex_core/Source/core/render/page/render_page.h | 4 +- 15 files changed, 191 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/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 0ea12f4..a0023f5 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 @@ -482,6 +482,17 @@ public class WXBridge implements IWXBridge { } @Override + public int callAppendTreeCreateFinish(String instanceId, String ref) { + int errorCode = IWXBridge.INSTANCE_RENDERING; + try { + errorCode = WXBridgeManager.getInstance().callAppendTreeCreateFinish(instanceId, ref); + } catch (Throwable e) { + WXLogUtils.e(TAG, "callAppendTreeCreateFinish throw exception:" + e.getMessage()); + } + return errorCode; + } + + @Override public int callHasTransitionPros(String instanceId, String ref, HashMap<String, String> styles) { int errorCode = IWXBridge.INSTANCE_RENDERING; try { http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/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 c394ef4..611260e 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 @@ -59,6 +59,7 @@ import com.taobao.weex.ui.action.ActionReloadPage; import com.taobao.weex.ui.action.BasicGraphicAction; import com.taobao.weex.ui.action.GraphicActionAddElement; import com.taobao.weex.ui.action.GraphicActionAddEvent; +import com.taobao.weex.ui.action.GraphicActionAppendTreeCreateFinish; import com.taobao.weex.ui.action.GraphicActionCreateBody; import com.taobao.weex.ui.action.GraphicActionCreateFinish; import com.taobao.weex.ui.action.GraphicActionLayout; @@ -2538,7 +2539,7 @@ public class WXBridgeManager implements Callback, BactchExecutor { } catch (Exception e) { WXLogUtils.e("[WXBridgeManager] callLayout exception: ", e); WXExceptionUtils.commitCriticalExceptionRT(pageId, - WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callUpdateAttrs", + WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callLayout", WXLogUtils.getStackTrace(e), null); } @@ -2546,6 +2547,31 @@ public class WXBridgeManager implements Callback, BactchExecutor { return IWXBridge.INSTANCE_RENDERING; } + public int callAppendTreeCreateFinish(String instanceId, String ref) { + if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) { + mLodBuilder.append("[WXBridgeManager] callAppendTreeCreateFinish >>>> instanceId:").append(instanceId) + .append(", ref:").append(ref); + WXLogUtils.d(mLodBuilder.substring(0)); + mLodBuilder.setLength(0); + } + + if (mDestroyedInstanceId != null && mDestroyedInstanceId.contains(instanceId)) { + return IWXBridge.DESTROY_INSTANCE; + } + + try { + GraphicActionAppendTreeCreateFinish action = new GraphicActionAppendTreeCreateFinish(instanceId, ref); + WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(instanceId, action); + } catch (Exception e) { + WXLogUtils.e("[WXBridgeManager] callAppendTreeCreateFinish exception: ", e); + WXExceptionUtils.commitCriticalExceptionRT(instanceId, + WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAppendTreeCreateFinish", + WXLogUtils.getStackTrace(e), null); + } + + return IWXBridge.INSTANCE_RENDERING; + } + public int callCreateFinish(String instanceId) { if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) { mLodBuilder.append("[WXBridgeManager] callCreateFinish >>>> instanceId:").append(instanceId); @@ -2561,14 +2587,14 @@ public class WXBridgeManager implements Callback, BactchExecutor { long start = System.currentTimeMillis(); WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId); if (instance != null) { - instance.firstScreenCreateInstanceTime(start); - GraphicActionCreateFinish action = new GraphicActionCreateFinish(instanceId); - WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(instanceId, action); + instance.firstScreenCreateInstanceTime(start); + GraphicActionCreateFinish action = new GraphicActionCreateFinish(instanceId); + WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(instanceId, action); } } catch (Exception e) { WXLogUtils.e("[WXBridgeManager] callCreateFinish exception: ", e); WXExceptionUtils.commitCriticalExceptionRT(instanceId, - WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callUpdateFinish", + WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callCreateFinish", WXLogUtils.getStackTrace(e), null); } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/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 6f9fa9e..05e2907 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 @@ -149,6 +149,8 @@ public interface IWXBridge extends IWXObject { int callCreateFinish(String instanceId); + int callAppendTreeCreateFinish(String instanceId, String ref); + int callHasTransitionPros(String instanceId, String ref, HashMap<String, String> styles); void bindMeasurementToWXCore(String instanceId, String ref, ContentBoxMeasurement contentBoxMeasurement); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAppendTreeCreateFinish.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAppendTreeCreateFinish.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAppendTreeCreateFinish.java new file mode 100644 index 0000000..eb9d189 --- /dev/null +++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAppendTreeCreateFinish.java @@ -0,0 +1,47 @@ +/** + * 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 com.taobao.weex.WXSDKInstance; +import com.taobao.weex.WXSDKManager; +import com.taobao.weex.common.WXRenderStrategy; +import com.taobao.weex.ui.component.WXComponent; +import com.taobao.weex.ui.component.WXVContainer; + +/** + * Created by listen on 18/01/09. + */ +public class GraphicActionAppendTreeCreateFinish extends BasicGraphicAction { + + WXComponent component; + + public GraphicActionAppendTreeCreateFinish(String instanceId, String ref) { + super(instanceId, ref); + + component = WXSDKManager.getInstance().getWXRenderManager().getWXComponent(instanceId, ref); + if (null != component && component instanceof WXVContainer) { + ((WXVContainer)component).appendTreeCreateFinish(); + } + } + + @Override + public void executeAction() { + + } +} http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/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 45aa7ea..5d18cd5 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 @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.support.annotation.Nullable; import android.support.v4.view.ViewCompat; +import android.util.Log; import android.util.Pair; import android.view.Menu; import android.view.View; @@ -607,4 +608,8 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> { super(context); } } + + public void appendTreeCreateFinish() { + + } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt index 36e7004..5c7d379 100644 --- a/weex_core/Source/CMakeLists.txt +++ b/weex_core/Source/CMakeLists.txt @@ -52,6 +52,7 @@ add_library(weexjsc SHARED ./core/render/action/render_action_move_element.cpp ./core/render/action/render_action_createbody.cpp ./core/render/action/render_action_createfinish.cpp + ./core/render/action/render_action_appendtree_createfinish.cpp ./core/render/action/render_action_layout.cpp ./core/render/action/render_action_update_attr.cpp ./core/render/action/render_action_update_style.cpp http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp index f713d3c..9e0dc9b 100644 --- a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp +++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp @@ -53,6 +53,7 @@ static jmethodID jCallHasTransitionProsMethodId; static jmethodID jCallUpdateAttrsMethodId; static jmethodID jCallLayoutMethodId; static jmethodID jCallCreateFinishMethodId; +static jmethodID jCallAppendTreeCreateFinishMethodId; static jmethodID jPostMessage; static jmethodID jDispatchMeaasge; @@ -849,6 +850,30 @@ namespace WeexCore { return flag; } + int Bridge_Impl_Android::callAppendTreeCreateFinish(const char *pageId, const char *ref) { + JNIEnv *env = getJNIEnv(); + jstring jPageId = env->NewStringUTF(pageId); + jstring jRef = env->NewStringUTF(ref); + + if (jCallAppendTreeCreateFinishMethodId == NULL) + jCallAppendTreeCreateFinishMethodId = env->GetMethodID(jBridgeClazz, + "callAppendTreeCreateFinish", + "(Ljava/lang/String;Ljava/lang/String;)I"); + + int flag = 0; + flag = env->CallIntMethod(jThis, jCallAppendTreeCreateFinishMethodId, jPageId, jRef); + + if (flag == -1) { + LOGE("instance destroy JFM must stop callAppendTreeCreateFinish"); + } + + if (jPageId != nullptr) + env->DeleteLocalRef(jPageId); + if (jRef != nullptr) + env->DeleteLocalRef(jRef); + return flag; + } + int Bridge_Impl_Android::callHasTransitionPros(const char* pageId, const char* ref, std::vector<std::pair<std::string, std::string>> *style) { JNIEnv *env = getJNIEnv(); jstring jPageId = env->NewStringUTF(pageId); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/android/bridge/impl/bridge_impl_android.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.h b/weex_core/Source/android/bridge/impl/bridge_impl_android.h index c086b5b..3f73370 100644 --- a/weex_core/Source/android/bridge/impl/bridge_impl_android.h +++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.h @@ -122,6 +122,8 @@ namespace WeexCore { int callCreateFinish(const char* pageId); + int callAppendTreeCreateFinish(const char* pageId, const char* ref); + int callHasTransitionPros(const char* pageId, const char* ref, std::vector<std::pair<std::string, std::string>> *style); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/core/bridge/bridge.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/bridge/bridge.h b/weex_core/Source/core/bridge/bridge.h index cf9ec81..9261445 100644 --- a/weex_core/Source/core/bridge/bridge.h +++ b/weex_core/Source/core/bridge/bridge.h @@ -94,6 +94,8 @@ namespace WeexCore { virtual int callRemoveElement(const char* pageId, const char* ref) = 0; virtual int callMoveElement(const char* pageId, const char* ref, const char* parentRef, int index) = 0; + + virtual int callAppendTreeCreateFinish(const char* pageId, const char* ref) = 0; }; } //end WeexCore #endif //Bridge_h http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/core/css/constants_name.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/css/constants_name.h b/weex_core/Source/core/css/constants_name.h index 58ecbcd..29bcb15 100644 --- a/weex_core/Source/core/css/constants_name.h +++ b/weex_core/Source/core/css/constants_name.h @@ -76,6 +76,7 @@ namespace WeexCore { constexpr char COLOR[] = "color"; constexpr char BACKGROUND_COLOR[] = "backgroundColor"; + constexpr char APPEND[] = "append"; } #endif //WEEXV8_CONSTANTSNAME_H http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/core/render/action/render_action_appendtree_createfinish.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/action/render_action_appendtree_createfinish.cpp b/weex_core/Source/core/render/action/render_action_appendtree_createfinish.cpp new file mode 100644 index 0000000..9dbaeee --- /dev/null +++ b/weex_core/Source/core/render/action/render_action_appendtree_createfinish.cpp @@ -0,0 +1,14 @@ +#include "render_action_appendtree_createfinish.h" +#include "../../../android/bridge/impl/bridge_impl_android.h" + +namespace WeexCore { + + RenderActionAppendTreeCreateFinish::RenderActionAppendTreeCreateFinish(const std::string &pageId, const std::string &ref) { + this->mPageId = pageId; + this->mRef = ref; + } + + void RenderActionAppendTreeCreateFinish::ExecuteAction() { + Bridge_Impl_Android::getInstance()->callAppendTreeCreateFinish(mPageId.c_str(), mRef.c_str()); + } +} http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/core/render/action/render_action_appendtree_createfinish.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/action/render_action_appendtree_createfinish.h b/weex_core/Source/core/render/action/render_action_appendtree_createfinish.h new file mode 100644 index 0000000..e83352a --- /dev/null +++ b/weex_core/Source/core/render/action/render_action_appendtree_createfinish.h @@ -0,0 +1,21 @@ +#ifndef WEEX_CORE_RENDER_ACTION_APPENDTREE_CREATEFINISH_H +#define WEEX_CORE_RENDER_ACTION_APPENDTREE_CREATEFINISH_H + +#include "render_action.h" + +namespace WeexCore { + + class RenderActionAppendTreeCreateFinish : public render_action { + + public: + RenderActionAppendTreeCreateFinish(const std::string &pageId, const std::string &ref); + + void ExecuteAction(); + + public: + std::string mPageId; + std::string mRef; + }; +} + +#endif //WEEX_CORE_RENDER_ACTION_APPENDTREE_CREATEFINISH_H http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/core/render/node/render_object.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/node/render_object.h b/weex_core/Source/core/render/node/render_object.h index fe12b20..6aa676b 100644 --- a/weex_core/Source/core/render/node/render_object.h +++ b/weex_core/Source/core/render/node/render_object.h @@ -399,6 +399,14 @@ namespace WeexCore { return mIsRootRender; } + inline bool IsAppendTree(){ + std::string append = GetAttr(APPEND); + if(append == "tree"){ + return true; + } + return false; + } + private: RenderObject *mParentRender; StylesMap *mStyles; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/core/render/page/render_page.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/page/render_page.cpp b/weex_core/Source/core/render/page/render_page.cpp index d10b4dc..5139481 100644 --- a/weex_core/Source/core/render/page/render_page.cpp +++ b/weex_core/Source/core/render/page/render_page.cpp @@ -25,6 +25,7 @@ #include <core/render/action/render_action_update_attr.h> #include <core/render/action/render_action_layout.h> #include <core/render/action/render_action_createfinish.h> +#include <core/render/action/render_action_appendtree_createfinish.h> #include <core/layout/layout.h> #include <android/base/string/string_utils.h> #include <core/moniter/render_performance.h> @@ -180,7 +181,7 @@ namespace WeexCore { PushRenderToRegisterMap(child); BuildRenderTreeTime(getCurrentTime() - startTime); - SendAddElementAction(child, parent, insertPosition); + SendAddElementAction(child, parent, insertPosition, false); Batch(); return true; @@ -496,13 +497,17 @@ namespace WeexCore { for(auto it = render->ChildListIterBegin(); it != render->ChildListIterEnd(); it++) { RenderObject* child = static_cast<RenderObject*>(*it); if (child != nullptr) { - SendAddElementAction(child, render, i); + SendAddElementAction(child, render, i, true); } ++i; } + + if (i > 0 && render->IsAppendTree()) { + SendAppendTreeCreateFinish(render->Ref()); + } } - void RenderPage::SendAddElementAction(RenderObject *child, RenderObject *parent, int index) { + void RenderPage::SendAddElementAction(RenderObject *child, RenderObject *parent, int index, bool is_recursion) { if (child == nullptr || parent == nullptr) return; @@ -513,10 +518,14 @@ namespace WeexCore { for(auto it = child->ChildListIterBegin(); it != child->ChildListIterEnd(); it++) { RenderObject* grandson = static_cast<RenderObject*>(*it); if (grandson != nullptr) { - SendAddElementAction(grandson, child, i); + SendAddElementAction(grandson, child, i, true); } ++i; } + + if (!is_recursion && i > 0 && child->IsAppendTree()) { + SendAppendTreeCreateFinish(child->Ref()); + } } void RenderPage::SendRemoveElementAction(const std::string &ref) { @@ -557,6 +566,11 @@ namespace WeexCore { PostRenderAction(action); } + void RenderPage::SendAppendTreeCreateFinish(const std::string &ref) { + render_action *action = new RenderActionAppendTreeCreateFinish(PageId(), ref); + PostRenderAction(action); + } + void RenderPage::JniCallTime(const long long &time) { if (mWXCorePerformance != nullptr) mWXCorePerformance->jniCallTime += time; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b2d22b9a/weex_core/Source/core/render/page/render_page.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/page/render_page.h b/weex_core/Source/core/render/page/render_page.h index b53a9cf..c3e1d3f 100644 --- a/weex_core/Source/core/render/page/render_page.h +++ b/weex_core/Source/core/render/page/render_page.h @@ -47,7 +47,7 @@ namespace WeexCore { void SendCreateBodyAction(RenderObject *render); - void SendAddElementAction(RenderObject *child, RenderObject *parent, int index); + void SendAddElementAction(RenderObject *child, RenderObject *parent, int index, bool is_recursion); void SendRemoveElementAction(const std::string &ref); @@ -66,6 +66,8 @@ namespace WeexCore { void SendCreateFinishAction(); + void SendAppendTreeCreateFinish(const std::string &ref); + void PostRenderAction(render_action *action); public: