OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.physicalweb; | 5 package org.chromium.chrome.browser.physicalweb; |
6 | 6 |
7 import android.content.Context; | 7 import android.content.Context; |
8 import android.graphics.Bitmap; | 8 import android.graphics.Bitmap; |
9 import android.os.AsyncTask; | 9 import android.os.AsyncTask; |
10 import android.os.Build; | 10 import android.os.Build; |
11 import android.text.TextUtils; | 11 import android.text.TextUtils; |
12 | 12 |
13 import org.json.JSONArray; | 13 import org.json.JSONArray; |
14 import org.json.JSONException; | 14 import org.json.JSONException; |
15 import org.json.JSONObject; | 15 import org.json.JSONObject; |
16 | 16 |
17 import org.chromium.base.LocaleUtils; | 17 import org.chromium.base.LocaleUtils; |
18 import org.chromium.base.Log; | 18 import org.chromium.base.Log; |
19 import org.chromium.base.ThreadUtils; | 19 import org.chromium.base.ThreadUtils; |
20 import org.chromium.base.VisibleForTesting; | 20 import org.chromium.base.VisibleForTesting; |
21 import org.chromium.chrome.GoogleAPIKeys; | 21 import org.chromium.chrome.GoogleAPIKeys; |
22 import org.chromium.chrome.R; | 22 import org.chromium.chrome.R; |
23 import org.chromium.chrome.browser.ChromeVersionInfo; | 23 import org.chromium.chrome.browser.ChromeVersionInfo; |
24 import org.chromium.chrome.browser.physicalweb.PwsClient.FetchIconCallback; | 24 import org.chromium.chrome.browser.physicalweb.PwsClient.FetchIconCallback; |
25 import org.chromium.chrome.browser.physicalweb.PwsClient.ResolveScanCallback; | 25 import org.chromium.chrome.browser.physicalweb.PwsClient.ResolveScanCallback; |
26 | 26 |
27 import java.net.MalformedURLException; | 27 import java.net.MalformedURLException; |
28 import java.util.ArrayList; | 28 import java.util.ArrayList; |
29 import java.util.Collection; | 29 import java.util.Collection; |
30 import java.util.Collections; | |
31 import java.util.Formatter; | 30 import java.util.Formatter; |
32 import java.util.HashSet; | 31 import java.util.HashSet; |
33 import java.util.Locale; | 32 import java.util.Locale; |
34 | 33 |
35 /** | 34 /** |
36 * This class sends requests to the Physical Web Service. | 35 * This class sends requests to the Physical Web Service. |
37 */ | 36 */ |
38 class PwsClientImpl implements PwsClient { | 37 class PwsClientImpl implements PwsClient { |
39 private static final String TAG = "PhysicalWeb"; | 38 private static final String TAG = "PhysicalWeb"; |
40 private static final String ENDPOINT_URL = | 39 private static final String ENDPOINT_URL = |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 * chrome/browser/android/preferences/pref_service_bridge.cc | 244 * chrome/browser/android/preferences/pref_service_bridge.cc |
246 * @param locales A comma separated string that represents a list of default
locales. | 245 * @param locales A comma separated string that represents a list of default
locales. |
247 * @param acceptLanguages The default language list for the language of the
user's locales. | 246 * @param acceptLanguages The default language list for the language of the
user's locales. |
248 * @return An updated language list. | 247 * @return An updated language list. |
249 */ | 248 */ |
250 @VisibleForTesting | 249 @VisibleForTesting |
251 static String prependToAcceptLanguagesIfNecessary(String locales, String acc
eptLanguages) { | 250 static String prependToAcceptLanguagesIfNecessary(String locales, String acc
eptLanguages) { |
252 String localeStrings = locales + "," + acceptLanguages; | 251 String localeStrings = locales + "," + acceptLanguages; |
253 String[] localeList = localeStrings.split(","); | 252 String[] localeList = localeStrings.split(","); |
254 | 253 |
255 ArrayList<Locale> uniqueList = new ArrayList<>(); | 254 HashSet<Locale> seenLocales = new HashSet<>(); |
| 255 ArrayList<String> uniqueList = new ArrayList<>(); |
256 for (String localeString : localeList) { | 256 for (String localeString : localeList) { |
257 Locale locale = LocaleUtils.forLanguageTag(localeString); | 257 Locale locale = LocaleUtils.forLanguageTag(localeString); |
258 if (uniqueList.contains(locale) || locale.getLanguage().isEmpty()) { | 258 if (seenLocales.contains(locale) || locale.getLanguage().isEmpty())
{ |
259 continue; | 259 continue; |
260 } | 260 } |
261 uniqueList.add(locale); | 261 seenLocales.add(locale); |
| 262 uniqueList.add(LocaleUtils.toLanguageTag(locale)); |
262 } | 263 } |
263 | 264 return TextUtils.join(",", uniqueList); |
264 // If language is not in the accept languages list, also add language co
de. | |
265 // A language code should only be inserted after the last languageTag th
at | |
266 // contains that language. | |
267 // This will work with the IDS_ACCEPT_LANGUAGE localized strings bundled | |
268 // with Chrome but may fail on arbitrary lists of language tags due to | |
269 // differences in case and whitespace. | |
270 HashSet<String> seenLanguages = new HashSet<>(); | |
271 ArrayList<String> outputList = new ArrayList<>(); | |
272 for (int i = uniqueList.size() - 1; i >= 0; i--) { | |
273 Locale localeAdd = uniqueList.get(i); | |
274 String languageAdd = localeAdd.getLanguage(); | |
275 String countryAdd = localeAdd.getCountry(); | |
276 | |
277 if (!seenLanguages.contains(languageAdd)) { | |
278 seenLanguages.add(languageAdd); | |
279 outputList.add(languageAdd); | |
280 } | |
281 if (!countryAdd.isEmpty()) { | |
282 outputList.add(LocaleUtils.toLanguageTag(localeAdd)); | |
283 } | |
284 } | |
285 Collections.reverse(outputList); | |
286 return TextUtils.join(",", outputList); | |
287 } | 265 } |
288 | 266 |
289 /** | 267 /** |
290 * Given a list of comma-delimited language codes in decreasing order of pre
ference, insert | 268 * Given a list of comma-delimited language codes in decreasing order of pre
ference, insert |
291 * q-values to represent the relative quality/precedence of each language. T
he logic should | 269 * q-values to represent the relative quality/precedence of each language. T
he logic should |
292 * match GenerateAcceptLanguageHeader in net/http/http_util.cc. | 270 * match GenerateAcceptLanguageHeader in net/http/http_util.cc. |
293 * @param languageList A comma-delimited list of language codes containing n
o whitespace. | 271 * @param languageList A comma-delimited list of language codes containing n
o whitespace. |
294 * @return An Accept-Language header with q-values. | 272 * @return An Accept-Language header with q-values. |
295 */ | 273 */ |
296 @VisibleForTesting | 274 @VisibleForTesting |
(...skipping 12 matching lines...) Expand all Loading... |
309 langListWithQ.format(",%s;q=0.%d", language, qvalue10); | 287 langListWithQ.format(",%s;q=0.%d", language, qvalue10); |
310 } | 288 } |
311 // It does not make sense to have 'q=0'. | 289 // It does not make sense to have 'q=0'. |
312 if (qvalue10 > kQvalueDecrement10) { | 290 if (qvalue10 > kQvalueDecrement10) { |
313 qvalue10 -= kQvalueDecrement10; | 291 qvalue10 -= kQvalueDecrement10; |
314 } | 292 } |
315 } | 293 } |
316 return langListWithQ.toString(); | 294 return langListWithQ.toString(); |
317 } | 295 } |
318 } | 296 } |
OLD | NEW |