diff -r 000000000000 -r 6474c204b198 mobile/android/base/sync/setup/activities/WebURLFinder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/sync/setup/activities/WebURLFinder.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,135 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.sync.setup.activities; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.regex.Matcher; + +import android.util.Patterns; + +public class WebURLFinder { + public final List candidates; + + public WebURLFinder(String string) { + if (string == null) { + throw new IllegalArgumentException("string must not be null"); + } + + this.candidates = candidateWebURLs(string); + } + + public WebURLFinder(List strings) { + if (strings == null) { + throw new IllegalArgumentException("strings must not be null"); + } + + this.candidates = candidateWebURLs(strings); + } + + /** + * Check if string is a Web URL. + *

+ * A Web URL is a URI that is not a file: or + * javascript: scheme. + * + * @param string + * to check. + * @return true if string is a Web URL. + */ + public static boolean isWebURL(String string) { + try { + new URI(string); + } catch (Exception e) { + return false; + } + + if (android.webkit.URLUtil.isFileUrl(string) || + android.webkit.URLUtil.isJavaScriptUrl(string)) { + return false; + } + + return true; + } + + /** + * Return best Web URL. + *

+ * "Best" means a Web URL with a scheme, and failing that, a Web URL without a + * scheme. + * + * @return a Web URL or null. + */ + public String bestWebURL() { + String firstWebURLWithScheme = firstWebURLWithScheme(); + if (firstWebURLWithScheme != null) { + return firstWebURLWithScheme; + } + + return firstWebURLWithoutScheme(); + } + + protected static List candidateWebURLs(Collection strings) { + List candidates = new ArrayList(); + + for (String string : strings) { + if (string == null) { + continue; + } + + candidates.addAll(candidateWebURLs(string)); + } + + return candidates; + } + + protected static List candidateWebURLs(String string) { + Matcher matcher = Patterns.WEB_URL.matcher(string); + List matches = new LinkedList(); + + while (matcher.find()) { + // Remove URLs with bad schemes. + if (!isWebURL(matcher.group())) { + continue; + } + + // Remove parts of email addresses. + if (matcher.start() > 0 && (string.charAt(matcher.start() - 1) == '@')) { + continue; + } + + matches.add(matcher.group()); + } + + return matches; + } + + protected String firstWebURLWithScheme() { + for (String match : candidates) { + try { + if (new URI(match).getScheme() != null) { + return match; + } + } catch (URISyntaxException e) { + // Ignore: on to the next. + continue; + } + } + + return null; + } + + protected String firstWebURLWithoutScheme() { + if (!candidates.isEmpty()) { + return candidates.get(0); + } + + return null; + } +}