From 4136111e8cc26d3ff325311b7d0fd3916c2c56c0 Mon Sep 17 00:00:00 2001 From: Carl Poole Date: Wed, 30 Mar 2022 15:40:48 -0500 Subject: [PATCH 1/3] initial Android Route Processing support --- .../src/main/java/com/getcapacitor/Bridge.java | 18 ++++++++++++++++++ .../java/com/getcapacitor/BridgeActivity.java | 10 +++++----- .../java/com/getcapacitor/RouteProcessor.java | 8 ++++++++ .../com/getcapacitor/WebViewLocalServer.java | 12 +++++++++++- 4 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java diff --git a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java index 5828f4904b..ac6c9c51d0 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java @@ -130,6 +130,9 @@ public class Bridge { // A list of listeners that trigger when webView events occur private List webViewListeners = new ArrayList<>(); + // An interface to manipulate route resolving + private RouteProcessor routeProcessor; + /** * Create the Bridge with a reference to the main {@link Activity} for the * app, and a reference to the {@link WebView} our app will use. @@ -1190,6 +1193,14 @@ void setWebViewListeners(List webViewListeners) { this.webViewListeners = webViewListeners; } + RouteProcessor getRequestPathResolver() { + return routeProcessor; + } + + void setRequestPathResolver(RouteProcessor routeProcessor) { + this.routeProcessor = routeProcessor; + } + /** * Add a listener that the WebViewClient can trigger on certain events. * @param webViewListener A {@link WebViewListener} to add. @@ -1213,6 +1224,7 @@ public static class Builder { private List> plugins = new ArrayList<>(); private AppCompatActivity activity; private Fragment fragment; + private RouteProcessor routeProcessor; private final List webViewListeners = new ArrayList<>(); public Builder(AppCompatActivity activity) { @@ -1265,6 +1277,11 @@ public Builder addWebViewListeners(List webViewListeners) { return this; } + public Builder setRequestPathResolver(RouteProcessor routeProcessor) { + this.routeProcessor = routeProcessor; + return this; + } + public Bridge create() { // Cordova initialization ConfigXmlParser parser = new ConfigXmlParser(); @@ -1288,6 +1305,7 @@ public Bridge create() { Bridge bridge = new Bridge(activity, fragment, webView, plugins, cordovaInterface, pluginManager, preferences, config); bridge.setCordovaWebView(mockWebView); bridge.setWebViewListeners(webViewListeners); + bridge.setRequestPathResolver(routeProcessor); if (instanceState != null) { bridge.restoreInstanceState(instanceState); diff --git a/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java b/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java index 18a7ea07e5..b260414d21 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java +++ b/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java @@ -12,11 +12,11 @@ public class BridgeActivity extends AppCompatActivity { protected Bridge bridge; protected boolean keepRunning = true; - private CapConfig config; + protected CapConfig config; - private int activityDepth = 0; - private List> initialPlugins = new ArrayList<>(); - private final Bridge.Builder bridgeBuilder = new Bridge.Builder(this); + protected int activityDepth = 0; + protected List> initialPlugins = new ArrayList<>(); + protected final Bridge.Builder bridgeBuilder = new Bridge.Builder(this); @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,7 +66,7 @@ protected void load(Bundle savedInstanceState) { this.load(); } - private void load() { + protected void load() { Logger.debug("Starting BridgeActivity"); bridge = bridgeBuilder.addPlugins(initialPlugins).setConfig(config).create(); diff --git a/android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java b/android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java new file mode 100644 index 0000000000..077c20c6a7 --- /dev/null +++ b/android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java @@ -0,0 +1,8 @@ +package com.getcapacitor; + +/** + * An interface used in the processing of routes + */ +public interface RouteProcessor { + String process(String path); +} diff --git a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java index e38cb05b8b..9c99ba7b75 100755 --- a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java +++ b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -24,7 +24,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; -import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; @@ -256,6 +255,10 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH InputStream responseStream; try { String startPath = this.basePath + "/index.html"; + if (bridge.getRequestPathResolver() != null) { + startPath = this.basePath + bridge.getRequestPathResolver().process("/index.html"); + } + if (isAsset) { responseStream = protocolHandler.openAsset(startPath); } else { @@ -467,6 +470,13 @@ private void createHostingDetails() { public InputStream handle(Uri url) { InputStream stream = null; String path = url.getPath(); + + // Pass path to requestPathResolver if present + RouteProcessor routeProcessor = bridge.getRequestPathResolver(); + if(routeProcessor != null) { + path = bridge.getRequestPathResolver().process(path); + } + try { if (path.startsWith(capacitorContentStart)) { stream = protocolHandler.openContentUrl(url); From 7919e83062b0ccf1d2467e551d25892f516f91e5 Mon Sep 17 00:00:00 2001 From: Carl Poole Date: Wed, 30 Mar 2022 16:14:31 -0500 Subject: [PATCH 2/3] updated naming --- .../src/main/java/com/getcapacitor/Bridge.java | 8 ++++---- .../main/java/com/getcapacitor/WebViewLocalServer.java | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java index ac6c9c51d0..50d961f2a6 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java @@ -1193,11 +1193,11 @@ void setWebViewListeners(List webViewListeners) { this.webViewListeners = webViewListeners; } - RouteProcessor getRequestPathResolver() { + RouteProcessor getRouteProcessor() { return routeProcessor; } - void setRequestPathResolver(RouteProcessor routeProcessor) { + void setRouteProcessor(RouteProcessor routeProcessor) { this.routeProcessor = routeProcessor; } @@ -1277,7 +1277,7 @@ public Builder addWebViewListeners(List webViewListeners) { return this; } - public Builder setRequestPathResolver(RouteProcessor routeProcessor) { + public Builder setRouteProcessor(RouteProcessor routeProcessor) { this.routeProcessor = routeProcessor; return this; } @@ -1305,7 +1305,7 @@ public Bridge create() { Bridge bridge = new Bridge(activity, fragment, webView, plugins, cordovaInterface, pluginManager, preferences, config); bridge.setCordovaWebView(mockWebView); bridge.setWebViewListeners(webViewListeners); - bridge.setRequestPathResolver(routeProcessor); + bridge.setRouteProcessor(routeProcessor); if (instanceState != null) { bridge.restoreInstanceState(instanceState); diff --git a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java index 9c99ba7b75..e6fb61b72f 100755 --- a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java +++ b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -255,8 +255,8 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH InputStream responseStream; try { String startPath = this.basePath + "/index.html"; - if (bridge.getRequestPathResolver() != null) { - startPath = this.basePath + bridge.getRequestPathResolver().process("/index.html"); + if (bridge.getRouteProcessor() != null) { + startPath = this.basePath + bridge.getRouteProcessor().process("/index.html"); } if (isAsset) { @@ -471,10 +471,10 @@ public InputStream handle(Uri url) { InputStream stream = null; String path = url.getPath(); - // Pass path to requestPathResolver if present - RouteProcessor routeProcessor = bridge.getRequestPathResolver(); + // Pass path to routeProcessor if present + RouteProcessor routeProcessor = bridge.getRouteProcessor(); if(routeProcessor != null) { - path = bridge.getRequestPathResolver().process(path); + path = bridge.getRouteProcessor().process(path); } try { From 27252e1ff73c107ba28fdbd051ebe53c59448ee5 Mon Sep 17 00:00:00 2001 From: Carl Poole Date: Wed, 30 Mar 2022 16:17:35 -0500 Subject: [PATCH 3/3] fmt --- .../src/main/java/com/getcapacitor/WebViewLocalServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java index e6fb61b72f..36ddb6bb37 100755 --- a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java +++ b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -473,7 +473,7 @@ public InputStream handle(Uri url) { // Pass path to routeProcessor if present RouteProcessor routeProcessor = bridge.getRouteProcessor(); - if(routeProcessor != null) { + if (routeProcessor != null) { path = bridge.getRouteProcessor().process(path); }