14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/android/infobars/translate_infobar.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/android/jni_android.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/android/jni_array.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/android/jni_weak_ref.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/translate/core/browser/translate_infobar_delegate.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "jni/TranslateInfoBarDelegate_jni.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// ChromeTranslateClient 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// ---------------------------------------------------------- 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<infobars::InfoBar> ChromeTranslateClient::CreateInfoBar( 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<translate::TranslateInfoBarDelegate> delegate) const { 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return scoped_ptr<infobars::InfoBar>(new TranslateInfoBar(delegate.Pass())); 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TranslateInfoBar ----------------------------------------------------------- 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TranslateInfoBar::TranslateInfoBar( 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<translate::TranslateInfoBarDelegate> delegate) 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : InfoBarAndroid(delegate.PassAs<infobars::InfoBarDelegate>()), 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) java_translate_delegate_() { 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TranslateInfoBar::~TranslateInfoBar() { 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ScopedJavaLocalRef<jobject> TranslateInfoBar::CreateRenderInfoBar(JNIEnv* env) { 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) java_translate_delegate_.Reset(Java_TranslateInfoBarDelegate_create(env)); 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateInfoBarDelegate* delegate = GetDelegate(); 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> languages; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) languages.reserve(delegate->num_languages()); 394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (size_t i = 0; i < delegate->num_languages(); ++i) 404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch languages.push_back(delegate->language_name_at(i)); 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::android::ScopedJavaLocalRef<jobjectArray> java_languages = 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::android::ToJavaArrayOfStrings(env, languages); 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return Java_TranslateInfoBarDelegate_showTranslateInfoBar( 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env, java_translate_delegate_.obj(), reinterpret_cast<intptr_t>(this), 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->translate_step(), delegate->original_language_index(), 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->target_language_index(), delegate->ShouldAlwaysTranslate(), 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ShouldDisplayNeverTranslateInfoBarOnCancel(), 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate->triggered_from_menu(), java_languages.obj()); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TranslateInfoBar::ProcessButton(int action, 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& action_value) { 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!owner()) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; // We're closing; don't call anything, it might access the owner. 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateInfoBarDelegate* delegate = GetDelegate(); 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (action == InfoBarAndroid::ACTION_TRANSLATE) { 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->Translate(); 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (action == InfoBarAndroid::ACTION_CANCEL) 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->TranslationDeclined(); 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) else if (action == InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->RevertTranslation(); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) else 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_EQ(InfoBarAndroid::ACTION_NONE, action); 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemoveSelf(); 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TranslateInfoBar::PassJavaInfoBar(InfoBarAndroid* source) { 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateInfoBarDelegate* delegate = GetDelegate(); 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK_NE(translate::TRANSLATE_STEP_BEFORE_TRANSLATE, 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate->translate_step()); 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Ask the former bar to transfer ownership to us. 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(source != NULL); 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static_cast<TranslateInfoBar*>(source)->TransferOwnership( 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, delegate->translate_step()); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TranslateInfoBar::ApplyTranslateOptions(JNIEnv* env, 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) jobject obj, 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int source_language_index, 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int target_language_index, 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool always_translate, 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool never_translate_language, 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool never_translate_site) { 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateInfoBarDelegate* delegate = GetDelegate(); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->UpdateOriginalLanguageIndex(source_language_index); 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->UpdateTargetLanguageIndex(target_language_index); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (delegate->ShouldAlwaysTranslate() != always_translate) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->ToggleAlwaysTranslate(); 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (never_translate_language && delegate->IsTranslatableLanguageByPrefs()) 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->ToggleTranslatableLanguageByPrefs(); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (never_translate_site && !delegate->IsSiteBlacklisted()) 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate->ToggleSiteBlacklist(); 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid TranslateInfoBar::TransferOwnership(TranslateInfoBar* destination, 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch translate::TranslateStep new_type) { 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (Java_TranslateInfoBarDelegate_changeTranslateInfoBarTypeAndPointer( 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) env, java_translate_delegate_.obj(), 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch reinterpret_cast<intptr_t>(destination), new_type)) { 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReassignJavaInfoBar(destination); 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) destination->SetJavaDelegate(java_translate_delegate_.Release()); 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TranslateInfoBar::SetJavaDelegate(jobject delegate) { 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) java_translate_delegate_.Reset(env, delegate); 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool TranslateInfoBar::ShouldDisplayNeverTranslateInfoBarOnCancel() { 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateInfoBarDelegate* delegate = GetDelegate(); 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return (delegate->translate_step() == 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch translate::TRANSLATE_STEP_BEFORE_TRANSLATE) && 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->ShouldShowNeverTranslateShortcut(); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)translate::TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() { 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return delegate()->AsTranslateInfoBarDelegate(); 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Native JNI methods --------------------------------------------------------- 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool RegisterTranslateInfoBarDelegate(JNIEnv* env) { 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return RegisterNativesImpl(env); 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 138