// 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_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 ChromeTranslateClient::CreateInfoBar( scoped_ptr delegate) const { return make_scoped_ptr(new TranslateInfoBar(delegate.Pass())); } // TranslateInfoBar ----------------------------------------------------------- TranslateInfoBar::TranslateInfoBar( scoped_ptr delegate) : InfoBarAndroid(delegate.Pass()) { } TranslateInfoBar::~TranslateInfoBar() { } ScopedJavaLocalRef TranslateInfoBar::CreateRenderInfoBar(JNIEnv* env) { translate::TranslateInfoBarDelegate* delegate = GetDelegate(); std::vector 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 java_languages = base::android::ToJavaArrayOfStrings(env, languages); return Java_TranslateInfoBar_show( env, delegate->translate_step(), delegate->original_language_index(), delegate->target_language_index(), delegate->ShouldAlwaysTranslate(), ShouldDisplayNeverTranslateInfoBarOnCancel(), delegate->triggered_from_menu(), 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. 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(source)->TransferOwnership( this, delegate->translate_step()); } void TranslateInfoBar::SetJavaInfoBar( const base::android::JavaRef& java_info_bar) { InfoBarAndroid::SetJavaInfoBar(java_info_bar); JNIEnv* env = base::android::AttachCurrentThread(); Java_TranslateInfoBar_setNativePtr(env, java_info_bar.obj(), reinterpret_cast(this)); } 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) { translate::TranslateInfoBarDelegate* delegate = GetDelegate(); delegate->UpdateOriginalLanguageIndex(source_language_index); delegate->UpdateTargetLanguageIndex(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, 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); }