diff --git a/demo/src/main/java/com/billy/cc/demo/MainActivity.java b/demo/src/main/java/com/billy/cc/demo/MainActivity.java
index ac1ac77..a2401be 100644
--- a/demo/src/main/java/com/billy/cc/demo/MainActivity.java
+++ b/demo/src/main/java/com/billy/cc/demo/MainActivity.java
@@ -34,6 +34,7 @@ protected void onCreate(Bundle savedInstanceState) {
, R.id.componentBGetData
, R.id.componentBLogin
, R.id.componentKt
+ , R.id.test_sub_process
);
}
@@ -121,6 +122,13 @@ public void onResult(CC cc, CCResult ccResult) {
.build()
.callAsyncCallbackOnMainThread(printResultCallback);
break;
+ case R.id.test_sub_process:
+ CC.obtainBuilder("webComponent")
+ .setActionName("openUrl")
+ .setContext(this)
+ .addParam("url", "file:///android_asset/demo.html")
+ .build().call();
+ break;
default:
break;
}
diff --git a/demo/src/main/java/com/billy/cc/demo/MyApp.java b/demo/src/main/java/com/billy/cc/demo/MyApp.java
index f21f51f..e9b00c8 100644
--- a/demo/src/main/java/com/billy/cc/demo/MyApp.java
+++ b/demo/src/main/java/com/billy/cc/demo/MyApp.java
@@ -15,7 +15,6 @@ public void onCreate() {
super.onCreate();
CC.enableVerboseLog(true);
CC.enableDebug(true);
- CC.init(this);
CC.enableRemoteCC(true);
}
}
diff --git a/demo/src/main/res/layout/activity_main.xml b/demo/src/main/res/layout/activity_main.xml
index b6371c0..7d5acc6 100644
--- a/demo/src/main/res/layout/activity_main.xml
+++ b/demo/src/main/res/layout/activity_main.xml
@@ -67,10 +67,10 @@
android:text="@string/async_b_login"
/>
+
diff --git a/demo/src/main/res/values-zh-rCN/strings.xml b/demo/src/main/res/values-zh-rCN/strings.xml
index 9e7e49f..25bd688 100644
--- a/demo/src/main/res/values-zh-rCN/strings.xml
+++ b/demo/src/main/res/values-zh-rCN/strings.xml
@@ -17,4 +17,5 @@
(Activity/Fragment)生命周期关联,登录AOP
与跨组件的fragment对象通信
调用kotlin组件
+ 调用子进程
diff --git a/demo/src/main/res/values/strings.xml b/demo/src/main/res/values/strings.xml
index 4fcd349..8f72bcd 100644
--- a/demo/src/main/res/values/strings.xml
+++ b/demo/src/main/res/values/strings.xml
@@ -17,5 +17,6 @@
(Activity/Fragment) lifecycle with login AOP
send message to fragment
kotlin
+ call sub process
diff --git a/demo_component_b/src/main/AndroidManifest.xml b/demo_component_b/src/main/AndroidManifest.xml
index d15f386..d507f73 100644
--- a/demo_component_b/src/main/AndroidManifest.xml
+++ b/demo_component_b/src/main/AndroidManifest.xml
@@ -3,8 +3,6 @@
-
+
diff --git a/demo_component_b/src/main/debug/AndroidManifest.xml b/demo_component_b/src/main/debug/AndroidManifest.xml
index 537f7ef..c30b4b4 100644
--- a/demo_component_b/src/main/debug/AndroidManifest.xml
+++ b/demo_component_b/src/main/debug/AndroidManifest.xml
@@ -15,8 +15,6 @@
-
+
diff --git a/demo_component_b/src/main/java/com/billy/cc/demo/component/b/BProvider.java b/demo_component_b/src/main/java/com/billy/cc/demo/component/b/BProvider.java
deleted file mode 100644
index 5857a9d..0000000
--- a/demo_component_b/src/main/java/com/billy/cc/demo/component/b/BProvider.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.billy.cc.demo.component.b;
-
-import com.billy.cc.core.component.remote.RemoteProvider;
-
-/**
- * 为子进程创建的RemoteProvider子类
- * TODO 使用插件自动生成,并注入到manifest.xml文件中
- * @author billy.qi
- * @since 18/7/1 14:57
- */
-public class BProvider extends RemoteProvider {
-}
diff --git a/demo_component_b/src/main/java/com/billy/cc/demo/component/b/ComponentB.java b/demo_component_b/src/main/java/com/billy/cc/demo/component/b/ComponentB.java
index ef95835..5e0d2ad 100644
--- a/demo_component_b/src/main/java/com/billy/cc/demo/component/b/ComponentB.java
+++ b/demo_component_b/src/main/java/com/billy/cc/demo/component/b/ComponentB.java
@@ -3,7 +3,6 @@
import com.billy.cc.core.component.CC;
import com.billy.cc.core.component.CCResult;
import com.billy.cc.core.component.IComponent;
-import com.billy.cc.core.component.annotation.SubProcess;
import com.billy.cc.demo.component.b.processor.IActionProcessor;
import java.util.HashMap;
@@ -18,7 +17,7 @@
* 2. 在普通方法中注册: 可以自定义调用时机
* 本类示例的是第2种方式,在onCall方法中注册,在组件第一次被调用时才注册,类似于懒加载
*
- * 自定义cc-settings.gradle, 在autoregister.registerInfo中添加配置,例如(cc-settings-demo-b.gradle):
+ * 自定义cc-settings.gradle, 在autoregister.registerInfo中添加配置,例如(cc-settings-demo.gradle):
*
autoregister {
registerInfo = [
@@ -38,7 +37,6 @@
* @author billy.qi
* @since 17/11/20 21:00
*/
-@SubProcess(name = ":processB")
public class ComponentB implements IComponent {
private AtomicBoolean initialized = new AtomicBoolean(false);
diff --git a/demo_component_b/src/main/java/com/billy/cc/demo/component/b/processor/GetLoginUserProcessor.java b/demo_component_b/src/main/java/com/billy/cc/demo/component/b/processor/GetLoginUserProcessor.java
new file mode 100644
index 0000000..769c5e0
--- /dev/null
+++ b/demo_component_b/src/main/java/com/billy/cc/demo/component/b/processor/GetLoginUserProcessor.java
@@ -0,0 +1,30 @@
+package com.billy.cc.demo.component.b.processor;
+
+import com.billy.cc.core.component.CC;
+import com.billy.cc.core.component.CCResult;
+import com.billy.cc.demo.component.b.Global;
+
+
+/**
+ * 获取当前登录用户信息
+ * @author billy.qi
+ */
+public class GetLoginUserProcessor implements IActionProcessor {
+
+ @Override
+ public String getActionName() {
+ return "getLoginUser";
+ }
+
+ @Override
+ public boolean onActionCall(CC cc) {
+ if (Global.loginUser != null) {
+ //already login, return username
+ CCResult result = CCResult.success(Global.KEY_USER, Global.loginUser);
+ CC.sendCCResult(cc.getCallId(), result);
+ } else {
+ CC.sendCCResult(cc.getCallId(), CCResult.error("no login user"));
+ }
+ return false;
+ }
+}
diff --git a/demo_component_b/src/main/java/com/billy/cc/demo/component/b/processor/LogoutProcessor.java b/demo_component_b/src/main/java/com/billy/cc/demo/component/b/processor/LogoutProcessor.java
new file mode 100644
index 0000000..65787f5
--- /dev/null
+++ b/demo_component_b/src/main/java/com/billy/cc/demo/component/b/processor/LogoutProcessor.java
@@ -0,0 +1,25 @@
+package com.billy.cc.demo.component.b.processor;
+
+import com.billy.cc.core.component.CC;
+import com.billy.cc.core.component.CCResult;
+import com.billy.cc.demo.component.b.Global;
+
+
+/**
+ * 退出登录
+ * @author billy.qi
+ */
+public class LogoutProcessor implements IActionProcessor {
+
+ @Override
+ public String getActionName() {
+ return "logout";
+ }
+
+ @Override
+ public boolean onActionCall(CC cc) {
+ Global.loginUser = null;
+ CC.sendCCResult(cc.getCallId(), CCResult.success());
+ return false;
+ }
+}
diff --git a/demo_component_jsbridge/.gitignore b/demo_component_jsbridge/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/demo_component_jsbridge/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/demo_component_jsbridge/build.gradle b/demo_component_jsbridge/build.gradle
new file mode 100644
index 0000000..f432936
--- /dev/null
+++ b/demo_component_jsbridge/build.gradle
@@ -0,0 +1,34 @@
+apply from: rootProject.file("cc-settings-demo.gradle")
+
+android {
+ compileSdkVersion rootProject.compileVersion
+ buildToolsVersion rootProject.buildVersion
+
+ defaultConfig {
+ minSdkVersion 9 // support v7 minSdkVersion is 9
+ targetSdkVersion rootProject.compileVersion
+ versionCode 1
+ versionName "1.0"
+
+
+ }
+ resourcePrefix "demo_jsbridge_"
+
+ buildTypes {
+ release {
+ postprocessing {
+ removeUnusedCode false
+ removeUnusedResources false
+ obfuscate false
+ optimizeCode false
+ proguardFile 'proguard-rules.pro'
+ }
+ }
+ }
+
+}
+
+dependencies {
+ implementation "com.android.support:appcompat-v7:${rootProject.supportVersion}"
+ api 'com.github.lzyzsd:jsbridge:1.0.4'
+}
diff --git a/demo_component_jsbridge/proguard-rules.pro b/demo_component_jsbridge/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/demo_component_jsbridge/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/demo_component_jsbridge/src/main/AndroidManifest.xml b/demo_component_jsbridge/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..1688ce6
--- /dev/null
+++ b/demo_component_jsbridge/src/main/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/demo_component_jsbridge/src/main/assets/WebViewJavascriptBridge.js b/demo_component_jsbridge/src/main/assets/WebViewJavascriptBridge.js
new file mode 100644
index 0000000..b559031
--- /dev/null
+++ b/demo_component_jsbridge/src/main/assets/WebViewJavascriptBridge.js
@@ -0,0 +1,187 @@
+//notation: js file can only use this kind of comments
+//since comments will cause error when use in webview.loadurl,
+//comments will be remove by java use regexp
+(function() {
+ if (window.WebViewJavascriptBridge) {
+ return;
+ }
+
+
+ //2018-09-15: add for CC JsBridge demo
+ function callCC(component, action, params, successCallback, failedCallback){
+ var json = {
+ componentName : component,
+ actionName : action,
+ data : params
+ };
+ var jsCallback = null;
+ if (successCallback || failedCallback) {
+ jsCallback = function(responseData) {
+ var ccResult = JSON.parse(responseData);
+ if (ccResult) {
+ if (ccResult.success) {
+ if (successCallback) {
+ successCallback(ccResult.data);
+ }
+ } else {
+ if (failedCallback) {
+ failedCallback(ccResult.errorMessage, ccResult.code);
+ }
+ }
+ }
+ };
+ }
+ window.WebViewJavascriptBridge.callHandler(
+ 'callCCComponent',
+ json,
+ jsCallback
+ );
+ }
+ window.callCC = callCC;
+ //2018-09-15: add for CC JsBridge demo
+
+ var messagingIframe;
+ var bizMessagingIframe;
+ var sendMessageQueue = [];
+ var receiveMessageQueue = [];
+ var messageHandlers = {};
+
+ var CUSTOM_PROTOCOL_SCHEME = 'yy';
+ var QUEUE_HAS_MESSAGE = '__QUEUE_MESSAGE__/';
+
+ var responseCallbacks = {};
+ var uniqueId = 1;
+
+ // 创建消息index队列iframe
+ function _createQueueReadyIframe(doc) {
+ messagingIframe = doc.createElement('iframe');
+ messagingIframe.style.display = 'none';
+ doc.documentElement.appendChild(messagingIframe);
+ }
+ //创建消息体队列iframe
+ function _createQueueReadyIframe4biz(doc) {
+ bizMessagingIframe = doc.createElement('iframe');
+ bizMessagingIframe.style.display = 'none';
+ doc.documentElement.appendChild(bizMessagingIframe);
+ }
+ //set default messageHandler 初始化默认的消息线程
+ function init(messageHandler) {
+ if (WebViewJavascriptBridge._messageHandler) {
+ throw new Error('WebViewJavascriptBridge.init called twice');
+ }
+ WebViewJavascriptBridge._messageHandler = messageHandler;
+ var receivedMessages = receiveMessageQueue;
+ receiveMessageQueue = null;
+ for (var i = 0; i < receivedMessages.length; i++) {
+ _dispatchMessageFromNative(receivedMessages[i]);
+ }
+ }
+
+ // 发送
+ function send(data, responseCallback) {
+ _doSend({
+ data: data
+ }, responseCallback);
+ }
+
+ // 注册线程 往数组里面添加值
+ function registerHandler(handlerName, handler) {
+ messageHandlers[handlerName] = handler;
+ }
+ // 调用线程
+ function callHandler(handlerName, data, responseCallback) {
+ _doSend({
+ handlerName: handlerName,
+ data: data
+ }, responseCallback);
+ }
+
+ //sendMessage add message, 触发native处理 sendMessage
+ function _doSend(message, responseCallback) {
+ if (responseCallback) {
+ var callbackId = 'cb_' + (uniqueId++) + '_' + new Date().getTime();
+ responseCallbacks[callbackId] = responseCallback;
+ message.callbackId = callbackId;
+ }
+
+ sendMessageQueue.push(message);
+ messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
+ }
+
+ // 提供给native调用,该函数作用:获取sendMessageQueue返回给native,由于android不能直接获取返回的内容,所以使用url shouldOverrideUrlLoading 的方式返回内容
+ function _fetchQueue() {
+ var messageQueueString = JSON.stringify(sendMessageQueue);
+ sendMessageQueue = [];
+ //android can't read directly the return data, so we can reload iframe src to communicate with java
+ bizMessagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://return/_fetchQueue/' + encodeURIComponent(messageQueueString);
+ }
+
+ //提供给native使用,
+ function _dispatchMessageFromNative(messageJSON) {
+ setTimeout(function() {
+ var message = JSON.parse(messageJSON);
+ var responseCallback;
+ //java call finished, now need to call js callback function
+ if (message.responseId) {
+ responseCallback = responseCallbacks[message.responseId];
+ if (!responseCallback) {
+ return;
+ }
+ responseCallback(message.responseData);
+ delete responseCallbacks[message.responseId];
+ } else {
+ //直接发送
+ if (message.callbackId) {
+ var callbackResponseId = message.callbackId;
+ responseCallback = function(responseData) {
+ _doSend({
+ responseId: callbackResponseId,
+ responseData: responseData
+ });
+ };
+ }
+
+ var handler = WebViewJavascriptBridge._messageHandler;
+ if (message.handlerName) {
+ handler = messageHandlers[message.handlerName];
+ }
+ //查找指定handler
+ try {
+ handler(message.data, responseCallback);
+ } catch (exception) {
+ if (typeof console != 'undefined') {
+ console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", message, exception);
+ }
+ }
+ }
+ });
+ }
+
+ //提供给native调用,receiveMessageQueue 在会在页面加载完后赋值为null,所以
+ function _handleMessageFromNative(messageJSON) {
+ console.log(messageJSON);
+ if (receiveMessageQueue) {
+ receiveMessageQueue.push(messageJSON);
+ }
+ _dispatchMessageFromNative(messageJSON);
+
+ }
+
+ var WebViewJavascriptBridge = window.WebViewJavascriptBridge = {
+ init: init,
+ send: send,
+ registerHandler: registerHandler,
+ callHandler: callHandler,
+ _fetchQueue: _fetchQueue,
+ _handleMessageFromNative: _handleMessageFromNative
+ };
+
+ var doc = document;
+ _createQueueReadyIframe(doc);
+ _createQueueReadyIframe4biz(doc);
+ var readyEvent = doc.createEvent('Events');
+ readyEvent.initEvent('WebViewJavascriptBridgeReady');
+ readyEvent.bridge = WebViewJavascriptBridge;
+ doc.dispatchEvent(readyEvent);
+
+})();
diff --git a/demo_component_jsbridge/src/main/assets/demo.html b/demo_component_jsbridge/src/main/assets/demo.html
new file mode 100644
index 0000000..dcd480a
--- /dev/null
+++ b/demo_component_jsbridge/src/main/assets/demo.html
@@ -0,0 +1,86 @@
+
+
+
+ js调用java
+
+
+
+
+ 这是一个网页
演示子进程中调用其它组件
+
+ 从其它组件获取的当前登录用户信息如下:
+
+
+ 用户id:
+
+
+ 用户名:
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo_component_jsbridge/src/main/debug/AndroidManifest.xml b/demo_component_jsbridge/src/main/debug/AndroidManifest.xml
new file mode 100644
index 0000000..30563b4
--- /dev/null
+++ b/demo_component_jsbridge/src/main/debug/AndroidManifest.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo_component_jsbridge/src/main/debug/java/debug/jsbridge/DebugWebActivity.java b/demo_component_jsbridge/src/main/debug/java/debug/jsbridge/DebugWebActivity.java
new file mode 100644
index 0000000..5cf4c55
--- /dev/null
+++ b/demo_component_jsbridge/src/main/debug/java/debug/jsbridge/DebugWebActivity.java
@@ -0,0 +1,44 @@
+package debug.jsbridge;
+
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.billy.cc.core.component.CC;
+import com.billy.cc.demo.component.jsbridge.R;
+
+/**
+ * jsBridge组件的开发调试页面
+ * @author billy.qi
+ * @since 18/9/15 10:48
+ */
+public class DebugWebActivity extends AppCompatActivity {
+
+ private EditText urlEditText;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.demo_jsbridge_demo_activity);
+ urlEditText = (EditText) findViewById(R.id.et_url);
+ findViewById(R.id.btn_load).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String url = urlEditText.getText().toString().trim();
+ if (TextUtils.isEmpty(url)) {
+ Toast.makeText(DebugWebActivity.this, "please input url!", Toast.LENGTH_SHORT).show();
+ } else {
+ CC.obtainBuilder("webComponent")
+ .setActionName("openUrl")
+ .setContext(DebugWebActivity.this)
+ .addParam("url", url)
+ .build().call();
+ }
+ }
+ });
+ }
+}
diff --git a/demo_component_jsbridge/src/main/debug/java/debug/jsbridge/MyApp.java b/demo_component_jsbridge/src/main/debug/java/debug/jsbridge/MyApp.java
new file mode 100644
index 0000000..a36446f
--- /dev/null
+++ b/demo_component_jsbridge/src/main/debug/java/debug/jsbridge/MyApp.java
@@ -0,0 +1,19 @@
+package debug.jsbridge;
+
+import android.app.Application;
+
+import com.billy.cc.core.component.CC;
+
+/**
+ * @author billy.qi
+ * @since 18/9/15 10:38
+ */
+public class MyApp extends Application {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ CC.enableVerboseLog(true);
+ CC.enableDebug(true);
+ CC.enableRemoteCC(true);
+ }
+}
diff --git a/demo_component_jsbridge/src/main/debug/res/layout/demo_jsbridge_demo_activity.xml b/demo_component_jsbridge/src/main/debug/res/layout/demo_jsbridge_demo_activity.xml
new file mode 100644
index 0000000..ceba7b8
--- /dev/null
+++ b/demo_component_jsbridge/src/main/debug/res/layout/demo_jsbridge_demo_activity.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo_component_jsbridge/src/main/debug/res/mipmap-xhdpi/demo_jsbridge_ic_launcher.png b/demo_component_jsbridge/src/main/debug/res/mipmap-xhdpi/demo_jsbridge_ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/demo_component_jsbridge/src/main/debug/res/mipmap-xhdpi/demo_jsbridge_ic_launcher.png differ
diff --git a/demo_component_jsbridge/src/main/debug/res/mipmap-xhdpi/demo_jsbridge_ic_launcher_round.png b/demo_component_jsbridge/src/main/debug/res/mipmap-xhdpi/demo_jsbridge_ic_launcher_round.png
new file mode 100644
index 0000000..3af2608
Binary files /dev/null and b/demo_component_jsbridge/src/main/debug/res/mipmap-xhdpi/demo_jsbridge_ic_launcher_round.png differ
diff --git a/demo_component_jsbridge/src/main/debug/res/values/strings.xml b/demo_component_jsbridge/src/main/debug/res/values/strings.xml
new file mode 100644
index 0000000..e04a25b
--- /dev/null
+++ b/demo_component_jsbridge/src/main/debug/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+ Js Bridge
+ 打开网页
+ 请输入要打开的网址
+ file:///android_asset/demo.html
+
diff --git a/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/BridgeWebViewHelper.java b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/BridgeWebViewHelper.java
new file mode 100644
index 0000000..e77a1f1
--- /dev/null
+++ b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/BridgeWebViewHelper.java
@@ -0,0 +1,61 @@
+package com.billy.cc.demo.component.jsbridge;
+
+import android.content.Context;
+
+import com.billy.cc.core.component.CC;
+import com.billy.cc.core.component.CCResult;
+import com.billy.cc.core.component.CCUtil;
+import com.billy.cc.core.component.IComponentCallback;
+import com.github.lzyzsd.jsbridge.BridgeHandler;
+import com.github.lzyzsd.jsbridge.BridgeWebView;
+import com.github.lzyzsd.jsbridge.CallBackFunction;
+
+import org.json.JSONObject;
+
+import java.util.Map;
+
+/**
+ * @author billy.qi
+ * @since 18/9/15 12:10
+ */
+public class BridgeWebViewHelper {
+
+ static BridgeWebView createWebView(Context context) {
+
+ final BridgeWebView webView = new BridgeWebView(context);
+ webView.registerHandler("callCCComponent", new BridgeHandler() {
+ @Override
+ public void handler(String data, final CallBackFunction function) {
+ JSONObject json = null;
+ try {
+ json = new JSONObject(data);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ if (json == null) {
+ CCResult result = CCResult.error("json parse error");
+ function.onCallBack(result.toString());
+ } else {
+ String componentName = json.optString("componentName");
+ String actionName = json.optString("actionName");
+ Map map = null;
+ JSONObject dataJson = json.optJSONObject("data");
+ if (dataJson != null) {
+ map = CCUtil.convertToMap(dataJson);
+ }
+ CC.obtainBuilder(componentName)
+ .setActionName(actionName)
+ .setParams(map)
+ .setContext(webView.getContext())
+ .build().callAsyncCallbackOnMainThread(new IComponentCallback() {
+ @Override
+ public void onResult(CC cc, CCResult result) {
+ function.onCallBack(result.toString());
+ }
+ });
+ }
+ }
+ });
+ return webView;
+ }
+}
diff --git a/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/JsBridgeComponent.java b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/JsBridgeComponent.java
new file mode 100644
index 0000000..f07c241
--- /dev/null
+++ b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/JsBridgeComponent.java
@@ -0,0 +1,41 @@
+package com.billy.cc.demo.component.jsbridge;
+
+import com.billy.cc.core.component.CC;
+import com.billy.cc.core.component.CCResult;
+import com.billy.cc.core.component.IComponent;
+import com.billy.cc.core.component.annotation.AllProcess;
+import com.github.lzyzsd.jsbridge.BridgeWebView;
+
+/**
+ * jsBridge组件
+ * @author billy.qi
+ * @since 18/9/15 10:33
+ */
+@AllProcess
+public class JsBridgeComponent implements IComponent {
+ @Override
+ public String getName() {
+ return "jsBridge";
+ }
+
+ @Override
+ public boolean onCall(CC cc) {
+ String actionName = cc.getActionName();
+ switch (actionName) {
+ case "createWebView":
+ return createWebView(cc);
+ default:
+ CC.sendCCResult(cc.getCallId(), CCResult.error("unsupported action name:" + actionName));
+ break;
+ }
+ return false;
+ }
+
+ private boolean createWebView(CC cc) {
+ BridgeWebView webView = BridgeWebViewHelper.createWebView(cc.getContext());
+ CCResult result = CCResult.success()
+ .addData("webView", webView);
+ CC.sendCCResult(cc.getCallId(), result);
+ return false;
+ }
+}
diff --git a/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/WebActivity.java b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/WebActivity.java
new file mode 100644
index 0000000..11c76a7
--- /dev/null
+++ b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/WebActivity.java
@@ -0,0 +1,30 @@
+package com.billy.cc.demo.component.jsbridge;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+
+import com.github.lzyzsd.jsbridge.BridgeWebView;
+
+/**
+ * 用于demo展示一个网页
+ * @author billy.qi
+ * @since 18/9/16 12:45
+ */
+public class WebActivity extends AppCompatActivity {
+ public static String EXTRA_URL = "email";
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ BridgeWebView webView = BridgeWebViewHelper.createWebView(this);
+ setContentView(webView);
+
+ String url = getIntent().getStringExtra(EXTRA_URL);
+ if (!TextUtils.isEmpty(url)) {
+ webView.loadUrl(url);
+ }
+ }
+}
diff --git a/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/WebComponent.java b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/WebComponent.java
new file mode 100644
index 0000000..d0fed3b
--- /dev/null
+++ b/demo_component_jsbridge/src/main/java/com/billy/cc/demo/component/jsbridge/WebComponent.java
@@ -0,0 +1,50 @@
+package com.billy.cc.demo.component.jsbridge;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+
+import com.billy.cc.core.component.CC;
+import com.billy.cc.core.component.CCResult;
+import com.billy.cc.core.component.IComponent;
+import com.billy.cc.core.component.annotation.SubProcess;
+
+/**
+ * @author billy.qi
+ * @since 18/9/16 13:26
+ */
+@SubProcess(":web")
+public class WebComponent implements IComponent {
+ @Override
+ public String getName() {
+ return "webComponent";
+ }
+
+ @Override
+ public boolean onCall(CC cc) {
+ String actionName = cc.getActionName();
+ switch (actionName) {
+ case "openUrl":
+ return openUrl(cc);
+ default:
+ CC.sendCCResult(cc.getCallId(), CCResult.error("unsupported action:" + actionName));
+ break;
+ }
+
+ return false;
+ }
+
+ private boolean openUrl(CC cc) {
+ Context context = cc.getContext();
+ String url = cc.getParamItem("url");
+ Intent intent = new Intent(context, WebActivity.class);
+ intent.putExtra(WebActivity.EXTRA_URL, url);
+ if (!(context instanceof Activity)) {
+ //调用方没有设置context或app间组件跳转,context为application
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ context.startActivity(intent);
+ CC.sendCCResult(cc.getCallId(), CCResult.success());
+ return false;
+ }
+}
diff --git a/demo_component_jsbridge/src/main/res/values/colors.xml b/demo_component_jsbridge/src/main/res/values/colors.xml
new file mode 100644
index 0000000..9c829e8
--- /dev/null
+++ b/demo_component_jsbridge/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/demo_component_jsbridge/src/main/res/values/strings.xml b/demo_component_jsbridge/src/main/res/values/strings.xml
new file mode 100644
index 0000000..8542005
--- /dev/null
+++ b/demo_component_jsbridge/src/main/res/values/strings.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/demo_component_jsbridge/src/main/res/values/styles.xml b/demo_component_jsbridge/src/main/res/values/styles.xml
new file mode 100644
index 0000000..4bd019d
--- /dev/null
+++ b/demo_component_jsbridge/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/settings.gradle b/settings.gradle
index 81576cc..648740f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,4 +1,4 @@
-include ':cc', ':demo_component_kt', ':cc-register'
+include ':cc', ':demo_component_kt', ':cc-register', ':demo_component_jsbridge'
include ':pools'
include ':demo'
include ':demo_component_a'