blob: 1343f602d0428435eef49990ce4e6118ffa5032d [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 com.taobao.weex.bridge;
import android.text.TextUtils;
import android.widget.Toast;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.ws.WebSocket;
import com.taobao.weex.WXEnvironment;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.common.IWXBridge;
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.websocket.WXWebSocketManager;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import okio.BufferedSource;
/**
* websocket bridge
*
* @author gulin
*/
public class WXWebsocketBridge implements IWXBridge,WXWebSocketManager.JSDebuggerCallback {
private WXBridgeManager mJsManager;
private volatile boolean mInit = false;
public WXWebsocketBridge(WXBridgeManager jm) {
mJsManager = jm;
WXWebSocketManager.getInstance().registerListener(this);
}
@Override
public int execJS(String instanceId, String namespace, String function,
WXJSObject[] args) {
if (!mInit || TextUtils.isEmpty(instanceId)
|| TextUtils.isEmpty(function)) {
return -1;
}
Map<String, Object> map = new HashMap<>();
map.put("method", function);
ArrayList<Object> array = new ArrayList<>();
int argsCount = args == null ? 0 : args.length;
for (int i = 0; i < argsCount; i++) {
if (args[i].type != WXJSObject.String) {
array.add(JSON.parse(args[i].data.toString()));
} else {
array.add(args[i].data);
}
}
map.put("arguments", array);
WXWebSocketManager.getInstance().sendMessage(JSON.toJSONString(map));
return 0;
}
@Override
public int execJSService(String javascript) {
return 0;
}
@Override
public int callNative(String instanceId, String tasks, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callNative(instanceId, tasks, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callCreateBody(String instanceId, String tasks, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callCreateBody(instanceId, tasks, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callAddElement(String instanceId, String ref, String dom, String index, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callAddElement(instanceId, ref,dom, index,callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callUpdateFinish(String instanceId, byte [] tasks, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callUpdateFinish(instanceId, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callCreateFinish(String instanceId, byte [] tasks, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callCreateFinish(instanceId, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callRefreshFinish(String instanceId, byte [] tasks, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callRefreshFinish(instanceId, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callUpdateAttrs(String instanceId, String ref, byte [] tasks, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
if (tasks != null) {
mJsManager.callUpdateAttrs(instanceId, ref, new String(tasks), callback);
}
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callUpdateStyle(String instanceId, String ref, byte [] tasks, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
if (tasks != null) {
mJsManager.callUpdateStyle(instanceId, ref, new String(tasks), callback);
}
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callRemoveElement(String instanceId, String ref, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callRemoveElement(instanceId, ref, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callMoveElement(String instanceId, String ref, String parentref, String index, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callMoveElement(instanceId, ref, parentref, index, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callAddEvent(String instanceId, String ref, String event, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callAddEvent(instanceId, ref, event, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int callRemoveEvent(String instanceId, String ref, String event, String callback) {
if (!mInit || mJsManager == null)
return IWXBridge.INSTANCE_RENDERING_ERROR ;
mJsManager.callRemoveEvent(instanceId, ref, event, callback);
return IWXBridge.INSTANCE_RENDERING;
}
@Override
public int initFramework(String scriptsFramework,WXParams params) {
if (!mInit) {
return -1;
}
Map<String, Object> map = new HashMap<>();
map.put("method", "evalFramework");
ArrayList<String> args = new ArrayList<>();
args.add(scriptsFramework);
map.put("arguments", args);
WXWebSocketManager.getInstance().sendMessage(JSON.toJSONString(map));
return 0;
}
@Override
public int initFrameworkEnv(String scriptsFramework,WXParams params, String cacheDir, boolean pieSupport) {
if (!mInit) {
return -1;
}
Map<String, Object> map = new HashMap<>();
map.put("method", "evalFramework");
ArrayList<String> args = new ArrayList<>();
args.add(scriptsFramework);
map.put("arguments", args);
WXWebSocketManager.getInstance().sendMessage(JSON.toJSONString(map));
return 0;
}
@Override
public void takeHeapSnapshot(String filename) {}
@Override
public void reportJSException(String instanceId, String func, String exception) {
if (mJsManager != null) {
mJsManager.reportJSException(instanceId, func, exception);
}
}
@Override
public String callNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options) {
return null;
}
@Override
public void callNativeComponent(String instanceId, String componentRef, String method, byte[] arguments, byte[] options) {
}
@Override
public void reportServerCrash(String instanceId, String crashFile) {
}
@Override
public void onMessage(BufferedSource payload, WebSocket.PayloadType type) {
if (type != WebSocket.PayloadType.TEXT) {
WXLogUtils.w("Websocket received unexpected message with payload of type " + type);
return;
}
String message = null;
try {
message = payload.readUtf8();
JSONObject jsonObject = JSONObject.parseObject(message);
Object name = jsonObject.get("name");
Object value = jsonObject.get("value");
if (name == null || value == null) {
return;
}
if (name.toString().equals("callNative")) {
JSONArray jsonArray = JSONObject.parseArray(value.toString());
callNative(jsonArray.getString(0), jsonArray.getString(1),
jsonArray.getString(2));
}
} catch (Exception e) {
} finally {
try {
payload.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onSuccess(Response response) {
if(response.isSuccessful()){
WXSDKManager.getInstance().postOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(WXEnvironment.sApplication,"Has switched to DEBUG mode, you can see the DEBUG information on the browser!",Toast.LENGTH_SHORT).show();
}
},0);
}
}
@Override
public void onFailure(Throwable cause) {
Toast.makeText(WXEnvironment.sApplication,"socket connect failure!",Toast.LENGTH_SHORT).show();
}
}