Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: chrome/browser/ui/android/infobars/translate_infobar.cc

Issue 22694006: Infobar system refactor. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698