Skip to content

Commit dd3875b

Browse files
authored
feat(android): provide WebViewClient accessor (#2477)
1 parent a05311d commit dd3875b

File tree

2 files changed

+57
-33
lines changed

2 files changed

+57
-33
lines changed

android/capacitor/src/main/java/com/getcapacitor/Bridge.java

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@
1313
import android.os.HandlerThread;
1414
import android.util.Log;
1515
import android.webkit.ValueCallback;
16-
import android.webkit.WebResourceRequest;
17-
import android.webkit.WebResourceResponse;
1816
import android.webkit.WebSettings;
1917
import android.webkit.WebView;
20-
import android.webkit.WebViewClient;
2118
import android.content.SharedPreferences;
2219

2320
import com.getcapacitor.android.BuildConfig;
@@ -108,6 +105,7 @@ public class Bridge {
108105
private final WebView webView;
109106
public final CordovaInterfaceImpl cordovaInterface;
110107
private CordovaPreferences preferences;
108+
private BridgeWebViewClient webViewClient;
111109

112110
// Our MessageHandler for sending and receiving data to the WebView
113111
private final MessageHandler msgHandler;
@@ -143,6 +141,7 @@ public class Bridge {
143141
public Bridge(Activity context, WebView webView, List<Class<? extends Plugin>> initialPlugins, CordovaInterfaceImpl cordovaInterface, PluginManager pluginManager, CordovaPreferences preferences) {
144142
this.context = context;
145143
this.webView = webView;
144+
this.webViewClient = new BridgeWebViewClient(this);
146145
this.initialPlugins = initialPlugins;
147146
this.cordovaInterface = cordovaInterface;
148147
this.preferences = preferences;
@@ -213,36 +212,7 @@ private void loadWebView() {
213212
Log.d(LOG_TAG, "Loading app at " + appUrl);
214213

215214
webView.setWebChromeClient(new BridgeWebChromeClient(this));
216-
webView.setWebViewClient(new WebViewClient() {
217-
@Override
218-
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
219-
return localServer.shouldInterceptRequest(request);
220-
}
221-
222-
@Override
223-
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
224-
Uri url = request.getUrl();
225-
return launchIntent(url);
226-
}
227-
228-
@Override
229-
public boolean shouldOverrideUrlLoading(WebView view, String url) {
230-
return launchIntent(Uri.parse(url));
231-
}
232-
233-
private boolean launchIntent(Uri url) {
234-
if (!url.toString().contains(appUrl) && !appAllowNavigationMask.matches(url.getHost())) {
235-
try {
236-
Intent openIntent = new Intent(Intent.ACTION_VIEW, url);
237-
getContext().startActivity(openIntent);
238-
} catch (ActivityNotFoundException e) {
239-
// TODO - trigger an event
240-
}
241-
return true;
242-
}
243-
return false;
244-
}
245-
});
215+
webView.setWebViewClient(this.webViewClient);
246216

247217
if (!isDeployDisabled() && !isNewBinary()) {
248218
SharedPreferences prefs = getContext().getSharedPreferences(com.getcapacitor.plugin.WebView.WEBVIEW_PREFS_NAME, Activity.MODE_PRIVATE);
@@ -255,6 +225,19 @@ private boolean launchIntent(Uri url) {
255225
webView.loadUrl(appUrl);
256226
}
257227

228+
public boolean launchIntent(Uri url) {
229+
if (!url.toString().contains(appUrl) && !appAllowNavigationMask.matches(url.getHost())) {
230+
try {
231+
Intent openIntent = new Intent(Intent.ACTION_VIEW, url);
232+
getContext().startActivity(openIntent);
233+
} catch (ActivityNotFoundException e) {
234+
// TODO - trigger an event
235+
}
236+
return true;
237+
}
238+
return false;
239+
}
240+
258241

259242
private boolean isNewBinary() {
260243
String versionCode = "";
@@ -899,4 +882,13 @@ public WebViewLocalServer getLocalServer() {
899882
public HostMask getAppAllowNavigationMask() {
900883
return appAllowNavigationMask;
901884
}
885+
886+
public BridgeWebViewClient getWebViewClient() {
887+
return this.webViewClient;
888+
}
889+
890+
public void setWebViewClient(BridgeWebViewClient client) {
891+
this.webViewClient = client;
892+
}
893+
902894
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.getcapacitor;
2+
3+
import android.net.Uri;
4+
import android.webkit.WebResourceRequest;
5+
import android.webkit.WebResourceResponse;
6+
import android.webkit.WebView;
7+
import android.webkit.WebViewClient;
8+
9+
public class BridgeWebViewClient extends WebViewClient {
10+
private Bridge bridge;
11+
12+
public BridgeWebViewClient(Bridge bridge) {
13+
this.bridge = bridge;
14+
}
15+
16+
@Override
17+
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
18+
return bridge.getLocalServer().shouldInterceptRequest(request);
19+
}
20+
21+
@Override
22+
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
23+
Uri url = request.getUrl();
24+
return bridge.launchIntent(url);
25+
}
26+
27+
@Override
28+
public boolean shouldOverrideUrlLoading(WebView view, String url) {
29+
return bridge.launchIntent(Uri.parse(url));
30+
}
31+
32+
}

0 commit comments

Comments
 (0)