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
3 // found in the LICENSE file.
5 package org.chromium.chrome.browser.infobar;
7 import java.util.ArrayList;
8 import java.util.Arrays;
9 import java.util.Collections;
10 import java.util.List;
14 * A class that keeps the state of the different translation options and
17 public class TranslateOptions {
19 // This would be an enum but they are not good for mobile.
20 // The checkBoundaries method below needs to be updated if new options are added.
21 private static final int NEVER_LANGUAGE = 0;
22 private static final int NEVER_DOMAIN = 1;
23 private static final int ALWAYS_LANGUAGE = 2;
25 private final String[] mAllLanguages;
27 // Will reflect the state before the object was ever modified
28 private final boolean[] mOriginalOptions;
29 private final int mOriginalSourceLanguageIndex;
30 private final int mOriginalTargetLanguageIndex;
32 private boolean[] mOptions;
33 private int mSourceLanguageIndex;
34 private int mTargetLanguageIndex;
36 private TranslateOptions(int sourceLanguageCode, int targetLanguageCode, String[] allLanguages,
37 boolean neverLanguage, boolean neverDomain, boolean alwaysLanguage,
38 boolean[] originalOptions) {
39 mAllLanguages = allLanguages;
40 mSourceLanguageIndex = sourceLanguageCode;
41 mTargetLanguageIndex = targetLanguageCode;
43 mOptions = new boolean[3];
44 mOptions[NEVER_LANGUAGE] = neverLanguage;
45 mOptions[NEVER_DOMAIN] = neverDomain;
46 mOptions[ALWAYS_LANGUAGE] = alwaysLanguage;
49 if (originalOptions == null) {
50 mOriginalOptions = mOptions.clone();
52 mOriginalOptions = originalOptions.clone();
55 mOriginalSourceLanguageIndex = mSourceLanguageIndex;
56 mOriginalTargetLanguageIndex = mTargetLanguageIndex;
59 public TranslateOptions(int sourceLanguageCode, int targetLanguageCode, String[] allLanguages,
60 boolean alwaysTranslate) {
61 this(sourceLanguageCode, targetLanguageCode, allLanguages, false, false, alwaysTranslate,
68 public TranslateOptions(TranslateOptions other) {
69 this(other.mSourceLanguageIndex, other.mTargetLanguageIndex, other.mAllLanguages,
70 other.mOptions[NEVER_LANGUAGE], other.mOptions[NEVER_DOMAIN],
71 other.mOptions[ALWAYS_LANGUAGE], other.mOriginalOptions);
74 public String sourceLanguage() {
75 if (checkLanguageBoundaries(mSourceLanguageIndex))
76 return mAllLanguages[mSourceLanguageIndex];
80 public String targetLanguage() {
81 if (checkLanguageBoundaries(mTargetLanguageIndex))
82 return mAllLanguages[mTargetLanguageIndex];
86 public int sourceLanguageIndex() {
87 return checkLanguageBoundaries(mSourceLanguageIndex) ? mSourceLanguageIndex : 0;
90 public int targetLanguageIndex() {
91 return checkLanguageBoundaries(mTargetLanguageIndex) ? mTargetLanguageIndex : 0;
94 public boolean optionsChanged() {
95 return (mSourceLanguageIndex != mOriginalSourceLanguageIndex) ||
96 (mTargetLanguageIndex != mOriginalTargetLanguageIndex) ||
97 (mOptions[NEVER_LANGUAGE] != mOriginalOptions[NEVER_LANGUAGE]) ||
98 (mOptions[NEVER_DOMAIN] != mOriginalOptions[NEVER_DOMAIN]) ||
99 (mOptions[ALWAYS_LANGUAGE] != mOriginalOptions[ALWAYS_LANGUAGE]);
103 public List<String> allLanguages() {
104 return Collections.unmodifiableList(Arrays.asList(mAllLanguages));
107 public boolean neverTranslateLanguageState() {
108 return mOptions[NEVER_LANGUAGE];
111 public boolean alwaysTranslateLanguageState() {
112 return mOptions[ALWAYS_LANGUAGE];
115 public boolean neverTranslateDomainState() {
116 return mOptions[NEVER_DOMAIN];
119 public boolean setSourceLanguage(int languageIndex) {
120 boolean canSet = canSetLanguage(languageIndex, mTargetLanguageIndex);
122 mSourceLanguageIndex = languageIndex;
127 public boolean setTargetLanguage(int languageIndex) {
128 boolean canSet = canSetLanguage(mSourceLanguageIndex, languageIndex);
130 mTargetLanguageIndex = languageIndex;
136 * Sets the new state of never translate domain.
138 * @return true if the toggling was possible
140 public boolean toggleNeverTranslateDomainState(boolean value) {
141 return toggleState(NEVER_DOMAIN, value);
145 * Sets the new state of never translate language.
147 * @return true if the toggling was possible
149 public boolean toggleNeverTranslateLanguageState(boolean value) {
150 // Do not toggle if we are activating NeverLanguge but AlwaysTranslate
151 // for a language pair with the same source language is already active.
152 if (mOptions[ALWAYS_LANGUAGE] && value) {
155 return toggleState(NEVER_LANGUAGE, value);
159 * Sets the new state of never translate a language pair.
161 * @return true if the toggling was possible
163 public boolean toggleAlwaysTranslateLanguageState(boolean value) {
164 // Do not toggle if we are activating AlwaysLanguge but NeverLanguage is active already.
165 if (mOptions[NEVER_LANGUAGE] && value) {
168 return toggleState(ALWAYS_LANGUAGE, value);
171 private boolean toggleState(int element, boolean newValue) {
172 if (!checkElementBoundaries(element))
175 mOptions[element] = newValue;
180 private boolean checkLanguageBoundaries(int index) {
181 return index >= 0 && index < mAllLanguages.length;
184 private boolean canSetLanguage(int sourceIndex, int targetIndex) {
185 if (sourceIndex == targetIndex)
187 return checkLanguageBoundaries(sourceIndex) && checkLanguageBoundaries(targetIndex);
191 private static boolean checkElementBoundaries(int element) {
192 return element >= NEVER_LANGUAGE && element <= ALWAYS_LANGUAGE;
196 public String toString() {
197 return new StringBuilder()
198 .append(sourceLanguage())
200 .append(targetLanguage())
202 .append("Never Language:")
203 .append(mOptions[NEVER_LANGUAGE])
204 .append(" Always Language:")
205 .append(mOptions[ALWAYS_LANGUAGE])
206 .append(" Never Domain:")
207 .append(mOptions[NEVER_DOMAIN])