1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/android/infobars/translate_infobar.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_array.h"
9 #include "base/android/jni_weak_ref.h"
10 #include "chrome/browser/translate/chrome_translate_client.h"
11 #include "components/translate/core/browser/translate_infobar_delegate.h"
12 #include "grit/generated_resources.h"
13 #include "jni/TranslateInfoBarDelegate_jni.h"
14 #include "ui/base/l10n/l10n_util.h"
15
16 // ChromeTranslateClient
17 // ----------------------------------------------------------
18
CreateInfoBar(scoped_ptr<TranslateInfoBarDelegate> delegate) const19 scoped_ptr<infobars::InfoBar> ChromeTranslateClient::CreateInfoBar(
20 scoped_ptr<TranslateInfoBarDelegate> delegate) const {
21 return scoped_ptr<infobars::InfoBar>(new TranslateInfoBar(delegate.Pass()));
22 }
23
24
25 // TranslateInfoBar -----------------------------------------------------------
26
TranslateInfoBar(scoped_ptr<TranslateInfoBarDelegate> delegate)27 TranslateInfoBar::TranslateInfoBar(
28 scoped_ptr<TranslateInfoBarDelegate> delegate)
29 : InfoBarAndroid(delegate.PassAs<infobars::InfoBarDelegate>()),
30 java_translate_delegate_() {
31 }
32
~TranslateInfoBar()33 TranslateInfoBar::~TranslateInfoBar() {
34 }
35
CreateRenderInfoBar(JNIEnv * env)36 ScopedJavaLocalRef<jobject> TranslateInfoBar::CreateRenderInfoBar(JNIEnv* env) {
37 java_translate_delegate_.Reset(Java_TranslateInfoBarDelegate_create(env));
38 TranslateInfoBarDelegate* delegate = GetDelegate();
39 std::vector<base::string16> languages;
40 languages.reserve(delegate->num_languages());
41 for (size_t i = 0; i < delegate->num_languages(); ++i)
42 languages.push_back(delegate->language_name_at(i));
43
44 base::android::ScopedJavaLocalRef<jobjectArray> java_languages =
45 base::android::ToJavaArrayOfStrings(env, languages);
46 return Java_TranslateInfoBarDelegate_showTranslateInfoBar(
47 env, java_translate_delegate_.obj(), reinterpret_cast<intptr_t>(this),
48 delegate->translate_step(), delegate->original_language_index(),
49 delegate->target_language_index(), delegate->ShouldAlwaysTranslate(),
50 ShouldDisplayNeverTranslateInfoBarOnCancel(),
51 delegate->triggered_from_menu(), java_languages.obj());
52 }
53
ProcessButton(int action,const std::string & action_value)54 void TranslateInfoBar::ProcessButton(int action,
55 const std::string& action_value) {
56 if (!owner())
57 return; // We're closing; don't call anything, it might access the owner.
58
59 TranslateInfoBarDelegate* delegate = GetDelegate();
60 if (action == InfoBarAndroid::ACTION_TRANSLATE) {
61 delegate->Translate();
62 return;
63 }
64
65 if (action == InfoBarAndroid::ACTION_CANCEL)
66 delegate->TranslationDeclined();
67 else if (action == InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL)
68 delegate->RevertTranslation();
69 else
70 DCHECK_EQ(InfoBarAndroid::ACTION_NONE, action);
71
72 RemoveSelf();
73 }
74
PassJavaInfoBar(InfoBarAndroid * source)75 void TranslateInfoBar::PassJavaInfoBar(InfoBarAndroid* source) {
76 TranslateInfoBarDelegate* delegate = GetDelegate();
77 DCHECK_NE(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
78 delegate->translate_step());
79
80 // Ask the former bar to transfer ownership to us.
81 DCHECK(source != NULL);
82 static_cast<TranslateInfoBar*>(source)->TransferOwnership(
83 this, delegate->translate_step());
84 }
85
ApplyTranslateOptions(JNIEnv * env,jobject obj,int source_language_index,int target_language_index,bool always_translate,bool never_translate_language,bool never_translate_site)86 void TranslateInfoBar::ApplyTranslateOptions(JNIEnv* env,
87 jobject obj,
88 int source_language_index,
89 int target_language_index,
90 bool always_translate,
91 bool never_translate_language,
92 bool never_translate_site) {
93 TranslateInfoBarDelegate* delegate = GetDelegate();
94 delegate->UpdateOriginalLanguageIndex(source_language_index);
95 delegate->UpdateTargetLanguageIndex(target_language_index);
96
97 if (delegate->ShouldAlwaysTranslate() != always_translate)
98 delegate->ToggleAlwaysTranslate();
99
100 if (never_translate_language && delegate->IsTranslatableLanguageByPrefs())
101 delegate->ToggleTranslatableLanguageByPrefs();
102
103 if (never_translate_site && !delegate->IsSiteBlacklisted())
104 delegate->ToggleSiteBlacklist();
105 }
106
TransferOwnership(TranslateInfoBar * destination,translate::TranslateStep new_type)107 void TranslateInfoBar::TransferOwnership(TranslateInfoBar* destination,
108 translate::TranslateStep new_type) {
109 JNIEnv* env = base::android::AttachCurrentThread();
110 if (Java_TranslateInfoBarDelegate_changeTranslateInfoBarTypeAndPointer(
111 env, java_translate_delegate_.obj(),
112 reinterpret_cast<intptr_t>(destination), new_type)) {
113 ReassignJavaInfoBar(destination);
114 destination->SetJavaDelegate(java_translate_delegate_.Release());
115 }
116 }
117
SetJavaDelegate(jobject delegate)118 void TranslateInfoBar::SetJavaDelegate(jobject delegate) {
119 JNIEnv* env = base::android::AttachCurrentThread();
120 java_translate_delegate_.Reset(env, delegate);
121 }
122
ShouldDisplayNeverTranslateInfoBarOnCancel()123 bool TranslateInfoBar::ShouldDisplayNeverTranslateInfoBarOnCancel() {
124 TranslateInfoBarDelegate* delegate = GetDelegate();
125 return (delegate->translate_step() ==
126 translate::TRANSLATE_STEP_BEFORE_TRANSLATE) &&
127 delegate->ShouldShowNeverTranslateShortcut();
128 }
129
GetDelegate()130 TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() {
131 return delegate()->AsTranslateInfoBarDelegate();
132 }
133
134
135 // Native JNI methods ---------------------------------------------------------
136
RegisterTranslateInfoBarDelegate(JNIEnv * env)137 bool RegisterTranslateInfoBarDelegate(JNIEnv* env) {
138 return RegisterNativesImpl(env);
139 }
140