Skip to content

Commit 794f250

Browse files
committed
Merge branch 'bitrefill-links'
2 parents dbc5e9c + 21eb1fa commit 794f250

File tree

5 files changed

+58
-16
lines changed

5 files changed

+58
-16
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Android: fix connectivity misdetection when switching between WIFI and cellular network.
88
- Android: dropped support for Android versions lower than 7.
99
- Sort backups from newest to oldest in manage backups
10+
- Android: fix display of external links from Bitrefill
1011

1112
## v4.49.0
1213
- Bundle BitBox02 Nova firmware version v9.24.0

frontends/android/BitBoxApp/app/src/main/java/ch/shiftcrypto/bitboxapp/BitBoxWebChromeClient.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import android.Manifest;
44
import android.content.pm.PackageManager;
55
import android.net.Uri;
6+
import android.os.Message;
67
import android.webkit.ConsoleMessage;
78
import android.webkit.MimeTypeMap;
89
import android.webkit.PermissionRequest;
910
import android.webkit.ValueCallback;
1011
import android.webkit.WebChromeClient;
12+
import android.webkit.WebResourceRequest;
1113
import android.webkit.WebView;
14+
import android.webkit.WebViewClient;
1215

1316
import androidx.activity.result.ActivityResultLauncher;
1417
import androidx.annotation.NonNull;
@@ -105,6 +108,33 @@ public void onCameraPermissionResult(boolean granted) {
105108
}
106109
}
107110

111+
@Override
112+
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
113+
// Handle window.open()/target=_blank by opening allowed domains externally.
114+
WebView tempView = new WebView(view.getContext());
115+
tempView.setWebViewClient(new WebViewClient() {
116+
@Override
117+
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) {
118+
String url = request.getUrl().toString();
119+
String host = request.getUrl().getHost();
120+
try {
121+
if (Util.isAllowedExternalHost(host)) {
122+
Util.systemOpen((android.app.Application) context, url);
123+
return true;
124+
}
125+
} catch (Exception e) {
126+
Util.log(e.getMessage());
127+
}
128+
Util.log("Blocked: " + url);
129+
return true;
130+
}
131+
});
132+
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
133+
transport.setWebView(tempView);
134+
resultMsg.sendToTarget();
135+
return true;
136+
}
137+
108138
public interface CameraPermissionDelegate {
109139
void requestCameraPermission(); // triggers ActivityCompat.requestPermissions(...)
110140
}

frontends/android/BitBoxApp/app/src/main/java/ch/shiftcrypto/bitboxapp/BitBoxWebViewClient.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@
1010
import java.io.ByteArrayInputStream;
1111
import java.io.IOException;
1212
import java.io.InputStream;
13-
import java.util.ArrayList;
14-
import java.util.List;
15-
import java.util.regex.Pattern;
1613

1714
public class BitBoxWebViewClient extends WebViewClient {
1815
private final String baseUrl;
@@ -72,19 +69,10 @@ public boolean shouldOverrideUrlLoading(WebView view, android.webkit.WebResource
7269
String url = request.getUrl().toString();
7370

7471
try {
75-
// Allow opening in external browser instead, for listed domains.
76-
List<Pattern> patterns = new ArrayList<>();
77-
patterns.add(Pattern.compile("^(.*\\.)?pocketbitcoin\\.com$"));
78-
patterns.add(Pattern.compile("^(.*\\.)?moonpay\\.com$"));
79-
patterns.add(Pattern.compile("^(.*\\.)?bitsurance\\.eu$"));
80-
patterns.add(Pattern.compile("^(.*\\.)?btcdirect\\.eu$"));
81-
82-
for (Pattern pattern : patterns) {
83-
String host = request.getUrl().getHost();
84-
if (host != null && pattern.matcher(host).matches()) {
85-
Util.systemOpen(appContext, url);
86-
return true;
87-
}
72+
String host = request.getUrl().getHost();
73+
if (Util.isAllowedExternalHost(host)) {
74+
Util.systemOpen(appContext, url);
75+
return true;
8876
}
8977
} catch (Exception e) {
9078
Util.log(e.getMessage());

frontends/android/BitBoxApp/app/src/main/java/ch/shiftcrypto/bitboxapp/MainActivity.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ protected void onCreate(Bundle savedInstanceState) {
166166
vw.getSettings().setJavaScriptEnabled(true);
167167
vw.getSettings().setAllowUniversalAccessFromFileURLs(true);
168168
vw.getSettings().setAllowFileAccess(true);
169+
// Allow widgets to open external links via window.open (handled in BitBoxWebChromeClient).
170+
vw.getSettings().setSupportMultipleWindows(true);
169171

170172
// For Moonpay widget: DOM storage and WebRTC camera access required.
171173
vw.getSettings().setDomStorageEnabled(true);

frontends/android/BitBoxApp/app/src/main/java/ch/shiftcrypto/bitboxapp/Util.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,29 @@
1212
import androidx.core.content.FileProvider;
1313

1414
import java.io.File;
15+
import java.util.regex.Pattern;
1516

1617
public class Util {
18+
private static final Pattern[] ALLOWED_EXTERNAL_HOSTS = new Pattern[]{
19+
Pattern.compile("^(.*\\.)?pocketbitcoin\\.com$"),
20+
Pattern.compile("^(.*\\.)?moonpay\\.com$"),
21+
Pattern.compile("^(.*\\.)?bitsurance\\.eu$"),
22+
Pattern.compile("^(.*\\.)?btcdirect\\.eu$"),
23+
Pattern.compile("^(.*\\.)?bitrefill\\.com$")
24+
};
25+
26+
public static boolean isAllowedExternalHost(String host) {
27+
if (host == null) {
28+
return false;
29+
}
30+
for (Pattern pattern : ALLOWED_EXTERNAL_HOSTS) {
31+
if (pattern.matcher(host).matches()) {
32+
return true;
33+
}
34+
}
35+
return false;
36+
}
37+
1738
public static void systemOpen(Application application, String url) throws Exception {
1839
Context context = application.getApplicationContext();
1940
Intent intent;

0 commit comments

Comments
 (0)