| Index: chrome/browser/ui/android/infobars/translate_infobar.cc
|
| ===================================================================
|
| --- chrome/browser/ui/android/infobars/translate_infobar.cc (revision 226624)
|
| +++ chrome/browser/ui/android/infobars/translate_infobar.cc (working copy)
|
| @@ -12,131 +12,133 @@
|
| #include "jni/TranslateInfoBarDelegate_jni.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| -using base::android::AttachCurrentThread;
|
| -using base::android::ScopedJavaLocalRef;
|
|
|
| +// TranslateInfoBarDelegate ---------------------------------------------------
|
| +
|
| // static
|
| -InfoBar* TranslateInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
|
| - return new TranslateInfoBar(owner, this);
|
| +scoped_ptr<InfoBar> TranslateInfoBarDelegate::CreateInfoBar(
|
| + scoped_ptr<TranslateInfoBarDelegate> delegate) {
|
| + return scoped_ptr<InfoBar>(new TranslateInfoBar(delegate.Pass()));
|
| }
|
|
|
| -TranslateInfoBar::TranslateInfoBar(InfoBarService* owner,
|
| - TranslateInfoBarDelegate* delegate)
|
| - : InfoBarAndroid(owner, delegate),
|
| - delegate_(delegate),
|
| +
|
| +// TranslateInfoBar -----------------------------------------------------------
|
| +
|
| +TranslateInfoBar::TranslateInfoBar(
|
| + scoped_ptr<TranslateInfoBarDelegate> delegate)
|
| + : InfoBarAndroid(delegate.PassAs<InfoBarDelegate>()),
|
| java_translate_delegate_() {}
|
|
|
| TranslateInfoBar::~TranslateInfoBar() {
|
| }
|
|
|
| -ScopedJavaLocalRef<jobject> TranslateInfoBar::CreateRenderInfoBar(JNIEnv* env) {
|
| +void TranslateInfoBar::ApplyTranslateOptions(
|
| + JNIEnv* env,
|
| + jobject obj,
|
| + int source_language_index,
|
| + int target_language_index,
|
| + bool always_translate,
|
| + bool never_translate_language,
|
| + bool never_translate_site) {
|
| + TranslateInfoBarDelegate* delegate = GetDelegate();
|
| + delegate->set_original_language_index(source_language_index);
|
| + delegate->set_target_language_index(target_language_index);
|
| + if (delegate->ShouldAlwaysTranslate() != always_translate)
|
| + delegate->ToggleAlwaysTranslate();
|
| + if (never_translate_language && delegate->IsTranslatableLanguageByPrefs())
|
| + delegate->ToggleTranslatableLanguageByPrefs();
|
| + if (never_translate_site && !delegate->IsSiteBlacklisted())
|
| + delegate->ToggleSiteBlacklist();
|
| +}
|
| +
|
| +base::android::ScopedJavaLocalRef<jobject>
|
| + TranslateInfoBar::CreateRenderInfoBar(JNIEnv* env) {
|
| java_translate_delegate_.Reset(Java_TranslateInfoBarDelegate_create(env));
|
| - ScopedJavaLocalRef<jobject> java_infobar;
|
| - std::vector<string16> languages(delegate_->num_languages());
|
| - for (size_t i = 0; i < delegate_->num_languages(); ++i) {
|
| - languages[i] = delegate_->language_name_at(i);
|
| - }
|
| - ScopedJavaLocalRef<jobjectArray> java_languages =
|
| + base::android::ScopedJavaLocalRef<jobject> java_infobar;
|
| + TranslateInfoBarDelegate* delegate = GetDelegate();
|
| + std::vector<string16> languages;
|
| + languages.reserve(delegate->num_languages());
|
| + for (size_t i = 0; i < delegate->num_languages(); ++i)
|
| + languages.push_back(delegate->language_name_at(i));
|
| + base::android::ScopedJavaLocalRef<jobjectArray> java_languages =
|
| base::android::ToJavaArrayOfStrings(env, languages);
|
| + return Java_TranslateInfoBarDelegate_showTranslateInfoBar(
|
| + env, java_translate_delegate_.obj(), reinterpret_cast<jint>(this),
|
| + delegate->infobar_type(), delegate->original_language_index(),
|
| + delegate->target_language_index(), delegate->ShouldAlwaysTranslate(),
|
| + ShouldDisplayNeverInfoBarOnNope(), java_languages.obj());
|
| +}
|
|
|
| - java_infobar = Java_TranslateInfoBarDelegate_showTranslateInfoBar(
|
| - env,
|
| - java_translate_delegate_.obj(),
|
| - reinterpret_cast<jint>(this),
|
| - delegate_->infobar_type(),
|
| - delegate_->original_language_index(),
|
| - delegate_->target_language_index(),
|
| - delegate_->ShouldAlwaysTranslate(),
|
| - ShouldDisplayNeverInfoBarOnNope(),
|
| - java_languages.obj());
|
| +void TranslateInfoBar::ProcessButton(int action,
|
| + const std::string& action_value) {
|
| + // TODO(pkasting): The subsequent check isn't necessary if Android infobar
|
| + // buttons become unclickable once the infobar is unowned.
|
| + if (!owner())
|
| + return; // We're closing; don't call anything, it might access the owner.
|
|
|
| - return java_infobar;
|
| -}
|
| -
|
| -void TranslateInfoBar::ProcessButton(
|
| - int action, const std::string& action_value) {
|
| + TranslateInfoBarDelegate* delegate = GetDelegate();
|
| if (action == InfoBarAndroid::ACTION_TRANSLATE) {
|
| - delegate_->Translate();
|
| - } else if (action == InfoBarAndroid::ACTION_CANCEL) {
|
| - delegate_->TranslationDeclined();
|
| - } else if (action == InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL) {
|
| - delegate_->RevertTranslation();
|
| - } else if (action != InfoBarAndroid::ACTION_NONE) {
|
| - NOTREACHED();
|
| + delegate->Translate();
|
| + return;
|
| }
|
|
|
| - if (action != InfoBarAndroid::ACTION_TRANSLATE) {
|
| - // do not close the infobar upon translate
|
| - // since it will be replaced by a different one
|
| - // which will close this current infobar.
|
| - CloseInfoBar();
|
| - }
|
| -}
|
| + if (action == InfoBarAndroid::ACTION_CANCEL)
|
| + delegate->TranslationDeclined();
|
| + else if (action == InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL)
|
| + delegate->RevertTranslation();
|
| + else
|
| + DCHECK_EQ(InfoBarAndroid::ACTION_NONE, action);
|
|
|
| -void TranslateInfoBar::SetJavaDelegate(jobject delegate) {
|
| - JNIEnv* env = AttachCurrentThread();
|
| - java_translate_delegate_.Reset(env, delegate);
|
| + // Do not close the infobar upon translate, since it will be replaced by a
|
| + // different one which will close this infobar.
|
| + CloseInfoBar();
|
| }
|
|
|
| void TranslateInfoBar::PassJavaInfoBar(InfoBarAndroid* source) {
|
| - if (delegate_->infobar_type() != TranslateInfoBarDelegate::TRANSLATING &&
|
| - delegate_->infobar_type() != TranslateInfoBarDelegate::AFTER_TRANSLATE &&
|
| - delegate_->infobar_type() !=
|
| - TranslateInfoBarDelegate::TRANSLATION_ERROR) {
|
| + TranslateInfoBarDelegate* delegate = GetDelegate();
|
| + if (delegate->infobar_type() != TranslateInfoBarDelegate::TRANSLATING &&
|
| + delegate->infobar_type() != TranslateInfoBarDelegate::AFTER_TRANSLATE &&
|
| + delegate->infobar_type() != TranslateInfoBarDelegate::TRANSLATION_ERROR)
|
| return;
|
| - }
|
| - DCHECK(source != NULL);
|
| - TranslateInfoBar* source_infobar = static_cast<TranslateInfoBar*>(source);
|
|
|
| // Ask the former bar to transfer ownership to us.
|
| - source_infobar->TransferOwnership(this, delegate_->infobar_type());
|
| + DCHECK(source != NULL);
|
| + static_cast<TranslateInfoBar*>(source)->TransferOwnership(
|
| + this, delegate->infobar_type());
|
| }
|
|
|
| +bool TranslateInfoBar::ShouldDisplayNeverInfoBarOnNope() {
|
| + TranslateInfoBarDelegate* delegate = GetDelegate();
|
| + return
|
| + (delegate->infobar_type() ==
|
| + TranslateInfoBarDelegate::BEFORE_TRANSLATE) &&
|
| + delegate->ShouldShowNeverTranslateShortcut();
|
| +}
|
| +
|
| +void TranslateInfoBar::SetJavaDelegate(jobject delegate) {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + java_translate_delegate_.Reset(env, delegate);
|
| +}
|
| +
|
| void TranslateInfoBar::TransferOwnership(
|
| TranslateInfoBar* destination,
|
| TranslateInfoBarDelegate::Type new_type) {
|
| - JNIEnv* env = AttachCurrentThread();
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| if (Java_TranslateInfoBarDelegate_changeTranslateInfoBarTypeAndPointer(
|
| - env,
|
| - java_translate_delegate_.obj(),
|
| - reinterpret_cast<jint>(destination),
|
| - new_type)) {
|
| + env, java_translate_delegate_.obj(), reinterpret_cast<jint>(destination),
|
| + new_type)) {
|
| ReassignJavaInfoBar(destination);
|
| destination->SetJavaDelegate(java_translate_delegate_.Release());
|
| }
|
| }
|
|
|
| -bool TranslateInfoBar::ShouldDisplayNeverInfoBarOnNope() {
|
| - return
|
| - (delegate_->infobar_type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE)
|
| - && (delegate_->ShouldShowNeverTranslateShortcut());
|
| +TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() {
|
| + return delegate()->AsTranslateInfoBarDelegate();
|
| }
|
|
|
| -// -----------------------------------------------------------------------------
|
| -// Native JNI methods for the translate delegate.
|
| -// -----------------------------------------------------------------------------
|
| -void TranslateInfoBar::ApplyTranslateOptions(JNIEnv* env, jobject obj,
|
| - int source_language_index, int target_language_index,
|
| - bool always_translate, bool never_translate_language,
|
| - bool never_translate_site) {
|
| - if (delegate_->original_language_index() !=
|
| - static_cast<size_t>(source_language_index))
|
| - delegate_->set_original_language_index(source_language_index);
|
|
|
| - if (delegate_->target_language_index() !=
|
| - static_cast<size_t>(target_language_index))
|
| - delegate_->set_target_language_index(target_language_index);
|
| +// Native JNI methods ---------------------------------------------------------
|
|
|
| - if (delegate_->ShouldAlwaysTranslate() != always_translate)
|
| - delegate_->ToggleAlwaysTranslate();
|
| -
|
| - if (never_translate_language && delegate_->IsTranslatableLanguageByPrefs())
|
| - delegate_->ToggleTranslatableLanguageByPrefs();
|
| -
|
| - if (never_translate_site && !delegate_->IsSiteBlacklisted())
|
| - delegate_->ToggleSiteBlacklist();
|
| -}
|
| -
|
| bool RegisterTranslateInfoBarDelegate(JNIEnv* env) {
|
| return RegisterNativesImpl(env);
|
| }
|
|
|