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