| 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 == other.mLanguageUMAHashCode; |
| 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> mCodeToHashCodeRepresentation; |
| 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 mCodeToHashCodeRepresentation = 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 mCodeToHashCodeRepresentation.put( |
| 116 language.mLanguageCode, language.mLanguageUMAHashCode); |
| 105 } | 117 } |
| 106 } | 118 } |
| 107 | 119 |
| 108 /** | 120 /** |
| 109 * Creates a TranslateOptions by the given data. | 121 * Creates a TranslateOptions by the given data. |
| 110 */ | 122 */ |
| 111 public static TranslateOptions create(String sourceLanguageCode, String targ
etLanguageCode, | 123 public static TranslateOptions create(String sourceLanguageCode, String targ
etLanguageCode, |
| 112 String[] languages, String[] codes, boolean alwaysTranslate, | 124 String[] languages, String[] codes, boolean alwaysTranslate, boolean
triggeredFromMenu, |
| 113 boolean triggeredFromMenu) { | 125 int[] hashCodes) { |
| 114 assert languages.length == codes.length; | 126 assert languages.length == codes.length; |
| 115 | 127 |
| 116 ArrayList<TranslateLanguagePair> languageList = new ArrayList<TranslateL
anguagePair>(); | 128 ArrayList<TranslateLanguageData> languageList = new ArrayList<TranslateL
anguageData>(); |
| 117 for (int i = 0; i < languages.length; ++i) { | 129 for (int i = 0; i < languages.length; ++i) { |
| 118 languageList.add(new TranslateLanguagePair(codes[i], languages[i])); | 130 Integer hashCode = null; |
| 131 if (hashCodes != null) { |
| 132 hashCode = Integer.valueOf(hashCodes[i]); |
| 133 } |
| 134 |
| 135 languageList.add(new TranslateLanguageData(codes[i], languages[i], h
ashCode)); |
| 119 } | 136 } |
| 120 return new TranslateOptions(sourceLanguageCode, targetLanguageCode, lang
uageList, false, | 137 return new TranslateOptions(sourceLanguageCode, targetLanguageCode, lang
uageList, false, |
| 121 false, alwaysTranslate, triggeredFromMenu, null); | 138 false, alwaysTranslate, triggeredFromMenu, null); |
| 122 } | 139 } |
| 123 | 140 |
| 124 /** | 141 /** |
| 125 * Returns a copy of the current instance. | 142 * Returns a copy of the current instance. |
| 126 */ | 143 */ |
| 127 TranslateOptions copy() { | 144 TranslateOptions copy() { |
| 128 return new TranslateOptions(mSourceLanguageCode, mTargetLanguageCode, mA
llLanguages, | 145 return new TranslateOptions(mSourceLanguageCode, mTargetLanguageCode, mA
llLanguages, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 151 } | 168 } |
| 152 | 169 |
| 153 public boolean optionsChanged() { | 170 public boolean optionsChanged() { |
| 154 return (!mSourceLanguageCode.equals(mOriginalSourceLanguageCode)) | 171 return (!mSourceLanguageCode.equals(mOriginalSourceLanguageCode)) |
| 155 || (!mTargetLanguageCode.equals(mOriginalTargetLanguageCode)) | 172 || (!mTargetLanguageCode.equals(mOriginalTargetLanguageCode)) |
| 156 || (mOptions[NEVER_LANGUAGE] != mOriginalOptions[NEVER_LANGUAGE]
) | 173 || (mOptions[NEVER_LANGUAGE] != mOriginalOptions[NEVER_LANGUAGE]
) |
| 157 || (mOptions[NEVER_DOMAIN] != mOriginalOptions[NEVER_DOMAIN]) | 174 || (mOptions[NEVER_DOMAIN] != mOriginalOptions[NEVER_DOMAIN]) |
| 158 || (mOptions[ALWAYS_LANGUAGE] != mOriginalOptions[ALWAYS_LANGUAG
E]); | 175 || (mOptions[ALWAYS_LANGUAGE] != mOriginalOptions[ALWAYS_LANGUAG
E]); |
| 159 } | 176 } |
| 160 | 177 |
| 161 public List<TranslateLanguagePair> allLanguages() { | 178 public List<TranslateLanguageData> allLanguages() { |
| 162 return mAllLanguages; | 179 return mAllLanguages; |
| 163 } | 180 } |
| 164 | 181 |
| 165 public boolean neverTranslateLanguageState() { | 182 public boolean neverTranslateLanguageState() { |
| 166 return mOptions[NEVER_LANGUAGE]; | 183 return mOptions[NEVER_LANGUAGE]; |
| 167 } | 184 } |
| 168 | 185 |
| 169 public boolean alwaysTranslateLanguageState() { | 186 public boolean alwaysTranslateLanguageState() { |
| 170 return mOptions[ALWAYS_LANGUAGE]; | 187 return mOptions[ALWAYS_LANGUAGE]; |
| 171 } | 188 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 * @param languageCode ISO code for the language | 248 * @param languageCode ISO code for the language |
| 232 * @return The translated representation of the language, or "" if not found
. | 249 * @return The translated representation of the language, or "" if not found
. |
| 233 */ | 250 */ |
| 234 public String getRepresentationFromCode(String languageCode) { | 251 public String getRepresentationFromCode(String languageCode) { |
| 235 if (isValidLanguageCode(languageCode)) { | 252 if (isValidLanguageCode(languageCode)) { |
| 236 return mCodeToRepresentation.get(languageCode); | 253 return mCodeToRepresentation.get(languageCode); |
| 237 } | 254 } |
| 238 return ""; | 255 return ""; |
| 239 } | 256 } |
| 240 | 257 |
| 258 /** |
| 259 * Gets the language's UMA hashcode representation from a given language cod
e. |
| 260 * @param languageCode ISO code for the language |
| 261 * @return The UMA hashcode representation of the language, or null if not f
ound. |
| 262 */ |
| 263 public Integer getUMAHashCodeRepresentationFromCode(String languageCode) { |
| 264 if (isValidLanguageUMAHashCode(languageCode)) { |
| 265 return mCodeToHashCodeRepresentation.get(languageCode); |
| 266 } |
| 267 return null; |
| 268 } |
| 269 |
| 241 private boolean toggleState(int element, boolean newValue) { | 270 private boolean toggleState(int element, boolean newValue) { |
| 242 if (!checkElementBoundaries(element)) return false; | 271 if (!checkElementBoundaries(element)) return false; |
| 243 | 272 |
| 244 mOptions[element] = newValue; | 273 mOptions[element] = newValue; |
| 245 return true; | 274 return true; |
| 246 } | 275 } |
| 247 | 276 |
| 248 private boolean isValidLanguageCode(String languageCode) { | 277 private boolean isValidLanguageCode(String languageCode) { |
| 249 return !TextUtils.isEmpty(languageCode) && mCodeToRepresentation.contain
sKey(languageCode); | 278 return !TextUtils.isEmpty(languageCode) && mCodeToRepresentation.contain
sKey(languageCode); |
| 250 } | 279 } |
| 280 |
| 281 private boolean isValidLanguageUMAHashCode(String languageCode) { |
| 282 return !TextUtils.isEmpty(languageCode) |
| 283 && mCodeToHashCodeRepresentation.containsKey(languageCode); |
| 284 } |
| 285 |
| 251 private boolean canSetLanguage(String sourceCode, String targetCode) { | 286 private boolean canSetLanguage(String sourceCode, String targetCode) { |
| 252 return isValidLanguageCode(sourceCode) && isValidLanguageCode(targetCode
) | 287 return isValidLanguageCode(sourceCode) && isValidLanguageCode(targetCode
) |
| 253 && !sourceCode.equals(targetCode); | 288 && !sourceCode.equals(targetCode); |
| 254 } | 289 } |
| 255 | 290 |
| 256 private static boolean checkElementBoundaries(int element) { | 291 private static boolean checkElementBoundaries(int element) { |
| 257 return element >= NEVER_LANGUAGE && element <= ALWAYS_LANGUAGE; | 292 return element >= NEVER_LANGUAGE && element <= ALWAYS_LANGUAGE; |
| 258 } | 293 } |
| 259 | 294 |
| 260 @Override | 295 @Override |
| 261 public String toString() { | 296 public String toString() { |
| 262 return new StringBuilder() | 297 return new StringBuilder() |
| 263 .append(sourceLanguageCode()) | 298 .append(sourceLanguageCode()) |
| 264 .append(" -> ") | 299 .append(" -> ") |
| 265 .append(targetLanguageCode()) | 300 .append(targetLanguageCode()) |
| 266 .append(" - ") | 301 .append(" - ") |
| 267 .append("Never Language:") | 302 .append("Never Language:") |
| 268 .append(mOptions[NEVER_LANGUAGE]) | 303 .append(mOptions[NEVER_LANGUAGE]) |
| 269 .append(" Always Language:") | 304 .append(" Always Language:") |
| 270 .append(mOptions[ALWAYS_LANGUAGE]) | 305 .append(mOptions[ALWAYS_LANGUAGE]) |
| 271 .append(" Never Domain:") | 306 .append(" Never Domain:") |
| 272 .append(mOptions[NEVER_DOMAIN]) | 307 .append(mOptions[NEVER_DOMAIN]) |
| 273 .toString(); | 308 .toString(); |
| 274 } | 309 } |
| 275 } | 310 } |
| OLD | NEW |