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 {
/**
* 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.
*
* @param targetLanguage language code in ISO 639 format.
*/
public static void setPredefinedTargetLanguage(Tab tab, String targetLanguage) {
......@@ -59,16 +58,18 @@ public class TranslateBridge {
}
/**
* @return The original language code of the given tab. Empty string if no language was detected
* yet.
* Get the original page language of the given Tab.
* @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) {
return TranslateBridgeJni.get().getOriginalLanguage(tab.getWebContents());
}
/**
* @return The current language code of the given tab. Empty string if no language was detected
* yet.
* Get the current page language of the given Tab.
* @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) {
return TranslateBridgeJni.get().getCurrentLanguage(tab.getWebContents());
......@@ -89,11 +90,6 @@ public class TranslateBridge {
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
* them with the most familiar listed first.
......@@ -128,7 +124,6 @@ public class TranslateBridge {
/**
* Reset accept-languages to its default value.
*
* @param defaultLocale A fall-back value such as en_US, de_DE, zh_CN, etc.
*/
public static void resetAcceptLanguages(String defaultLocale) {
......@@ -156,9 +151,15 @@ public class TranslateBridge {
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.
*
* @param languageCode A valid language code to update.
* @param add Whether this is an "add" operation or "delete" operation.
*/
......@@ -168,7 +169,6 @@ public class TranslateBridge {
/**
* Move a language to the given position of the user's accept language.
*
* @param languageCode A valid language code to set.
* @param offset The offset from the original position of the language.
*/
......@@ -178,7 +178,6 @@ public class TranslateBridge {
/**
* 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.
*/
public static void setLanguageOrder(String[] codes) {
......@@ -186,16 +185,15 @@ public class TranslateBridge {
}
/**
* @param languageCode A valid language code to check.
* @return Whether the given language is blocked by the user.
* @param language The language code to check.
* @return boolean Whether the given string is blocked for translation.
*/
public static boolean isBlockedLanguage2(String languageCode) {
return TranslateBridgeJni.get().isBlockedLanguage2(languageCode);
public static boolean isBlockedLanguage(String language) {
return TranslateBridgeJni.get().isBlockedLanguage(language);
}
/**
* Sets the blocked state of a given language.
*
* @param languageCode A valid language code to change.
* @param blocked Whether to set language blocked.
*/
......@@ -233,15 +231,15 @@ public class TranslateBridge {
String getCurrentLanguage(WebContents webContents);
String getTargetLanguage();
void setDefaultTargetLanguage(String targetLanguage);
boolean isBlockedLanguage(String language);
void getModelLanguages(LinkedHashSet<String> set);
void resetAcceptLanguages(String defaultLocale);
void getChromeAcceptLanguages(List<LanguageItem> list);
void getUserAcceptLanguages(List<String> list);
void getAlwaysTranslateLanguages(List<String> list);
void updateUserAcceptLanguages(String language, boolean add);
void moveAcceptLanguage(String language, int offset);
void setLanguageOrder(String[] codes);
boolean isBlockedLanguage2(String language);
boolean isBlockedLanguage(String language);
void setLanguageBlockedState(String language, boolean blocked);
boolean getExplicitLanguageAskPromptShown();
void setExplicitLanguageAskPromptShown(boolean shown);
......
......@@ -198,14 +198,11 @@ static void JNI_TranslateBridge_SetDefaultTargetLanguage(
static jboolean JNI_TranslateBridge_IsBlockedLanguage(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& j_language_string) {
std::string language_we_might_block =
ConvertJavaStringToUTF8(env, j_language_string);
Profile* profile = ProfileManager::GetActiveUserProfile();
PrefService* pref_service = profile->GetPrefs();
std::string language_code(ConvertJavaStringToUTF8(env, j_language_string));
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
ChromeTranslateClient::CreateTranslatePrefs(pref_service);
ChromeTranslateClient::CreateTranslatePrefs(GetPrefService());
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
......@@ -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
// Input |locales| is a comma separated locale representation that consists of
// language tags (BCP47 compliant format). Each language tag contains a language
......@@ -410,24 +420,6 @@ static void JNI_TranslateBridge_MoveAcceptLanguage(
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(
JNIEnv* env,
const JavaParamRef<jstring>& language,
......
......@@ -547,6 +547,22 @@ void TranslatePrefs::RemoveLanguagePairFromAlwaysTranslateList(
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() {
language_prefs_->ResetFluentLanguagesToDefaults();
}
......
......@@ -240,6 +240,10 @@ class TranslatePrefs {
base::StringPiece original_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
// translation for a specific language. (So we can present a UI to blocklist
// that language if the user keeps denying translations).
......
......@@ -897,6 +897,50 @@ TEST_F(TranslatePrefsTest, DefaultBlockedLanguages) {
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) {
prefs_.SetString(language::prefs::kAcceptLanguages, "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