| // 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 "base/android/jni_android.h" |
| #include "base/android/jni_array.h" |
| #include "base/android/jni_helper.h" |
| #include "chrome/browser/translate/translate_infobar_delegate.h" |
| #include "grit/generated_resources.h" |
| #include "jni/TranslateInfoBarDelegate_jni.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| |
| // InfoBarDelegateAndroid ----------------------------------------------------- |
| |
| // static |
| InfoBar* TranslateInfoBarDelegate::CreateInfoBar(InfoBarService* owner) { |
| return new TranslateInfoBar(owner, this); |
| } |
| |
| |
| // TranslateInfoBar ----------------------------------------------------------- |
| |
| TranslateInfoBar::TranslateInfoBar(InfoBarService* owner, |
| TranslateInfoBarDelegate* delegate) |
| : InfoBarAndroid(owner, delegate), |
| delegate_(delegate), |
| java_translate_delegate_() { |
| } |
| |
| TranslateInfoBar::~TranslateInfoBar() { |
| } |
| |
| ScopedJavaLocalRef<jobject> TranslateInfoBar::CreateRenderInfoBar(JNIEnv* env) { |
| java_translate_delegate_.Reset(Java_TranslateInfoBarDelegate_create(env)); |
| std::vector<string16> languages(delegate_->num_languages()); |
| for (size_t i = 0; i < delegate_->num_languages(); ++i) |
| languages[i] = 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(), |
| ShouldDisplayNeverTranslateInfoBarOnCancel(), |
| java_languages.obj()); |
| } |
| |
| void TranslateInfoBar::ProcessButton( |
| int action, const std::string& action_value) { |
| if (!owner()) |
| return; // We're closing; don't call anything, it might access the owner. |
| |
| 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) { |
| DCHECK_NE( |
| delegate_->infobar_type(), TranslateInfoBarDelegate::BEFORE_TRANSLATE); |
| |
| // Ask the former bar to transfer ownership to us. |
| DCHECK(source != NULL); |
| static_cast<TranslateInfoBar*>(source)->TransferOwnership( |
| this, delegate_->infobar_type()); |
| } |
| |
| 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) { |
| 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(); |
| } |
| |
| void TranslateInfoBar::TransferOwnership( |
| TranslateInfoBar* destination, |
| TranslateInfoBarDelegate::Type new_type) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| if (Java_TranslateInfoBarDelegate_changeTranslateInfoBarTypeAndPointer( |
| env, java_translate_delegate_.obj(), |
| reinterpret_cast<jint>(destination), new_type)) { |
| ReassignJavaInfoBar(destination); |
| destination->SetJavaDelegate(java_translate_delegate_.Release()); |
| } |
| } |
| |
| void TranslateInfoBar::SetJavaDelegate(jobject delegate) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| java_translate_delegate_.Reset(env, delegate); |
| } |
| |
| bool TranslateInfoBar::ShouldDisplayNeverTranslateInfoBarOnCancel() { |
| return |
| (delegate_->infobar_type() == |
| TranslateInfoBarDelegate::BEFORE_TRANSLATE) && |
| (delegate_->ShouldShowNeverTranslateShortcut()); |
| } |
| |
| |
| // Native JNI methods --------------------------------------------------------- |
| |
| bool RegisterTranslateInfoBarDelegate(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |