package org.wordpress.android.util; import android.content.Context; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import org.wordpress.android.WordPress; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; /** * WebViewClient that adds the ability of restrict URL loading (navigation) to a list of allowed URLs. * Generally used to disable links and navigation in admin pages. */ public class URLFilteredWebViewClient extends WebViewClient { private Set<String> allowedURLs = new LinkedHashSet<>(); private int linksDisabledMessageResId = org.wordpress.android.R.string.preview_screen_links_disabled; public URLFilteredWebViewClient() { } public URLFilteredWebViewClient(String url) { allowedURLs.add(url); } public URLFilteredWebViewClient(Collection<String> urls) { if (urls == null || urls.size() == 0) { AppLog.w(AppLog.T.UTILS, "No valid URLs passed to URLFilteredWebViewClient! " + "HTTP Links in the page are NOT disabled, and ALL URLs could be loaded by the user!!"); return; } allowedURLs.addAll(urls); } protected boolean isAllURLsAllowed() { return allowedURLs.size() == 0; } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // Found a bug on some pages where there is an incorrect // auto-redirect to file:///android_asset/webkit/. if (url.equals("file:///android_asset/webkit/")) { return true; } if (isAllURLsAllowed() || allowedURLs.contains(url)) { view.loadUrl(url); } else { // show "links are disabled" message. Context ctx = WordPress.getContext(); Toast.makeText(ctx, ctx.getText(linksDisabledMessageResId), Toast.LENGTH_SHORT).show(); } return true; } public void setLinksDisabledMessageResId(int resId) { linksDisabledMessageResId = resId; } }