OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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.infobar; | 5 package org.chromium.chrome.browser.infobar; |
6 | 6 |
7 import android.text.TextUtils; | 7 import android.text.TextUtils; |
8 | 8 |
9 import java.util.ArrayList; | 9 import java.util.ArrayList; |
10 import java.util.HashMap; | 10 import java.util.HashMap; |
11 import java.util.List; | 11 import java.util.List; |
12 import java.util.Map; | 12 import java.util.Map; |
13 | 13 |
14 /** | 14 /** |
15 * A class that keeps the state of the different translation options and | 15 * A class that keeps the state of the different translation options and |
16 * languages. | 16 * languages. |
17 */ | 17 */ |
18 public class TranslateOptions { | 18 public class TranslateOptions { |
19 /** | 19 /** |
20 * A container for Language Code and it's translated representation | 20 * A container for Language Code and it's translated representation and it's
native UMA |
21 * For example for Spanish when viewed from a French locale, this will conta
in es, Espagnol | 21 * specific hashcode. |
| 22 * For example for Spanish when viewed from a French locale, this will conta
in es, Espagnol, |
| 23 * 114573335 |
22 **/ | 24 **/ |
23 public static class TranslateLanguagePair { | 25 public static class TranslateLanguageData { |
24 public final String mLanguageCode; | 26 public final String mLanguageCode; |
25 public final String mLanguageRepresentation; | 27 public final String mLanguageRepresentation; |
| 28 public final Integer mLanguageUMAHashCode; |
26 | 29 |
27 public TranslateLanguagePair(String languageCode, String languageReprese
ntation) { | 30 public TranslateLanguageData( |
| 31 String languageCode, String languageRepresentation, Integer uMAh
ashCode) { |
28 assert languageCode != null; | 32 assert languageCode != null; |
29 assert languageRepresentation != null; | 33 assert languageRepresentation != null; |
30 mLanguageCode = languageCode; | 34 mLanguageCode = languageCode; |
31 mLanguageRepresentation = languageRepresentation; | 35 mLanguageRepresentation = languageRepresentation; |
| 36 mLanguageUMAHashCode = uMAhashCode; |
32 } | 37 } |
33 | 38 |
34 @Override | 39 @Override |
35 public boolean equals(Object obj) { | 40 public boolean equals(Object obj) { |
36 if (!(obj instanceof TranslateLanguagePair)) { | 41 if (!(obj instanceof TranslateLanguageData)) { |
37 return false; | 42 return false; |
38 } | 43 } |
39 TranslateLanguagePair other = (TranslateLanguagePair) obj; | 44 TranslateLanguageData other = (TranslateLanguageData) obj; |
40 return this.mLanguageCode.equals(other.mLanguageCode) | 45 return this.mLanguageCode.equals(other.mLanguageCode) |
41 && this.mLanguageRepresentation.equals(other.mLanguageRepres
entation); | 46 && this.mLanguageRepresentation.equals(other.mLanguageRepres
entation) |
| 47 && this.mLanguageUMAHashCode.equals(other.mLanguageUMAHashCo
de); |
42 } | 48 } |
43 | 49 |
44 @Override | 50 @Override |
45 public int hashCode() { | 51 public int hashCode() { |
46 return (mLanguageCode + mLanguageRepresentation).hashCode(); | 52 return (mLanguageCode + mLanguageRepresentation).hashCode(); |
47 } | 53 } |
48 | 54 |
49 @Override | 55 @Override |
50 public String toString() { | 56 public String toString() { |
51 return "mLanguageCode:" + mLanguageCode + " - mlanguageRepresentatio
n " | 57 return "mLanguageCode:" + mLanguageCode + " - mlanguageRepresentatio
n " |
52 + mLanguageRepresentation; | 58 + mLanguageRepresentation + " - mLanguageUMAHashCode " + mLa
nguageUMAHashCode; |
53 } | 59 } |
54 } | 60 } |
55 | 61 |
56 // This would be an enum but they are not good for mobile. | 62 // This would be an enum but they are not good for mobile. |
57 // The checkBoundaries method below needs to be updated if new options are a
dded. | 63 // The checkBoundaries method below needs to be updated if new options are a
dded. |
58 private static final int NEVER_LANGUAGE = 0; | 64 private static final int NEVER_LANGUAGE = 0; |
59 private static final int NEVER_DOMAIN = 1; | 65 private static final int NEVER_DOMAIN = 1; |
60 private static final int ALWAYS_LANGUAGE = 2; | 66 private static final int ALWAYS_LANGUAGE = 2; |
61 | 67 |
62 private String mSourceLanguageCode; | 68 private String mSourceLanguageCode; |
63 private String mTargetLanguageCode; | 69 private String mTargetLanguageCode; |
64 | 70 |
65 private final ArrayList<TranslateLanguagePair> mAllLanguages; | 71 private final ArrayList<TranslateLanguageData> mAllLanguages; |
66 | 72 |
67 // language code to translated language name map | 73 // language code to translated language name map |
68 // Conceptually final | 74 // Conceptually final |
69 private Map<String, String> mCodeToRepresentation; | 75 private Map<String, String> mCodeToRepresentation; |
70 | 76 |
| 77 // Langage code to its UMA hashcode representation. |
| 78 private Map<String, Integer> mCodeToUMAHashCode; |
| 79 |
71 // Will reflect the state before the object was ever modified | 80 // Will reflect the state before the object was ever modified |
72 private final boolean[] mOriginalOptions; | 81 private final boolean[] mOriginalOptions; |
73 | 82 |
74 private final String mOriginalSourceLanguageCode; | 83 private final String mOriginalSourceLanguageCode; |
75 private final String mOriginalTargetLanguageCode; | 84 private final String mOriginalTargetLanguageCode; |
76 private final boolean mTriggeredFromMenu; | 85 private final boolean mTriggeredFromMenu; |
77 | 86 |
78 private final boolean[] mOptions; | 87 private final boolean[] mOptions; |
79 | 88 |
80 private TranslateOptions(String sourceLanguageCode, String targetLanguageCod
e, | 89 private TranslateOptions(String sourceLanguageCode, String targetLanguageCod
e, |
81 ArrayList<TranslateLanguagePair> allLanguages, boolean neverLanguage
, | 90 ArrayList<TranslateLanguageData> allLanguages, boolean neverLanguage
, |
82 boolean neverDomain, boolean alwaysLanguage, boolean triggeredFromMe
nu, | 91 boolean neverDomain, boolean alwaysLanguage, boolean triggeredFromMe
nu, |
83 boolean[] originalOptions) { | 92 boolean[] originalOptions) { |
84 mOptions = new boolean[3]; | 93 mOptions = new boolean[3]; |
85 mOptions[NEVER_LANGUAGE] = neverLanguage; | 94 mOptions[NEVER_LANGUAGE] = neverLanguage; |
86 mOptions[NEVER_DOMAIN] = neverDomain; | 95 mOptions[NEVER_DOMAIN] = neverDomain; |
87 mOptions[ALWAYS_LANGUAGE] = alwaysLanguage; | 96 mOptions[ALWAYS_LANGUAGE] = alwaysLanguage; |
88 | 97 |
89 if (originalOptions == null) { | 98 if (originalOptions == null) { |
90 mOriginalOptions = mOptions.clone(); | 99 mOriginalOptions = mOptions.clone(); |
91 } else { | 100 } else { |
92 mOriginalOptions = originalOptions.clone(); | 101 mOriginalOptions = originalOptions.clone(); |
93 } | 102 } |
94 | 103 |
95 mSourceLanguageCode = sourceLanguageCode; | 104 mSourceLanguageCode = sourceLanguageCode; |
96 mTargetLanguageCode = targetLanguageCode; | 105 mTargetLanguageCode = targetLanguageCode; |
97 mOriginalSourceLanguageCode = mSourceLanguageCode; | 106 mOriginalSourceLanguageCode = mSourceLanguageCode; |
98 mOriginalTargetLanguageCode = mTargetLanguageCode; | 107 mOriginalTargetLanguageCode = mTargetLanguageCode; |
99 mTriggeredFromMenu = triggeredFromMenu; | 108 mTriggeredFromMenu = triggeredFromMenu; |
100 | 109 |
101 mAllLanguages = allLanguages; | 110 mAllLanguages = allLanguages; |
102 mCodeToRepresentation = new HashMap<String, String>(); | 111 mCodeToRepresentation = new HashMap<String, String>(); |
103 for (TranslateLanguagePair language : allLanguages) { | 112 mCodeToUMAHashCode = new HashMap<String, Integer>(); |
| 113 for (TranslateLanguageData language : allLanguages) { |
104 mCodeToRepresentation.put(language.mLanguageCode, language.mLanguage
Representation); | 114 mCodeToRepresentation.put(language.mLanguageCode, language.mLanguage
Representation); |
| 115 mCodeToUMAHashCode.put(language.mLanguageCode, language.mLanguageUMA
HashCode); |
105 } | 116 } |
106 } | 117 } |
107 | 118 |
108 /** | 119 /** |
109 * Creates a TranslateOptions by the given data. | 120 * Creates a TranslateOptions by the given data. |
110 */ | 121 */ |
111 public static TranslateOptions create(String sourceLanguageCode, String targ
etLanguageCode, | 122 public static TranslateOptions create(String sourceLanguageCode, String targ
etLanguageCode, |
112 String[] languages, String[] codes, boolean alwaysTranslate, | 123 String[] languages, String[] codes, boolean alwaysTranslate, boolean
triggeredFromMenu, |
113 boolean triggeredFromMenu) { | 124 int[] hashCodes) { |
114 assert languages.length == codes.length; | 125 assert languages.length == codes.length; |
115 | 126 |
116 ArrayList<TranslateLanguagePair> languageList = new ArrayList<TranslateL
anguagePair>(); | 127 ArrayList<TranslateLanguageData> languageList = new ArrayList<TranslateL
anguageData>(); |
117 for (int i = 0; i < languages.length; ++i) { | 128 for (int i = 0; i < languages.length; ++i) { |
118 languageList.add(new TranslateLanguagePair(codes[i], languages[i])); | 129 Integer hashCode = null; |
| 130 if (hashCodes != null) { |
| 131 hashCode = Integer.valueOf(hashCodes[i]); |
| 132 } |
| 133 |
| 134 languageList.add(new TranslateLanguageData(codes[i], languages[i], h
ashCode)); |
119 } | 135 } |
120 return new TranslateOptions(sourceLanguageCode, targetLanguageCode, lang
uageList, false, | 136 return new TranslateOptions(sourceLanguageCode, targetLanguageCode, lang
uageList, false, |
121 false, alwaysTranslate, triggeredFromMenu, null); | 137 false, alwaysTranslate, triggeredFromMenu, null); |
122 } | 138 } |
123 | 139 |
124 /** | 140 /** |
125 * Returns a copy of the current instance. | 141 * Returns a copy of the current instance. |
126 */ | 142 */ |
127 TranslateOptions copy() { | 143 TranslateOptions copy() { |
128 return new TranslateOptions(mSourceLanguageCode, mTargetLanguageCode, mA
llLanguages, | 144 return new TranslateOptions(mSourceLanguageCode, mTargetLanguageCode, mA
llLanguages, |
(...skipping 22 matching lines...) Expand all Loading... |
151 } | 167 } |
152 | 168 |
153 public boolean optionsChanged() { | 169 public boolean optionsChanged() { |
154 return (!mSourceLanguageCode.equals(mOriginalSourceLanguageCode)) | 170 return (!mSourceLanguageCode.equals(mOriginalSourceLanguageCode)) |
155 || (!mTargetLanguageCode.equals(mOriginalTargetLanguageCode)) | 171 || (!mTargetLanguageCode.equals(mOriginalTargetLanguageCode)) |
156 || (mOptions[NEVER_LANGUAGE] != mOriginalOptions[NEVER_LANGUAGE]
) | 172 || (mOptions[NEVER_LANGUAGE] != mOriginalOptions[NEVER_LANGUAGE]
) |
157 || (mOptions[NEVER_DOMAIN] != mOriginalOptions[NEVER_DOMAIN]) | 173 || (mOptions[NEVER_DOMAIN] != mOriginalOptions[NEVER_DOMAIN]) |
158 || (mOptions[ALWAYS_LANGUAGE] != mOriginalOptions[ALWAYS_LANGUAG
E]); | 174 || (mOptions[ALWAYS_LANGUAGE] != mOriginalOptions[ALWAYS_LANGUAG
E]); |
159 } | 175 } |
160 | 176 |
161 public List<TranslateLanguagePair> allLanguages() { | 177 public List<TranslateLanguageData> allLanguages() { |
162 return mAllLanguages; | 178 return mAllLanguages; |
163 } | 179 } |
164 | 180 |
165 public boolean neverTranslateLanguageState() { | 181 public boolean neverTranslateLanguageState() { |
166 return mOptions[NEVER_LANGUAGE]; | 182 return mOptions[NEVER_LANGUAGE]; |
167 } | 183 } |
168 | 184 |
169 public boolean alwaysTranslateLanguageState() { | 185 public boolean alwaysTranslateLanguageState() { |
170 return mOptions[ALWAYS_LANGUAGE]; | 186 return mOptions[ALWAYS_LANGUAGE]; |
171 } | 187 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 * @param languageCode ISO code for the language | 247 * @param languageCode ISO code for the language |
232 * @return The translated representation of the language, or "" if not found
. | 248 * @return The translated representation of the language, or "" if not found
. |
233 */ | 249 */ |
234 public String getRepresentationFromCode(String languageCode) { | 250 public String getRepresentationFromCode(String languageCode) { |
235 if (isValidLanguageCode(languageCode)) { | 251 if (isValidLanguageCode(languageCode)) { |
236 return mCodeToRepresentation.get(languageCode); | 252 return mCodeToRepresentation.get(languageCode); |
237 } | 253 } |
238 return ""; | 254 return ""; |
239 } | 255 } |
240 | 256 |
| 257 /** |
| 258 * Gets the language's UMA hashcode representation from a given language cod
e. |
| 259 * @param languageCode ISO code for the language |
| 260 * @return The UMA hashcode representation of the language, or null if not f
ound. |
| 261 */ |
| 262 public Integer getUMAHashCodeFromCode(String languageCode) { |
| 263 if (isValidLanguageUMAHashCode(languageCode)) { |
| 264 return mCodeToUMAHashCode.get(languageCode); |
| 265 } |
| 266 return null; |
| 267 } |
| 268 |
241 private boolean toggleState(int element, boolean newValue) { | 269 private boolean toggleState(int element, boolean newValue) { |
242 if (!checkElementBoundaries(element)) return false; | 270 if (!checkElementBoundaries(element)) return false; |
243 | 271 |
244 mOptions[element] = newValue; | 272 mOptions[element] = newValue; |
245 return true; | 273 return true; |
246 } | 274 } |
247 | 275 |
248 private boolean isValidLanguageCode(String languageCode) { | 276 private boolean isValidLanguageCode(String languageCode) { |
249 return !TextUtils.isEmpty(languageCode) && mCodeToRepresentation.contain
sKey(languageCode); | 277 return !TextUtils.isEmpty(languageCode) && mCodeToRepresentation.contain
sKey(languageCode); |
250 } | 278 } |
| 279 |
| 280 private boolean isValidLanguageUMAHashCode(String languageCode) { |
| 281 return !TextUtils.isEmpty(languageCode) && mCodeToUMAHashCode.containsKe
y(languageCode); |
| 282 } |
| 283 |
251 private boolean canSetLanguage(String sourceCode, String targetCode) { | 284 private boolean canSetLanguage(String sourceCode, String targetCode) { |
252 return isValidLanguageCode(sourceCode) && isValidLanguageCode(targetCode
) | 285 return isValidLanguageCode(sourceCode) && isValidLanguageCode(targetCode
) |
253 && !sourceCode.equals(targetCode); | 286 && !sourceCode.equals(targetCode); |
254 } | 287 } |
255 | 288 |
256 private static boolean checkElementBoundaries(int element) { | 289 private static boolean checkElementBoundaries(int element) { |
257 return element >= NEVER_LANGUAGE && element <= ALWAYS_LANGUAGE; | 290 return element >= NEVER_LANGUAGE && element <= ALWAYS_LANGUAGE; |
258 } | 291 } |
259 | 292 |
260 @Override | 293 @Override |
261 public String toString() { | 294 public String toString() { |
262 return new StringBuilder() | 295 return new StringBuilder() |
263 .append(sourceLanguageCode()) | 296 .append(sourceLanguageCode()) |
264 .append(" -> ") | 297 .append(" -> ") |
265 .append(targetLanguageCode()) | 298 .append(targetLanguageCode()) |
266 .append(" - ") | 299 .append(" - ") |
267 .append("Never Language:") | 300 .append("Never Language:") |
268 .append(mOptions[NEVER_LANGUAGE]) | 301 .append(mOptions[NEVER_LANGUAGE]) |
269 .append(" Always Language:") | 302 .append(" Always Language:") |
270 .append(mOptions[ALWAYS_LANGUAGE]) | 303 .append(mOptions[ALWAYS_LANGUAGE]) |
271 .append(" Never Domain:") | 304 .append(" Never Domain:") |
272 .append(mOptions[NEVER_DOMAIN]) | 305 .append(mOptions[NEVER_DOMAIN]) |
273 .toString(); | 306 .toString(); |
274 } | 307 } |
275 } | 308 } |
OLD | NEW |