Commit 698ded3b authored by Trevor Perrier's avatar Trevor Perrier Committed by Chromium LUCI CQ

[Android] Add GetAlwaysTranslateLanguages to TranslateBridge

This CL adds GetAlwaysTranslateLanguages to TranslateBridge.java and
translate_prefs.cc. This will be used by the new language settings page
on Android.  Some basic tests are added for AlwaysTranslateLanguage
related code in translate_prefs.cc.

TranslateBridge.java is also cleaned up a little.  The biggest cleanup
is that the unused function isBlockedLanguage2 is removed from both
ends of the bridge.


Bug: 1127531
Change-Id: Ia533492b92b7d298f54afcca5b82be033eb6ad71
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2626910Reviewed-by: default avatarMegan Jablonski <megjablon@chromium.org>
Reviewed-by: default avatarMax Curran <curranmax@chromium.org>
Commit-Queue: Trevor  Perrier <perrier@chromium.org>
Cr-Commit-Position: refs/heads/master@{#843348}
parent 07f137d6
...@@ -51,7 +51,6 @@ public class TranslateBridge { ...@@ -51,7 +51,6 @@ public class TranslateBridge {
/** /**
* Sets the language that the contents of the tab needs to be translated to. * Sets the language that the contents of the tab needs to be translated to.
* No-op in case target language is invalid or not supported. * No-op in case target language is invalid or not supported.
*
* @param targetLanguage language code in ISO 639 format. * @param targetLanguage language code in ISO 639 format.
*/ */
public static void setPredefinedTargetLanguage(Tab tab, String targetLanguage) { public static void setPredefinedTargetLanguage(Tab tab, String targetLanguage) {
...@@ -59,16 +58,18 @@ public class TranslateBridge { ...@@ -59,16 +58,18 @@ public class TranslateBridge {
} }
/** /**
* @return The original language code of the given tab. Empty string if no language was detected * Get the original page language of the given Tab.
* yet. * @param tab The tab to get original language code for.
* @return String The original language code. Empty string if no language has been detected.
*/ */
public static String getOriginalLanguage(Tab tab) { public static String getOriginalLanguage(Tab tab) {
return TranslateBridgeJni.get().getOriginalLanguage(tab.getWebContents()); return TranslateBridgeJni.get().getOriginalLanguage(tab.getWebContents());
} }
/** /**
* @return The current language code of the given tab. Empty string if no language was detected * Get the current page language of the given Tab.
* yet. * @param tab The tab to get current language code for.
* @return String The current language code. Empty string if no language has been detected.
*/ */
public static String getCurrentLanguage(Tab tab) { public static String getCurrentLanguage(Tab tab) {
return TranslateBridgeJni.get().getCurrentLanguage(tab.getWebContents()); return TranslateBridgeJni.get().getCurrentLanguage(tab.getWebContents());
...@@ -89,11 +90,6 @@ public class TranslateBridge { ...@@ -89,11 +90,6 @@ public class TranslateBridge {
TranslateBridgeJni.get().setDefaultTargetLanguage(targetLanguage); TranslateBridgeJni.get().setDefaultTargetLanguage(targetLanguage);
} }
/** @return whether the given string is blocked for translation. */
public static boolean isBlockedLanguage(String language) {
return TranslateBridgeJni.get().isBlockedLanguage(language);
}
/** /**
* @return The ordered set of all languages that the user's knows, ordered by how well they know * @return The ordered set of all languages that the user's knows, ordered by how well they know
* them with the most familiar listed first. * them with the most familiar listed first.
...@@ -128,7 +124,6 @@ public class TranslateBridge { ...@@ -128,7 +124,6 @@ public class TranslateBridge {
/** /**
* Reset accept-languages to its default value. * Reset accept-languages to its default value.
*
* @param defaultLocale A fall-back value such as en_US, de_DE, zh_CN, etc. * @param defaultLocale A fall-back value such as en_US, de_DE, zh_CN, etc.
*/ */
public static void resetAcceptLanguages(String defaultLocale) { public static void resetAcceptLanguages(String defaultLocale) {
...@@ -156,9 +151,15 @@ public class TranslateBridge { ...@@ -156,9 +151,15 @@ public class TranslateBridge {
return list; return list;
} }
/** @return List of languages to always translate. */
public static List<String> getAlwaysTranslateLanguages() {
List<String> list = new ArrayList<>();
TranslateBridgeJni.get().getAlwaysTranslateLanguages(list);
return list;
}
/** /**
* Update accept language for the current user. * Update accept language for the current user.
*
* @param languageCode A valid language code to update. * @param languageCode A valid language code to update.
* @param add Whether this is an "add" operation or "delete" operation. * @param add Whether this is an "add" operation or "delete" operation.
*/ */
...@@ -168,7 +169,6 @@ public class TranslateBridge { ...@@ -168,7 +169,6 @@ public class TranslateBridge {
/** /**
* Move a language to the given position of the user's accept language. * Move a language to the given position of the user's accept language.
*
* @param languageCode A valid language code to set. * @param languageCode A valid language code to set.
* @param offset The offset from the original position of the language. * @param offset The offset from the original position of the language.
*/ */
...@@ -178,7 +178,6 @@ public class TranslateBridge { ...@@ -178,7 +178,6 @@ public class TranslateBridge {
/** /**
* Given an array of language codes, sets the order of the user's accepted languages to match. * Given an array of language codes, sets the order of the user's accepted languages to match.
*
* @param codes The new order for the user's accepted languages. * @param codes The new order for the user's accepted languages.
*/ */
public static void setLanguageOrder(String[] codes) { public static void setLanguageOrder(String[] codes) {
...@@ -186,16 +185,15 @@ public class TranslateBridge { ...@@ -186,16 +185,15 @@ public class TranslateBridge {
} }
/** /**
* @param languageCode A valid language code to check. * @param language The language code to check.
* @return Whether the given language is blocked by the user. * @return boolean Whether the given string is blocked for translation.
*/ */
public static boolean isBlockedLanguage2(String languageCode) { public static boolean isBlockedLanguage(String language) {
return TranslateBridgeJni.get().isBlockedLanguage2(languageCode); return TranslateBridgeJni.get().isBlockedLanguage(language);
} }
/** /**
* Sets the blocked state of a given language. * Sets the blocked state of a given language.
*
* @param languageCode A valid language code to change. * @param languageCode A valid language code to change.
* @param blocked Whether to set language blocked. * @param blocked Whether to set language blocked.
*/ */
...@@ -233,15 +231,15 @@ public class TranslateBridge { ...@@ -233,15 +231,15 @@ public class TranslateBridge {
String getCurrentLanguage(WebContents webContents); String getCurrentLanguage(WebContents webContents);
String getTargetLanguage(); String getTargetLanguage();
void setDefaultTargetLanguage(String targetLanguage); void setDefaultTargetLanguage(String targetLanguage);
boolean isBlockedLanguage(String language);
void getModelLanguages(LinkedHashSet<String> set); void getModelLanguages(LinkedHashSet<String> set);
void resetAcceptLanguages(String defaultLocale); void resetAcceptLanguages(String defaultLocale);
void getChromeAcceptLanguages(List<LanguageItem> list); void getChromeAcceptLanguages(List<LanguageItem> list);
void getUserAcceptLanguages(List<String> list); void getUserAcceptLanguages(List<String> list);
void getAlwaysTranslateLanguages(List<String> list);
void updateUserAcceptLanguages(String language, boolean add); void updateUserAcceptLanguages(String language, boolean add);
void moveAcceptLanguage(String language, int offset); void moveAcceptLanguage(String language, int offset);
void setLanguageOrder(String[] codes); void setLanguageOrder(String[] codes);
boolean isBlockedLanguage2(String language); boolean isBlockedLanguage(String language);
void setLanguageBlockedState(String language, boolean blocked); void setLanguageBlockedState(String language, boolean blocked);
boolean getExplicitLanguageAskPromptShown(); boolean getExplicitLanguageAskPromptShown();
void setExplicitLanguageAskPromptShown(boolean shown); void setExplicitLanguageAskPromptShown(boolean shown);
......
...@@ -198,14 +198,11 @@ static void JNI_TranslateBridge_SetDefaultTargetLanguage( ...@@ -198,14 +198,11 @@ static void JNI_TranslateBridge_SetDefaultTargetLanguage(
static jboolean JNI_TranslateBridge_IsBlockedLanguage( static jboolean JNI_TranslateBridge_IsBlockedLanguage(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jstring>& j_language_string) { const base::android::JavaParamRef<jstring>& j_language_string) {
std::string language_we_might_block = std::string language_code(ConvertJavaStringToUTF8(env, j_language_string));
ConvertJavaStringToUTF8(env, j_language_string);
Profile* profile = ProfileManager::GetActiveUserProfile();
PrefService* pref_service = profile->GetPrefs();
std::unique_ptr<translate::TranslatePrefs> translate_prefs = std::unique_ptr<translate::TranslatePrefs> translate_prefs =
ChromeTranslateClient::CreateTranslatePrefs(pref_service); ChromeTranslateClient::CreateTranslatePrefs(GetPrefService());
DCHECK(translate_prefs); DCHECK(translate_prefs);
return translate_prefs->IsBlockedLanguage(language_we_might_block); return translate_prefs->IsBlockedLanguage(language_code);
} }
// Gets all the model languages and calls back to the Java // Gets all the model languages and calls back to the Java
...@@ -229,6 +226,19 @@ static void JNI_TranslateBridge_GetModelLanguages( ...@@ -229,6 +226,19 @@ static void JNI_TranslateBridge_GetModelLanguages(
} }
} }
// Gets all languages that should always be translated as a Java List.
static void JNI_TranslateBridge_GetAlwaysTranslateLanguages(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& list) {
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
ChromeTranslateClient::CreateTranslatePrefs(GetPrefService());
Java_TranslateBridge_copyStringArrayToList(
env, list,
ToJavaArrayOfStrings(env,
translate_prefs->GetAlwaysTranslateLanguages()));
}
// static // static
// Input |locales| is a comma separated locale representation that consists of // Input |locales| is a comma separated locale representation that consists of
// language tags (BCP47 compliant format). Each language tag contains a language // language tags (BCP47 compliant format). Each language tag contains a language
...@@ -410,24 +420,6 @@ static void JNI_TranslateBridge_MoveAcceptLanguage( ...@@ -410,24 +420,6 @@ static void JNI_TranslateBridge_MoveAcceptLanguage(
translate_prefs->RearrangeLanguage(language_code, where, offset, languages); translate_prefs->RearrangeLanguage(language_code, where, offset, languages);
} }
static jboolean JNI_TranslateBridge_IsBlockedLanguage2(
JNIEnv* env,
const JavaParamRef<jstring>& language) {
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
ChromeTranslateClient::CreateTranslatePrefs(GetPrefService());
std::string language_code(ConvertJavaStringToUTF8(env, language));
language::ToTranslateLanguageSynonym(&language_code);
// Application language is always blocked.
std::string app_locale = g_browser_process->GetApplicationLocale();
language::ToTranslateLanguageSynonym(&app_locale);
if (app_locale == language_code)
return true;
return translate_prefs->IsBlockedLanguage(language_code);
}
static void JNI_TranslateBridge_SetLanguageBlockedState( static void JNI_TranslateBridge_SetLanguageBlockedState(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jstring>& language, const JavaParamRef<jstring>& language,
......
...@@ -547,6 +547,22 @@ void TranslatePrefs::RemoveLanguagePairFromAlwaysTranslateList( ...@@ -547,6 +547,22 @@ void TranslatePrefs::RemoveLanguagePairFromAlwaysTranslateList(
dict->RemoveKey(original_language); dict->RemoveKey(original_language);
} }
std::vector<std::string> TranslatePrefs::GetAlwaysTranslateLanguages() const {
const base::DictionaryValue* dict =
prefs_->GetDictionary(kPrefAlwaysTranslateLists);
if (!dict) {
NOTREACHED() << "Always translate pref is unregistered";
}
std::vector<std::string> languages;
for (const auto& language_pair : dict->DictItems()) {
std::string chrome_language(language_pair.first);
language::ToChromeLanguageSynonym(&chrome_language);
languages.push_back(chrome_language);
}
return languages;
}
void TranslatePrefs::ResetBlockedLanguagesToDefault() { void TranslatePrefs::ResetBlockedLanguagesToDefault() {
language_prefs_->ResetFluentLanguagesToDefaults(); language_prefs_->ResetFluentLanguagesToDefaults();
} }
......
...@@ -240,6 +240,10 @@ class TranslatePrefs { ...@@ -240,6 +240,10 @@ class TranslatePrefs {
base::StringPiece original_language, base::StringPiece original_language,
base::StringPiece target_language); base::StringPiece target_language);
// Gets the languages that are set to always translate formatted as Chrome
// language codes.
std::vector<std::string> GetAlwaysTranslateLanguages() const;
// These methods are used to track how many times the user has denied the // These methods are used to track how many times the user has denied the
// translation for a specific language. (So we can present a UI to blocklist // translation for a specific language. (So we can present a UI to blocklist
// that language if the user keeps denying translations). // that language if the user keeps denying translations).
......
...@@ -897,6 +897,50 @@ TEST_F(TranslatePrefsTest, DefaultBlockedLanguages) { ...@@ -897,6 +897,50 @@ TEST_F(TranslatePrefsTest, DefaultBlockedLanguages) {
ExpectBlockedLanguageListContent(blocked_languages_expected); ExpectBlockedLanguageListContent(blocked_languages_expected);
} }
// Series of tests for the AlwaysTranslateLanguagesList manipulation functions.
TEST_F(TranslatePrefsTest, AlwaysTranslateLanguages) {
EXPECT_FALSE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
translate_prefs_->AddLanguagePairToAlwaysTranslateList("af", "en");
EXPECT_TRUE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
// IsLanguagePairOnAlwaysTranslateList
EXPECT_TRUE(
translate_prefs_->IsLanguagePairOnAlwaysTranslateList("af", "en"));
EXPECT_FALSE(
translate_prefs_->IsLanguagePairOnAlwaysTranslateList("af", "es"));
EXPECT_FALSE(
translate_prefs_->IsLanguagePairOnAlwaysTranslateList("am", "en"));
translate_prefs_->AddLanguagePairToAlwaysTranslateList("am", "es");
EXPECT_TRUE(
translate_prefs_->IsLanguagePairOnAlwaysTranslateList("am", "es"));
// GetAlwaysTranslateLanguages
translate_prefs_->AddLanguagePairToAlwaysTranslateList("aa", "es");
// Use 'tl' as the translate language which is 'fil' as a Chrome language.
translate_prefs_->AddLanguagePairToAlwaysTranslateList("tl", "es");
std::vector<std::string> always_translate_languages =
translate_prefs_->GetAlwaysTranslateLanguages();
EXPECT_EQ(std::vector<std::string>({"aa", "af", "am", "fil"}),
always_translate_languages);
always_translate_languages.clear();
// RemoveLanguagePairs
translate_prefs_->RemoveLanguagePairFromAlwaysTranslateList("af",
"<anything>");
always_translate_languages = translate_prefs_->GetAlwaysTranslateLanguages();
EXPECT_EQ(std::vector<std::string>({"aa", "am", "fil"}),
always_translate_languages);
translate_prefs_->RemoveLanguagePairFromAlwaysTranslateList("aa",
"<anything>");
translate_prefs_->RemoveLanguagePairFromAlwaysTranslateList("am",
"<anything>");
translate_prefs_->RemoveLanguagePairFromAlwaysTranslateList("tl",
"<anything>");
// AlwaysTranslateList should be empty now
EXPECT_FALSE(translate_prefs_->HasLanguagePairsToAlwaysTranslate());
}
TEST_F(TranslatePrefsTest, CanTranslateLanguage) { TEST_F(TranslatePrefsTest, CanTranslateLanguage) {
prefs_.SetString(language::prefs::kAcceptLanguages, "en"); prefs_.SetString(language::prefs::kAcceptLanguages, "en");
TranslateDownloadManager::GetInstance()->set_application_locale("en"); TranslateDownloadManager::GetInstance()->set_application_locale("en");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment