blob: ac02b42dd1b69de87cf006b30ced62eb9add4ff5 [file] [log] [blame]
/**
* 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 org.apache.weex.bridge;
import android.text.TextUtils;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.weex.WXEnvironment;
import org.apache.weex.WXSDKInstance;
import org.apache.weex.WXSDKManager;
import org.apache.weex.adapter.IWXUserTrackAdapter;
import org.apache.weex.base.CalledByNative;
import org.apache.weex.common.IWXBridge;
import org.apache.weex.common.WXErrorCode;
import org.apache.weex.common.WXRenderStrategy;
import org.apache.weex.dom.CSSShorthand;
import org.apache.weex.layout.ContentBoxMeasurement;
import org.apache.weex.annotation.JSMethod;
import org.apache.weex.performance.WXInstanceApm;
import org.apache.weex.performance.WXStateRecord;
import org.apache.weex.utils.WXExceptionUtils;
import org.apache.weex.utils.WXJsonUtils;
import org.apache.weex.utils.WXLogUtils;
import org.apache.weex.utils.WXUtils;
import org.apache.weex.utils.WXWsonJSONSwitch;
import org.apache.weex.utils.tools.TimeCalculator;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
/**
* Communication interface for Java code and JavaScript code.
*/
public class WXBridge implements IWXBridge {
private native int nativeInitFrameworkEnv(String framework, WXParams params, String cacheDir, boolean pieSupport);
private native int nativeInitFramework(String framework, WXParams params);
private native void nativeRefreshInstance(String instanceId, String namespace, String function, WXJSObject[] args);
private native int nativeExecJS(String instanceId, String name, String function, WXJSObject[] args);
private native int nativeExecJSService(String javascript);
public native byte[] nativeExecJSWithResult(String instanceId, String _namespace, String _function, WXJSObject[] args);
public native void nativeExecJSWithCallback(String instanceId, String _namespace, String _function, WXJSObject[] args, long callbackId);
public native int nativeCreateInstanceContext(String instanceId, String name, String function, WXJSObject[] args);
public native int nativeDestoryInstance(String instanceId, String name, String function, WXJSObject[] args);
public native String nativeExecJSOnInstance(String instanceId, String script, int type);
public native void nativeFireEventOnDataRenderNode(String instanceId, String ref, String type, String data, String domChanges);
public native void nativeInvokeCallbackOnDataRender(String instanceId, String callbackId, String data, boolean keepAlive);
public native void nativeRegisterModuleOnDataRenderNode( String data);
public native void nativeRegisterComponentOnDataRenderNode( String data);
private native void nativeTakeHeapSnapshot(String filename);
private native void nativeBindMeasurementToRenderObject(long ptr);
private native void nativeSetRenderContainerWrapContent(boolean wrap, String instanceId);
public native long[] nativeGetFirstScreenRenderTime(String instanceId);
public native long[] nativeGetRenderFinishTime(String instanceId);
private native void nativeSetDefaultHeightAndWidthIntoRootDom(String instanceId, float defaultWidth, float defaultHeight, boolean isWidthWrapContent, boolean isHeightWrapContent);
private native void nativeOnInstanceClose(String instanceId);
private native void nativeForceLayout(String instanceId);
private native boolean nativeNotifyLayout(String instanceId);
private native void nativeSetStyleWidth(String instanceId, String ref, float value);
private native void nativeSetStyleHeight(String instanceId, String ref, float value);
private native void nativeSetMargin(String instanceId, String ref, int edge, float value);
private native void nativeSetPadding(String instanceId, String ref, int edge, float value);
private native void nativeSetPosition(String instanceId, String ref, int edge, float value);
private native void nativeMarkDirty(String instanceId, String ref, boolean dirty);
private native void nativeSetDeviceDisplay(String instanceId, float width, float height, float scale);
private native void nativeRegisterCoreEnv(String key, String value);
private native void nativeResetWXBridge(Object bridge, String className);
private native void nativeSetInstanceRenderType(String instanceId, String renderType);
private native void nativeRemoveInstanceRenderType(String instanceId);
private native void nativeSetPageArgument(String instanceId, String key, String value);
public native void nativeOnInteractionTimeUpdate(String instanceId);
public native String nativeDumpIpcPageQueueInfo();
/**
* Update Init Framework Params
* */
private native void nativeUpdateInitFrameworkParams(String key, String value, String desc);
/**
* update global config,
* @param config params
* */
public native void nativeUpdateGlobalConfig(String config);
private native void nativeSetViewPortWidth(String instanceId, float viewPortWidth);
private native void nativeSetLogType(float type, float isPerf);
private native void nativeReloadPageLayout(String instanceId);
private native void nativeSetDeviceDisplayOfPage(String instanceId,float width,float height);
public static final boolean MULTIPROCESS = true;
@Override
public void updateInitFrameworkParams(String key, String value, String desc){
WXStateRecord.getInstance().recordAction("","updateInitFrameworkParams:");
nativeUpdateInitFrameworkParams(key, value, desc);
}
@Override
public void setLogType(float type, boolean isPerf) {
Log.e("WeexCore", "setLog" + WXEnvironment.sLogLevel.getValue() + "isPerf : " + isPerf);
nativeSetLogType(type, isPerf ? 1 : 0);
}
@Override
public int initFramework(String framework, WXParams params) {
return nativeInitFramework(framework, params);
}
@Override
public int initFrameworkEnv(String framework, WXParams params, String cacheDir, boolean pieSupport) {
if (MULTIPROCESS) {
WXStateRecord.getInstance().recordAction("","nativeInitFrameworkEnv:");
return nativeInitFrameworkEnv(framework, params, cacheDir, pieSupport);
} else {
WXStateRecord.getInstance().recordAction("","nativeInitFramework:");
return nativeInitFramework(framework, params);
}
}
@Override
public void refreshInstance(String instanceId, String namespace, String function, WXJSObject[] args) {
WXStateRecord.getInstance().recordAction(instanceId,"refreshInstance:"+namespace+","+function);
nativeRefreshInstance(instanceId, namespace, function, args);
}
@Override
public int execJS(String instanceId, String namespace, String function, WXJSObject[] args) {
WXStateRecord.getInstance().recordAction(instanceId,"execJS:"+namespace+","+function);
return nativeExecJS(instanceId, namespace, function, args);
}
@Override
public void execJSWithCallback(String instanceId, String namespace, String function, WXJSObject[] args, ResultCallback callback) {
WXStateRecord.getInstance().recordAction(instanceId,"execJSWithCallback:"+namespace+","+function);
if (callback == null) {
execJS(instanceId, namespace, function, args);
}
nativeExecJSWithCallback(instanceId, namespace, function, args,
ResultCallbackManager.generateCallbackId(callback));
}
@CalledByNative
public void onNativePerformanceDataUpdate(String instanceId,Map<String,String> map){
if (TextUtils.isEmpty(instanceId) || null == map || map.size() < 1){
return;
}
WXSDKInstance instance = WXSDKManager.getInstance().getAllInstanceMap().get(instanceId);
if (null == instance || null == instance.getApmForInstance()){
return;
}
instance.getApmForInstance().updateNativePerformanceData(map);
}
// Result from js engine
@CalledByNative
public void onReceivedResult(long callbackId, byte[] result) {
WXStateRecord.getInstance().recordAction("onReceivedResult","callbackId"+callbackId);
ResultCallback callback = ResultCallbackManager.removeCallbackById(callbackId);
if (callback != null) {
callback.onReceiveResult(result);
}
}
@Override
public int execJSService(String javascript) {
WXStateRecord.getInstance().recordAction("execJSService","execJSService:");
return nativeExecJSService(javascript);
}
@Override
public void takeHeapSnapshot(String filename) {
nativeTakeHeapSnapshot(filename);
}
@Override
public int createInstanceContext(String instanceId, String name, String function, WXJSObject[] args) {
Log.e(TimeCalculator.TIMELINE_TAG,"createInstance :" + System.currentTimeMillis());
WXStateRecord.getInstance().recordAction(instanceId,"createInstanceContext:");
return nativeCreateInstanceContext(instanceId, name, function, args);
}
@Override
public int destoryInstance(String instanceId, String name, String function, WXJSObject[] args) {
WXStateRecord.getInstance().recordAction(instanceId,"destoryInstance:");
return nativeDestoryInstance(instanceId, name, function, args);
}
@Override
public String execJSOnInstance(String instanceId, String script, int type) {
WXStateRecord.getInstance().recordAction(instanceId,"execJSOnInstance:"+type);
return nativeExecJSOnInstance(instanceId, script, type);
}
public static final String TAG = "WXBridge";
/**
* JavaScript uses this methods to call Android code
*
* @param instanceId
* @param tasks
* @param callback
*/
@CalledByNative
public int callNative(String instanceId, byte[] tasks, String callback) {
if("HeartBeat".equals(callback)) {
Log.e("HeartBeat instanceId", instanceId);
WXSDKInstance sdkInstance = WXSDKManager.getInstance().getSDKInstance(instanceId);
if(sdkInstance != null) {
sdkInstance.createInstanceFuncHeartBeat();
}
return IWXBridge.INSTANCE_RENDERING;
}
return callNative(instanceId, (JSONArray) JSON.parseArray(new String(tasks)), callback);
}
@Override
public int callNative(String instanceId, String tasks, String callback) {
try{
return callNative(instanceId, JSONArray.parseArray(tasks), callback);
}catch (Exception e){
WXLogUtils.e(TAG, "callNative throw exception: " + WXLogUtils.getStackTrace(e));
return IWXBridge.INSTANCE_RENDERING;
}
}
private int callNative(String instanceId, JSONArray tasks, String callback){
long start = System.currentTimeMillis();
WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
if (instance != null) {
instance.firstScreenCreateInstanceTime(start);
}
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callNative(instanceId, tasks, callback);
} catch (Throwable e) {
WXLogUtils.e(TAG, "callNative throw exception:" + WXLogUtils.getStackTrace(e));
}
if (WXEnvironment.isApkDebugable()) {
if (errorCode == IWXBridge.DESTROY_INSTANCE) {
WXLogUtils.w("destroyInstance :" + instanceId + " JSF must stop callNative");
}
}
return errorCode;
}
@CalledByNative
public void reportJSException(String instanceId, String func, String exception) {
WXBridgeManager.getInstance().reportJSException(instanceId, func, exception);
}
/**
* Bridge module Js Method
* support Sync or Async through setting Annotation as {@link JSMethod }
*
* @param instanceId Instance ID
* @param module the name of module
* @param method the name of method
* @param arguments the arguments of the method
* @param options option arguments for extending
* @return the result
*/
@Override
@CalledByNative
public Object callNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options) {
try {
WXStateRecord.getInstance().recordAction(instanceId,"callNativeModule:"+module+"."+method);
long start = WXUtils.getFixUnixTime();
WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
JSONArray argArray = null;
if (arguments != null){
// TODO use a better way
if (instance!=null && (instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER
|| instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER_BINARY)){
try {
argArray = (JSONArray) JSON.parse(new String(arguments, "UTF-8"));
} catch (Exception e) {
// For wson use in data render mode
argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
}
} else {
argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
}
}
JSONObject optionsObj = null;
if (options != null) {
optionsObj = (JSONObject) WXWsonJSONSwitch.parseWsonOrJSON(options);
} else if (argArray != null) {
final WXSDKInstance sdkInstance = WXSDKManager.getInstance().getSDKInstance(instanceId);
if (sdkInstance != null) {
if (WXBridgeManager.BundType.Rax.equals(sdkInstance.bundleType)) {
Object weex_options__ = null;
for (Object object: argArray) {
if (object instanceof JSONObject && ((JSONObject) object).containsKey("__weex_options__")) {
weex_options__ = ((JSONObject) object).get("__weex_options__");
}
}
if (weex_options__ instanceof JSONObject)
optionsObj = (JSONObject) weex_options__;
}
}
}
Object object = WXBridgeManager.getInstance().callNativeModule(instanceId, module, method, argArray, optionsObj);
if (null != instance){
instance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_NUM,1);
instance.getApmForInstance().updateFSDiffStats(
WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_TIME,
WXUtils.getFixUnixTime()-start
);
}
if (instance!=null && (instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER
|| instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER_BINARY)){
try {
if(object == null){
return new WXJSObject(null);
}
if(object.getClass() == WXJSObject.class){
return (WXJSObject) object;
}
return new WXJSObject(WXJSObject.JSON, WXJsonUtils.fromObjectToJSONString(object));
} catch (Exception e) {
// For wson use in data render mode
return WXWsonJSONSwitch.toWsonOrJsonWXJSObject(object);
}
} else {
return WXWsonJSONSwitch.toWsonOrJsonWXJSObject(object);
}
}catch (Exception e){
WXLogUtils.e(TAG, e);
return new WXJSObject(null);
}
}
/**
* Bridge component Js Method
*
* @param instanceId Instance ID
* @param ref the ref of component
* @param method the name of method
* @param arguments the arguments of the method
* @param options option arguments for extending
*/
@Override
@CalledByNative
public void callNativeComponent(String instanceId, String ref, String method, byte[] arguments, byte[] optionsData) {
WXStateRecord.getInstance().recordAction(instanceId,"callNativeComponent:"+method);
try{
WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
JSONArray argArray = null;
if (arguments != null){
// TODO use a better way
if (instance!=null && (instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER
|| instance.getRenderStrategy()== WXRenderStrategy.DATA_RENDER_BINARY)){
try {
argArray = (JSONArray) JSON.parse(new String(arguments, "UTF-8"));
} catch (Exception e) {
// For wson use in data render mode
argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
}
} else {
argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
}
}
Object options = WXWsonJSONSwitch.parseWsonOrJSON(optionsData);
WXBridgeManager.getInstance().callNativeComponent(instanceId, ref, method, argArray, options);
}catch (Exception e){
WXLogUtils.e(TAG, e);
}
}
@Override
@CalledByNative
public void setTimeoutNative(String callbackId, String time) {
WXBridgeManager.getInstance().setTimeout(callbackId, time);
}
@Override
@CalledByNative
public void setJSFrmVersion(String version) {
if (version != null) {
WXEnvironment.JS_LIB_SDK_VERSION = version;
}
WXStateRecord.getInstance().onJSFMInit();
}
@Override
public void resetWXBridge(boolean remoteDebug) {
final String className = this.getClass().getName().replace('.', '/');
nativeResetWXBridge(this, className);
}
@Override
@CalledByNative
public int callUpdateFinish(String instanceId, byte[] tasks, String callback) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callUpdateFinish(instanceId, callback);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callCreateBody throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callRefreshFinish(String instanceId, byte[] tasks, String callback) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callRefreshFinish(instanceId, callback);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callCreateFinish throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public void reportServerCrash(String instanceId, String crashFile) {
WXLogUtils.e(TAG, "reportServerCrash instanceId:" + instanceId + " crashFile: " + crashFile);
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callReportCrashReloadPage(instanceId, crashFile);
// upload crash log
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "reloadPageNative throw exception:" + WXLogUtils.getStackTrace(e));
}
}
}
@Override
@CalledByNative
public int callCreateBody(String instanceId, String componentType, String ref,
HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
float[] margins, float[] paddings, float[] borders) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callCreateBody(instanceId, componentType, ref,
styles, attributes, events, margins, paddings, borders);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callCreateBody throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callAddElement(String instanceId, String componentType, String ref, int index, String parentRef,
HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
float[] margins, float[] paddings, float[] borders, boolean willLayout) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callAddElement(instanceId, componentType, ref, index, parentRef,
styles, attributes, events, margins, paddings, borders, willLayout);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
e.printStackTrace();
WXLogUtils.e(TAG, "callAddElement throw error:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callRemoveElement(String instanceId, String ref) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callRemoveElement(instanceId, ref);
} catch (Throwable e) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callRemoveElement throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callMoveElement(String instanceId, String ref, String parentref, int index) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callMoveElement(instanceId, ref, parentref, index);
} catch (Throwable e) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callMoveElement throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callAddEvent(String instanceId, String ref, String event) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callAddEvent(instanceId, ref, event);
} catch (Throwable e) {
//catch everything during call native.
// if(WXEnvironment.isApkDebugable()){
WXLogUtils.e(TAG, "callAddEvent throw exception:" + WXLogUtils.getStackTrace(e));
// }
}
return errorCode;
}
@Override
@CalledByNative
public int callRemoveEvent(String instanceId, String ref, String event) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callRemoveEvent(instanceId, ref, event);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callRemoveEvent throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callUpdateStyle(String instanceId, String ref,
HashMap<String, Object> styles,
HashMap<String, String> paddings,
HashMap<String, String> margins,
HashMap<String, String> borders) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callUpdateStyle(instanceId, ref, styles, paddings, margins, borders);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callUpdateStyle throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callUpdateAttrs(String instanceId, String ref, HashMap<String, String> attrs) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callUpdateAttrs(instanceId, ref, attrs);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callUpdateAttr throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callAddChildToRichtext(String instanceId, String nodeType, String ref, String parentRef, String richTextRef,
HashMap<String, String> styles, HashMap<String, String> attrs){
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callAddChildToRichtext(instanceId, nodeType, ref, parentRef, richTextRef,
styles, attrs);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callAddChildToRichtext throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callRemoveChildFromRichtext(String instanceId, String ref, String parentRef, String richTextRef){
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callRemoveChildFromRichtext(instanceId, ref, parentRef, richTextRef);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callRemoveChildFromRichtext throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callUpdateRichtextStyle(String instanceId, String ref, HashMap<String, String> styles, String parentRef, String richTextRef){
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callUpdateRichtextStyle(instanceId, ref, styles, parentRef, richTextRef);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callUpdateRichtextStyle throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callUpdateRichtextChildAttr(String instanceId, String ref, HashMap<String, String> attrs, String parentRef, String richTextRef){
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callUpdateRichtextChildAttr(instanceId, ref, attrs, parentRef, richTextRef);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callUpdateRichtextChildAttr throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callLayout(String instanceId, String ref, int top, int bottom, int left, int right, int height, int width, boolean isRTL, int index) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callLayout(instanceId, ref, top, bottom, left, right, height, width, isRTL, index);
} catch (Throwable e) {
//catch everything during call native.
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callLayout throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public int callCreateFinish(String instanceId) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callCreateFinish(instanceId);
} catch (Throwable e) {
WXLogUtils.e(TAG, "callCreateFinish throw exception:" + WXLogUtils.getStackTrace(e));
}
return errorCode;
}
@Override
@CalledByNative
public int callRenderSuccess(String instanceId) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callRenderSuccess(instanceId);
} catch (Throwable e) {
WXLogUtils.e(TAG, "callCreateFinish throw exception:" + WXLogUtils.getStackTrace(e));
}
return errorCode;
}
@Override
@CalledByNative
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:" + WXLogUtils.getStackTrace(e));
}
return errorCode;
}
@Override
@CalledByNative
public int callHasTransitionPros(String instanceId, String ref, HashMap<String, String> styles) {
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callHasTransitionPros(instanceId, ref, styles);
} catch (Throwable e) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "callHasTransitionPros throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return errorCode;
}
@Override
@CalledByNative
public ContentBoxMeasurement getMeasurementFunc(String instanceId, long renderObjectPtr) {
ContentBoxMeasurement obj = null;
try {
obj = WXBridgeManager.getInstance().getMeasurementFunc(instanceId, renderObjectPtr);
} catch (Throwable e) {
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.e(TAG, "getMeasurementFunc throw exception:" + WXLogUtils.getStackTrace(e));
}
}
return obj;
}
@Override
public void bindMeasurementToRenderObject(long ptr){
nativeBindMeasurementToRenderObject(ptr);
}
@Override
public void setRenderContainerWrapContent(boolean wrap, String instanceId) {
nativeSetRenderContainerWrapContent(wrap, instanceId);
}
@Override
public long[] getFirstScreenRenderTime(String instanceId) {
return nativeGetFirstScreenRenderTime(instanceId);
}
@Override
public long[] getRenderFinishTime(String instanceId) {
return nativeGetRenderFinishTime(instanceId);
}
@Override
public void setDefaultHeightAndWidthIntoRootDom(String instanceId, float defaultWidth, float defaultHeight, boolean isWidthWrapContent, boolean isHeightWrapContent) {
nativeSetDefaultHeightAndWidthIntoRootDom(instanceId, defaultWidth, defaultHeight, isWidthWrapContent, isHeightWrapContent);
}
@Override
public void onInstanceClose(String instanceId) {
nativeOnInstanceClose(instanceId);
}
@Override
public void forceLayout(String instanceId) {
nativeForceLayout(instanceId);
}
@Override
public boolean notifyLayout(String instanceId) {
return nativeNotifyLayout(instanceId);
}
@Override
public void setStyleWidth(String instanceId, String ref, float value) {
nativeSetStyleWidth(instanceId, ref, value);
}
@Override
public void setMargin(String instanceId, String ref, CSSShorthand.EDGE edge, float value) {
nativeSetMargin(instanceId, ref, edge.ordinal(), value);
}
@Override
public void setPadding(String instanceId, String ref, CSSShorthand.EDGE edge, float value) {
nativeSetPadding(instanceId, ref, edge.ordinal(), value);
}
@Override
public void setPosition(String instanceId, String ref, CSSShorthand.EDGE edge, float value) {
nativeSetPosition(instanceId, ref, edge.ordinal(), value);
}
@Override
public void markDirty(String instanceId, String ref, boolean dirty) {
nativeMarkDirty(instanceId, ref, dirty);
}
@Override
public void setDeviceDisplay(String instanceId, float width, float height, float scale) {
nativeSetDeviceDisplay(instanceId, width, height, scale);
}
@Override
public void setStyleHeight(String instanceId, String ref, float value) {
nativeSetStyleHeight(instanceId, ref, value);
}
@Override
public void setInstanceRenderType(String instanceId, String renderType){
if(TextUtils.isEmpty(renderType)){
return;
}
nativeSetInstanceRenderType(instanceId, renderType);
}
@Override
public void setViewPortWidth(String instanceId,float viewPortWidth){
nativeSetViewPortWidth(instanceId,viewPortWidth);
}
@Override
public void removeInstanceRenderType(String instanceId){
nativeRemoveInstanceRenderType(instanceId);
}
@Override
public void setPageArgument(String instanceId, String key, String value){
nativeSetPageArgument(instanceId, key, value);
}
@Override
public void registerCoreEnv(String key, String value) {
nativeRegisterCoreEnv(key, value);
}
@CalledByNative
public void reportNativeInitStatus(String statusCode, String errorMsg) {
if (WXErrorCode.WX_JS_FRAMEWORK_INIT_SINGLE_PROCESS_SUCCESS.getErrorCode().equals(statusCode)
|| WXErrorCode.WX_JS_FRAMEWORK_INIT_FAILED.getErrorCode().equals(statusCode)) {
IWXUserTrackAdapter userTrackAdapter = WXSDKManager.getInstance().getIWXUserTrackAdapter();
if (userTrackAdapter != null) {
Map<String, Serializable> params = new HashMap<>(3);
params.put(IWXUserTrackAdapter.MONITOR_ERROR_CODE, statusCode);
params.put(IWXUserTrackAdapter.MONITOR_ARG, "InitFrameworkNativeError");
params.put(IWXUserTrackAdapter.MONITOR_ERROR_MSG, errorMsg);
WXLogUtils.e("reportNativeInitStatus is running and errorCode is " + statusCode + " And errorMsg is " + errorMsg);
userTrackAdapter.commit(null, null, IWXUserTrackAdapter.INIT_FRAMEWORK, null, params);
}
return;
}
if (WXErrorCode.WX_JS_FRAMEWORK_INIT_FAILED_PARAMS_NULL.getErrorCode().equals(statusCode)) {
WXExceptionUtils.commitCriticalExceptionRT(null, WXErrorCode.WX_JS_FRAMEWORK_INIT_FAILED_PARAMS_NULL,
"WeexProxy::initFromParam()",
WXErrorCode.WX_JS_FRAMEWORK_INIT_FAILED_PARAMS_NULL.getErrorMsg() + ": " + errorMsg,
null);
return;
}
for (WXErrorCode e : WXErrorCode.values()) {
if (e.getErrorType().equals(WXErrorCode.ErrorType.NATIVE_ERROR)
&& e.getErrorCode().equals(statusCode)) {
WXExceptionUtils.commitCriticalExceptionRT(null, e, "initFramework", errorMsg, null);
break;
}
}
}
public void fireEventOnDataRenderNode(String instanceId, String ref, String type, String data, String domChanges) {
nativeFireEventOnDataRenderNode(instanceId,ref,type,data, domChanges);
}
public void invokeCallbackOnDataRender(String instanceId, String callbackId, String data, boolean keepAlive) {
nativeInvokeCallbackOnDataRender(instanceId,callbackId,data, keepAlive);
}
public void registerModuleOnDataRenderNode(String data) {
nativeRegisterModuleOnDataRenderNode(data);
}
public void registerComponentOnDataRenderNode(String data) {
nativeRegisterComponentOnDataRenderNode(data);
}
public void reloadPageLayout(String instanceId){
nativeReloadPageLayout(instanceId);
}
public void setDeviceDisplayOfPage(String instanceId, float width, float height){
nativeSetDeviceDisplayOfPage(instanceId,width,height);
}
}