Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / android / infobars / translate_infobar.cc
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_helper.h"
10 #include "chrome/browser/translate/translate_infobar_delegate.h"
11 #include "grit/generated_resources.h"
12 #include "jni/TranslateInfoBarDelegate_jni.h"
13 #include "ui/base/l10n/l10n_util.h"
14
15
16 // TranslateInfoBarDelegate ---------------------------------------------------
17
18 // static
19 scoped_ptr<InfoBar> TranslateInfoBarDelegate::CreateInfoBar(
20     scoped_ptr<TranslateInfoBarDelegate> delegate) {
21   return scoped_ptr<InfoBar>(new TranslateInfoBar(delegate.Pass()));
22 }
23
24
25 // TranslateInfoBar -----------------------------------------------------------
26
27 TranslateInfoBar::TranslateInfoBar(
28     scoped_ptr<TranslateInfoBarDelegate> delegate)
29     : InfoBarAndroid(delegate.PassAs<InfoBarDelegate>()),
30       java_translate_delegate_() {
31 }
32
33 TranslateInfoBar::~TranslateInfoBar() {
34 }
35
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(), java_languages.obj());
51 }
52
53 void TranslateInfoBar::ProcessButton(int action,
54                                      const std::string& action_value) {
55   if (!owner())
56     return;  // We're closing; don't call anything, it might access the owner.
57
58   TranslateInfoBarDelegate* delegate = GetDelegate();
59   if (action == InfoBarAndroid::ACTION_TRANSLATE) {
60     delegate->Translate();
61     return;
62   }
63
64   if (action == InfoBarAndroid::ACTION_CANCEL)
65     delegate->TranslationDeclined();
66   else if (action == InfoBarAndroid::ACTION_TRANSLATE_SHOW_ORIGINAL)
67     delegate->RevertTranslation();
68   else
69     DCHECK_EQ(InfoBarAndroid::ACTION_NONE, action);
70
71   RemoveSelf();
72 }
73
74 void TranslateInfoBar::PassJavaInfoBar(InfoBarAndroid* source) {
75   TranslateInfoBarDelegate* delegate = GetDelegate();
76   DCHECK_NE(TranslateTabHelper::BEFORE_TRANSLATE, delegate->translate_step());
77
78   // Ask the former bar to transfer ownership to us.
79   DCHECK(source != NULL);
80   static_cast<TranslateInfoBar*>(source)->TransferOwnership(
81       this, delegate->translate_step());
82 }
83
84 void TranslateInfoBar::ApplyTranslateOptions(JNIEnv* env,
85                                              jobject obj,
86                                              int source_language_index,
87                                              int target_language_index,
88                                              bool always_translate,
89                                              bool never_translate_language,
90                                              bool never_translate_site) {
91   TranslateInfoBarDelegate* delegate = GetDelegate();
92   delegate->UpdateOriginalLanguageIndex(source_language_index);
93   delegate->UpdateTargetLanguageIndex(target_language_index);
94
95   if (delegate->ShouldAlwaysTranslate() != always_translate)
96     delegate->ToggleAlwaysTranslate();
97
98   if (never_translate_language && delegate->IsTranslatableLanguageByPrefs())
99     delegate->ToggleTranslatableLanguageByPrefs();
100
101   if (never_translate_site && !delegate->IsSiteBlacklisted())
102     delegate->ToggleSiteBlacklist();
103 }
104
105 void TranslateInfoBar::TransferOwnership(
106     TranslateInfoBar* destination,
107     TranslateTabHelper::TranslateStep new_type) {
108   JNIEnv* env = base::android::AttachCurrentThread();
109   if (Java_TranslateInfoBarDelegate_changeTranslateInfoBarTypeAndPointer(
110       env, java_translate_delegate_.obj(),
111       reinterpret_cast<intptr_t>(destination), new_type)) {
112     ReassignJavaInfoBar(destination);
113     destination->SetJavaDelegate(java_translate_delegate_.Release());
114   }
115 }
116
117 void TranslateInfoBar::SetJavaDelegate(jobject delegate) {
118   JNIEnv* env = base::android::AttachCurrentThread();
119   java_translate_delegate_.Reset(env, delegate);
120 }
121
122 bool TranslateInfoBar::ShouldDisplayNeverTranslateInfoBarOnCancel() {
123   TranslateInfoBarDelegate* delegate = GetDelegate();
124   return (delegate->translate_step() == TranslateTabHelper::BEFORE_TRANSLATE) &&
125          delegate->ShouldShowNeverTranslateShortcut();
126 }
127
128 TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() {
129   return delegate()->AsTranslateInfoBarDelegate();
130 }
131
132
133 // Native JNI methods ---------------------------------------------------------
134
135 bool RegisterTranslateInfoBarDelegate(JNIEnv* env) {
136   return RegisterNativesImpl(env);
137 }