|
1 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- |
|
2 * This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 package org.mozilla.gecko.util; |
|
7 |
|
8 import android.net.Uri; |
|
9 import android.text.TextUtils; |
|
10 |
|
11 public class StringUtils { |
|
12 |
|
13 private static final String FILTER_URL_PREFIX = "filter://"; |
|
14 |
|
15 /* |
|
16 * This method tries to guess if the given string could be a search query or URL, |
|
17 * and returns a previous result if there is ambiguity |
|
18 * |
|
19 * Search examples: |
|
20 * foo |
|
21 * foo bar.com |
|
22 * foo http://bar.com |
|
23 * |
|
24 * URL examples |
|
25 * foo.com |
|
26 * foo.c |
|
27 * :foo |
|
28 * http://foo.com bar |
|
29 * |
|
30 * wasSearchQuery specifies whether text was a search query before the latest change |
|
31 * in text. In ambiguous cases where the new text can be either a search or a URL, |
|
32 * wasSearchQuery is returned |
|
33 */ |
|
34 public static boolean isSearchQuery(String text, boolean wasSearchQuery) { |
|
35 // We remove leading and trailing white spaces when decoding URLs |
|
36 text = text.trim(); |
|
37 if (text.length() == 0) |
|
38 return wasSearchQuery; |
|
39 |
|
40 int colon = text.indexOf(':'); |
|
41 int dot = text.indexOf('.'); |
|
42 int space = text.indexOf(' '); |
|
43 |
|
44 // If a space is found before any dot and colon, we assume this is a search query |
|
45 if (space > -1 && (colon == -1 || space < colon) && (dot == -1 || space < dot)) { |
|
46 return true; |
|
47 } |
|
48 // Otherwise, if a dot or a colon is found, we assume this is a URL |
|
49 if (dot > -1 || colon > -1) { |
|
50 return false; |
|
51 } |
|
52 // Otherwise, text is ambiguous, and we keep its status unchanged |
|
53 return wasSearchQuery; |
|
54 } |
|
55 |
|
56 public static class UrlFlags { |
|
57 public static final int NONE = 0; |
|
58 public static final int STRIP_HTTPS = 1; |
|
59 } |
|
60 |
|
61 public static String stripScheme(String url) { |
|
62 return stripScheme(url, UrlFlags.NONE); |
|
63 } |
|
64 |
|
65 public static String stripScheme(String url, int flags) { |
|
66 if (url == null) { |
|
67 return url; |
|
68 } |
|
69 |
|
70 int start = 0; |
|
71 int end = url.length(); |
|
72 |
|
73 if (url.startsWith("http://")) { |
|
74 start = 7; |
|
75 } else if (url.startsWith("https://") && flags == UrlFlags.STRIP_HTTPS) { |
|
76 start = 8; |
|
77 } |
|
78 |
|
79 if (url.endsWith("/")) { |
|
80 end--; |
|
81 } |
|
82 |
|
83 return url.substring(start, end); |
|
84 } |
|
85 |
|
86 public static String stripCommonSubdomains(String host) { |
|
87 if (host == null) { |
|
88 return host; |
|
89 } |
|
90 |
|
91 // In contrast to desktop, we also strip mobile subdomains, |
|
92 // since its unlikely users are intentionally typing them |
|
93 int start = 0; |
|
94 |
|
95 if (host.startsWith("www.")) { |
|
96 start = 4; |
|
97 } else if (host.startsWith("mobile.")) { |
|
98 start = 7; |
|
99 } else if (host.startsWith("m.")) { |
|
100 start = 2; |
|
101 } |
|
102 |
|
103 return host.substring(start); |
|
104 } |
|
105 |
|
106 /** |
|
107 * Searches the url query string for the first value with the given key. |
|
108 */ |
|
109 public static String getQueryParameter(String url, String desiredKey) { |
|
110 if (TextUtils.isEmpty(url) || TextUtils.isEmpty(desiredKey)) { |
|
111 return null; |
|
112 } |
|
113 |
|
114 final String[] urlParts = url.split("\\?"); |
|
115 if (urlParts.length < 2) { |
|
116 return null; |
|
117 } |
|
118 |
|
119 final String query = urlParts[1]; |
|
120 for (final String param : query.split("&")) { |
|
121 final String pair[] = param.split("="); |
|
122 final String key = Uri.decode(pair[0]); |
|
123 |
|
124 // Key is empty or does not match the key we're looking for, discard |
|
125 if (TextUtils.isEmpty(key) || !key.equals(desiredKey)) { |
|
126 continue; |
|
127 } |
|
128 // No value associated with key, discard |
|
129 if (pair.length < 2) { |
|
130 continue; |
|
131 } |
|
132 final String value = Uri.decode(pair[1]); |
|
133 if (TextUtils.isEmpty(value)) { |
|
134 return null; |
|
135 } |
|
136 return value; |
|
137 } |
|
138 |
|
139 return null; |
|
140 } |
|
141 |
|
142 public static boolean isFilterUrl(String url) { |
|
143 if (TextUtils.isEmpty(url)) { |
|
144 return false; |
|
145 } |
|
146 |
|
147 return url.startsWith(FILTER_URL_PREFIX); |
|
148 } |
|
149 |
|
150 public static String getFilterFromUrl(String url) { |
|
151 if (TextUtils.isEmpty(url)) { |
|
152 return null; |
|
153 } |
|
154 |
|
155 return url.substring(FILTER_URL_PREFIX.length()); |
|
156 } |
|
157 } |