From d1cdb208c792ad9e447a64167f2886b24065be5d Mon Sep 17 00:00:00 2001 From: meihu Date: Wed, 11 Dec 2024 14:47:49 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BD=BF=E7=94=A8JavascriptInterface?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E9=80=9A=E4=BF=A1=E6=96=B9=E5=BC=8F=EF=BC=9B?= =?UTF-8?q?=20=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96=EF=BC=9B=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7agp=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +- example/build.gradle | 12 +- example/src/main/AndroidManifest.xml | 13 +- gradle/wrapper/gradle-wrapper.properties | 2 +- library/build.gradle | 34 +-- library/src/main/assets/jsbridge | 6 +- .../java/com/xiaomao/jsbridge/BridgeUtil.java | 2 +- .../jsbridge/BridgeWebChromeClient.java | 201 ------------------ .../com/xiaomao/jsbridge/BridgeWebView.java | 79 ++++--- .../xiaomao/jsbridge/BridgeWebViewClient.java | 2 - .../jsbridge/WebViewJavascriptBridge.js | 6 +- 11 files changed, 65 insertions(+), 298 deletions(-) delete mode 100644 library/src/main/java/com/xiaomao/jsbridge/BridgeWebChromeClient.java diff --git a/build.gradle b/build.gradle index 4ff022f..4b4b2ed 100644 --- a/build.gradle +++ b/build.gradle @@ -2,11 +2,11 @@ buildscript { repositories { - jcenter() + mavenCentral() google() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.2' + classpath 'com.android.tools.build:gradle:8.7.3' //classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,7 +15,7 @@ buildscript { allprojects { repositories { - jcenter() + mavenCentral() google() } } diff --git a/example/build.gradle b/example/build.gradle index ceb34f3..86eea1a 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdk 34 defaultConfig { applicationId "com.xiaomao.jsbridge.example" - minSdkVersion 14 - targetSdkVersion 29 + minSdkVersion 21 + targetSdkVersion 34 versionCode 1 versionName "1.0" } @@ -17,11 +16,12 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + namespace 'com.xiaomao.jsbridge.example' } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':library') - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'com.google.code.gson:gson:2.8.2' + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'com.google.code.gson:gson:2.11.0' } diff --git a/example/src/main/AndroidManifest.xml b/example/src/main/AndroidManifest.xml index 05a481e..efa5a7d 100644 --- a/example/src/main/AndroidManifest.xml +++ b/example/src/main/AndroidManifest.xml @@ -1,15 +1,16 @@ + package="com.xiaomao.jsbridge.example"> - + + android:exported="true"> diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e7cd316..2a4a6bb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip diff --git a/library/build.gradle b/library/build.gradle index 13d47d3..d4b0e54 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,15 +1,13 @@ apply plugin: 'com.android.library' -//apply plugin: 'com.github.dcendents.android-maven' version = "1.0-alpha4" android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdk 34 defaultConfig { - minSdkVersion 14 - targetSdkVersion 29 + minSdkVersion 21 + targetSdkVersion 34 versionCode 1 versionName version } @@ -20,31 +18,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + namespace 'com.xiaomao.jsbridge.library' } dependencies { - implementation 'com.android.support:support-annotations:28.0.0' + implementation "androidx.annotation:annotation:1.9.1" } - -// build a jar with source files -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} - -task javadoc(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - exclude 'com/xiaomao/jsbridge/WebViewJavascriptBridge.js' - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) -} - -// build a jar with javadoc -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives sourcesJar - archives javadocJar -} \ No newline at end of file diff --git a/library/src/main/assets/jsbridge b/library/src/main/assets/jsbridge index e705cfd..5b33ac0 100644 --- a/library/src/main/assets/jsbridge +++ b/library/src/main/assets/jsbridge @@ -1,3 +1,3 @@ -(function(){function h(b,a){if(a){var c="cb_"+n++ +"_"+(new Date).getTime();f[c]=a;b.id=c}prompt("gl://request/"+JSON.stringify(b))}function k(b){setTimeout(function(){var a=JSON.parse(b);var c=a.id?function(b){prompt("gl://response/"+JSON.stringify({id:a.id,data:b}))}:function(a){};var d=a.handlerName?l[a.handlerName]:e._requestHandler;if(void 0==d)console.log("WebViewJavascriptBridge: WARNING:no handler for ",a.handlerName);else try{d(a.data,c)}catch(p){console.error("WebViewJavascriptBridge: WARNING: javascript handler threw.", -p.stack)}})}if(!window.WebViewJavascriptBridge){var d=[],l={},f={},n=1;prompt("gl://pageLoaded/"+(0 callback) { - webChromeClient.getVisitedHistory(callback); - } - - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) - @Override - public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) { - return webChromeClient.onShowFileChooser(webView, filePathCallback, fileChooserParams); - } - - @Override - public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { - if (interceptMessage((BridgeWebView) view, message)) { - result.confirm(); - return true; - } else { - return webChromeClient.onJsPrompt(view, url, message, defaultValue, result); - } - } - - private boolean interceptMessage(final BridgeWebView view, String message) { - if (message.startsWith(BridgeUtil.GL_REQUEST)) { - final Request request = Request.toObject(message.replace(BridgeUtil.GL_REQUEST, "")); - if (request != null) { - view.post(new Runnable() { - @Override - public void run() { - view.handleRequest(request); - } - }); - } - return true; - } else if (message.startsWith(BridgeUtil.GL_RESPONSE)) { - final Response response = Response.toObject(message.replace(BridgeUtil.GL_RESPONSE, "")); - if (response != null) { - view.post(new Runnable() { - @Override - public void run() { - view.handleResponse(response); - } - }); - } - return true; - } else if (message.startsWith(BridgeUtil.GL_PAGE_LOADED)) { - String result = message.replace(BridgeUtil.GL_PAGE_LOADED, ""); - view.onPageLoaded("ok".equals(result)); - return true; - } else { - return false; - } - } -} diff --git a/library/src/main/java/com/xiaomao/jsbridge/BridgeWebView.java b/library/src/main/java/com/xiaomao/jsbridge/BridgeWebView.java index c71611d..2581977 100644 --- a/library/src/main/java/com/xiaomao/jsbridge/BridgeWebView.java +++ b/library/src/main/java/com/xiaomao/jsbridge/BridgeWebView.java @@ -2,16 +2,15 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Build; import android.os.Looper; import android.os.SystemClock; import android.text.TextUtils; import android.util.AttributeSet; -import android.webkit.WebChromeClient; +import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.webkit.WebViewClient; -import androidx.annotation.RequiresApi; +import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.HashMap; @@ -21,14 +20,13 @@ @SuppressLint("SetJavaScriptEnabled") public class BridgeWebView extends WebView implements WebViewJavascriptBridge, OnPageLoadListener { private OnPageLoadListener onPageLoadListener; - private Map responseCallbacks = new HashMap(); - private Map messageHandlers = new HashMap<>(); + private final Map responseCallbacks = new HashMap<>(); + private final Map messageHandlers = new HashMap<>(); private BridgeHandler defaultHandler = new DefaultHandler(); private List startupRequests = new ArrayList<>(); private BridgeWebViewClient bridgeWebViewClient; - private BridgeWebChromeClient bridgeWebChromeClient; private long uniqueId = 0; @@ -46,18 +44,11 @@ public BridgeWebView(Context context, AttributeSet attrs, int defStyle) { init(); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public BridgeWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } - @Deprecated - public BridgeWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) { - super(context, attrs, defStyleAttr, privateBrowsing); - init(); - } - public BridgeWebView(Context context) { super(context); init(); @@ -75,13 +66,10 @@ private void init() { this.setVerticalScrollBarEnabled(false); this.setHorizontalScrollBarEnabled(false); this.getSettings().setJavaScriptEnabled(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - WebView.setWebContentsDebuggingEnabled(true); - } + WebView.setWebContentsDebuggingEnabled(true); bridgeWebViewClient = new BridgeWebViewClient(); - bridgeWebChromeClient = new BridgeWebChromeClient(); super.setWebViewClient(bridgeWebViewClient); - super.setWebChromeClient(bridgeWebChromeClient); + addJavascriptInterface(this, "jsBridge"); } public void onPageLoaded(boolean isLoaded) { @@ -91,16 +79,10 @@ public void onPageLoaded(boolean isLoaded) { } @Override - public void setWebViewClient(WebViewClient client) { + public void setWebViewClient(@NonNull WebViewClient client) { bridgeWebViewClient.setWebViewClient(client); } - @Override - public void setWebChromeClient(WebChromeClient client) { - bridgeWebChromeClient.setWebChromeClient(client); - } - - void sendStartupRequests() { if (startupRequests != null) { for (Request request : startupRequests) { @@ -174,21 +156,15 @@ void handleRequest(final Request request) { CallBackFunction responseFunction; // if had callbackId if (!TextUtils.isEmpty(request.getId())) { - responseFunction = new CallBackFunction() { - @Override - public void onCallBack(String data) { - Response response = new Response(); - response.setId(request.getId()); - response.setData(data); - dispatchResponse(response); - } + responseFunction = data -> { + Response response = new Response(); + response.setId(request.getId()); + response.setData(data); + dispatchResponse(response); }; } else { - responseFunction = new CallBackFunction() { - @Override - public void onCallBack(String data) { - // do nothing - } + responseFunction = data -> { + // do nothing }; } BridgeHandler handler; @@ -205,8 +181,8 @@ public void onCallBack(String data) { /** * register handler,so that javascript can call it * - * @param handlerName - * @param handler + * @param handlerName handler name + * @param handler js handler */ public void registerHandler(String handlerName, BridgeHandler handler) { if (handler != null) { @@ -217,13 +193,30 @@ public void registerHandler(String handlerName, BridgeHandler handler) { /** * call javascript registered handler * - * @param handlerName - * @param data - * @param callBack + * @param handlerName handler name + * @param data data + * @param callBack callback */ public void callHandler(String handlerName, String data, CallBackFunction callBack) { doSend(handlerName, data, callBack); } + @JavascriptInterface + public void onMessage(String message) { + if (message.startsWith(BridgeUtil.GL_REQUEST)) { + final Request request = Request.toObject(message.replace(BridgeUtil.GL_REQUEST, "")); + if (request != null) { + post(() -> handleRequest(request)); + } + } else if (message.startsWith(BridgeUtil.GL_RESPONSE)) { + final Response response = Response.toObject(message.replace(BridgeUtil.GL_RESPONSE, "")); + if (response != null) { + post(() -> handleResponse(response)); + } + } else if (message.startsWith(BridgeUtil.GL_PAGE_LOADED)) { + String result = message.replace(BridgeUtil.GL_PAGE_LOADED, ""); + post(() -> onPageLoaded("ok".equals(result))); + } + } } diff --git a/library/src/main/java/com/xiaomao/jsbridge/BridgeWebViewClient.java b/library/src/main/java/com/xiaomao/jsbridge/BridgeWebViewClient.java index 8107fab..e6ecbb8 100644 --- a/library/src/main/java/com/xiaomao/jsbridge/BridgeWebViewClient.java +++ b/library/src/main/java/com/xiaomao/jsbridge/BridgeWebViewClient.java @@ -70,7 +70,6 @@ public WebResourceResponse shouldInterceptRequest(WebView view, String url) { return webViewClient.shouldInterceptRequest(view, url); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return webViewClient.shouldInterceptRequest(view, request); @@ -113,7 +112,6 @@ public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError e webViewClient.onReceivedSslError(view, handler, error); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) { webViewClient.onReceivedClientCertRequest(view, request); diff --git a/library/src/main/java/com/xiaomao/jsbridge/WebViewJavascriptBridge.js b/library/src/main/java/com/xiaomao/jsbridge/WebViewJavascriptBridge.js index 7ed0fa7..85f6293 100644 --- a/library/src/main/java/com/xiaomao/jsbridge/WebViewJavascriptBridge.js +++ b/library/src/main/java/com/xiaomao/jsbridge/WebViewJavascriptBridge.js @@ -18,7 +18,7 @@ var uniqueId = 1; var state = window.location.host.length > 0 ? "ok" : "error"; - prompt(CUSTOM_PROTOCOL_SCHEME + 'pageLoaded/' + state); + jsBridge.onMessage(CUSTOM_PROTOCOL_SCHEME + 'pageLoaded/' + state); //set default requestHandler function init(requestHandler) { @@ -57,7 +57,7 @@ responseCallbacks[callbackId] = responseCallback; request.id = callbackId; } - prompt(GL_REQUEST + JSON.stringify(request)); + jsBridge.onMessage(GL_REQUEST + JSON.stringify(request)); } function _handleResponseFromNative(responseJson) { @@ -83,7 +83,7 @@ id: request.id, data: responseData }; - prompt(GL_RESPONSE + JSON.stringify(response)); + jsBridge.onMessage(GL_RESPONSE + JSON.stringify(response)); } } else { responseCallback = function (responseData) { From 89642155d9270bf238cec80c9dfbbe0b5f546a14 Mon Sep 17 00:00:00 2001 From: meihu Date: Wed, 11 Dec 2024 15:01:01 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=8D=87=E7=BA=A7java=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/build.gradle | 4 ++++ library/build.gradle | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/example/build.gradle b/example/build.gradle index 86eea1a..547d47c 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -17,6 +17,10 @@ android { } } namespace 'com.xiaomao.jsbridge.example' + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } } dependencies { diff --git a/library/build.gradle b/library/build.gradle index d4b0e54..c79d575 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -19,6 +19,10 @@ android { } } namespace 'com.xiaomao.jsbridge.library' + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } } dependencies { From d78197172cecc3e8d0068679d0371628e9dfc828 Mon Sep 17 00:00:00 2001 From: meihu Date: Wed, 11 Dec 2024 15:09:55 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=8D=87=E7=BA=A7java=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/build.gradle | 4 ++-- library/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/example/build.gradle b/example/build.gradle index 547d47c..97aaa5d 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -18,8 +18,8 @@ android { } namespace 'com.xiaomao.jsbridge.example' compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } } diff --git a/library/build.gradle b/library/build.gradle index c79d575..cfa5582 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -20,8 +20,8 @@ android { } namespace 'com.xiaomao.jsbridge.library' compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } } From 67d8cc335f191fcd79037d8284964e192afb25e4 Mon Sep 17 00:00:00 2001 From: meihu Date: Wed, 11 Dec 2024 15:16:22 +0800 Subject: [PATCH 4/6] add maven-publish plugin --- library/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/library/build.gradle b/library/build.gradle index cfa5582..3e1add7 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.library' +apply plugin: 'maven-publish' version = "1.0-alpha4" From 6e15677f25ac915588252a88f433e1533b3694c9 Mon Sep 17 00:00:00 2001 From: meihu Date: Wed, 11 Dec 2024 16:33:21 +0800 Subject: [PATCH 5/6] add maven-publish plugin --- library/build.gradle | 17 ++++++++++++++++- library/src/main/AndroidManifest.xml | 3 +-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index 3e1add7..0134eb6 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' apply plugin: 'maven-publish' -version = "1.0-alpha4" +version = "1.0-beta3" android { compileSdk 34 @@ -29,3 +29,18 @@ android { dependencies { implementation "androidx.annotation:annotation:1.9.1" } + +afterEvaluate { + publishing { + publications { + println("Components: " + components*.name) + release(MavenPublication) { + groupId = 'com.github.orientsec' + artifactId = 'jsbridge' + version = version +// from components.release + from components.findByName('release') + } + } + } +} \ No newline at end of file diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 23c1924..c4e83de 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,4 +1,3 @@ - - + From a61bd49962f058e06a38131ea0180ccb5b326bab Mon Sep 17 00:00:00 2001 From: meihu Date: Thu, 12 Dec 2024 12:41:31 +0800 Subject: [PATCH 6/6] add publish components update target version to 35 --- example/build.gradle | 4 ++-- library/build.gradle | 19 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/example/build.gradle b/example/build.gradle index 97aaa5d..ba130d8 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.xiaomao.jsbridge.example" minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode 1 versionName "1.0" } diff --git a/library/build.gradle b/library/build.gradle index 0134eb6..edbd548 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,16 +1,12 @@ apply plugin: 'com.android.library' apply plugin: 'maven-publish' -version = "1.0-beta3" - android { - compileSdk 34 + compileSdk 35 defaultConfig { minSdkVersion 21 - targetSdkVersion 34 - versionCode 1 - versionName version + targetSdkVersion 35 } sourceSets.main.java.exclude 'com/xiaomao/jsbridge/WebViewJavascriptBridge.js' buildTypes { @@ -24,6 +20,11 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } + publishing { + singleVariant('release') { + withSourcesJar() + } + } } dependencies { @@ -33,13 +34,11 @@ dependencies { afterEvaluate { publishing { publications { - println("Components: " + components*.name) release(MavenPublication) { groupId = 'com.github.orientsec' artifactId = 'jsbridge' - version = version -// from components.release - from components.findByName('release') + version = '1.0-beta3' + from components.release } } }