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