blob: effcb53a0ae3c0041ca1d685f099c1f759bcbb37 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/android/infobars/translate_infobar.h"
#include <stddef.h>
#include <utility>
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/android/jni_weak_ref.h"
#include "chrome/browser/translate/chrome_translate_client.h"
#include "components/translate/core/browser/translate_infobar_delegate.h"
#include "jni/TranslateInfoBar_jni.h"
// ChromeTranslateClient
// ----------------------------------------------------------
scoped_ptr<infobars::InfoBar> ChromeTranslateClient::CreateInfoBar(
scoped_ptr<translate::TranslateInfoBarDelegate> delegate) const {
return make_scoped_ptr(new TranslateInfoBar(std::move(delegate)));
}
// TranslateInfoBar -----------------------------------------------------------
TranslateInfoBar::TranslateInfoBar(
scoped_ptr<translate::TranslateInfoBarDelegate> delegate)
: InfoBarAndroid(std::move(delegate)) {}
TranslateInfoBar::~TranslateInfoBar() {
}
ScopedJavaLocalRef<jobject> TranslateInfoBar::CreateRenderInfoBar(JNIEnv* env) {
translate::TranslateInfoBarDelegate* delegate = GetDelegate();
std::vector<base::string16> languages;
std::vector<std::string> codes;
languages.reserve(delegate->num_languages());
codes.reserve(delegate->num_languages());
for (size_t i = 0; i < delegate->num_languages(); ++i) {
languages.push_back(delegate->language_name_at(i));
codes.push_back(delegate->language_code_at(i));
}
DCHECK(codes.size() == languages.size());
base::android::ScopedJavaLocalRef<jobjectArray> java_languages =
base::android::ToJavaArrayOfStrings(env, languages);
base::android::ScopedJavaLocalRef<jobjectArray> java_codes =
base::android::ToJavaArrayOfStrings(env, codes);
ScopedJavaLocalRef<jstring> source_language_code =
base::android::ConvertUTF8ToJavaString(
env, delegate->original_language_code());
ScopedJavaLocalRef<jstring> target_language_code =
base::android::ConvertUTF8ToJavaString(env,
delegate->target_language_code());
return Java_TranslateInfoBar_show(
env, delegate->translate_step(), source_language_code.obj(),
target_language_code.obj(), delegate->ShouldAlwaysTranslate(),
ShouldDisplayNeverTranslateInfoBarOnCancel(),
delegate->triggered_from_menu(), java_languages.obj(), java_codes.obj());
}
void TranslateInfoBar::ProcessButton(int action) {
if (!owner())
return; // We're closing; don't call anything, it might access the owner.
translate::TranslateInfoBarDelegate* delegate = GetDelegate();
if (action == InfoBarAndroid::ACTION_TRANSLATE) {
delegate->Translate();
return;
}
if (action == InfoBarAndroid::ACTION_CANCEL)
delegate->TranslationDeclined();
else if (action == InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL)
delegate->RevertTranslation();
else
DCHECK_EQ(InfoBarAndroid::ACTION_NONE, action);
RemoveSelf();
}
void TranslateInfoBar::PassJavaInfoBar(InfoBarAndroid* source) {
translate::TranslateInfoBarDelegate* delegate = GetDelegate();
DCHECK_NE(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
delegate->translate_step());
// Ask the former bar to transfer ownership to us.
DCHECK(source != NULL);
static_cast<TranslateInfoBar*>(source)->TransferOwnership(
this, delegate->translate_step());
}
void TranslateInfoBar::SetJavaInfoBar(
const base::android::JavaRef<jobject>& java_info_bar) {
InfoBarAndroid::SetJavaInfoBar(java_info_bar);
JNIEnv* env = base::android::AttachCurrentThread();
Java_TranslateInfoBar_setNativePtr(env, java_info_bar.obj(),
reinterpret_cast<intptr_t>(this));
}
void TranslateInfoBar::ApplyTranslateOptions(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& source_language_code,
const JavaParamRef<jstring>& target_language_code,
bool always_translate,
bool never_translate_language,
bool never_translate_site) {
DCHECK(env);
std::string source_code =
base::android::ConvertJavaStringToUTF8(env, source_language_code);
std::string target_code =
base::android::ConvertJavaStringToUTF8(env, target_language_code);
translate::TranslateInfoBarDelegate* delegate = GetDelegate();
delegate->UpdateOriginalLanguage(source_code);
delegate->UpdateTargetLanguage(target_code);
if (delegate->ShouldAlwaysTranslate() != always_translate)
delegate->ToggleAlwaysTranslate();
if (never_translate_language && delegate->IsTranslatableLanguageByPrefs())
delegate->ToggleTranslatableLanguageByPrefs();
if (never_translate_site && !delegate->IsSiteBlacklisted())
delegate->ToggleSiteBlacklist();
}
void TranslateInfoBar::TransferOwnership(TranslateInfoBar* destination,
translate::TranslateStep new_type) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_TranslateInfoBar_changeTranslateInfoBarType(env, GetJavaInfoBar(),
new_type);
ReassignJavaInfoBar(destination);
}
bool TranslateInfoBar::ShouldDisplayNeverTranslateInfoBarOnCancel() {
translate::TranslateInfoBarDelegate* delegate = GetDelegate();
return (delegate->translate_step() ==
translate::TRANSLATE_STEP_BEFORE_TRANSLATE) &&
delegate->ShouldShowNeverTranslateShortcut();
}
translate::TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() {
return delegate()->AsTranslateInfoBarDelegate();
}
// Native JNI methods ---------------------------------------------------------
bool RegisterTranslateInfoBarDelegate(JNIEnv* env) {
return RegisterNativesImpl(env);
}