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

Side by Side Diff: chrome/browser/android/ntp/ntp_snippets_bridge.cc

Issue 2230473002: Refactor and extend SnippetsBridge for multi-section support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@categoryinfo
Patch Set: Michael's nits and renamings Created 4 years, 4 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/android/ntp/ntp_snippets_bridge.h" 5 #include "chrome/browser/android/ntp/ntp_snippets_bridge.h"
6 6
7 #include <jni.h> 7 #include <jni.h>
8 8
9 #include "base/android/callback_android.h" 9 #include "base/android/callback_android.h"
10 #include "base/android/jni_android.h" 10 #include "base/android/jni_android.h"
(...skipping 12 matching lines...) Expand all
23 #include "ui/gfx/android/java_bitmap.h" 23 #include "ui/gfx/android/java_bitmap.h"
24 #include "ui/gfx/image/image.h" 24 #include "ui/gfx/image/image.h"
25 25
26 using base::android::AttachCurrentThread; 26 using base::android::AttachCurrentThread;
27 using base::android::ConvertJavaStringToUTF8; 27 using base::android::ConvertJavaStringToUTF8;
28 using base::android::ConvertUTF8ToJavaString; 28 using base::android::ConvertUTF8ToJavaString;
29 using base::android::ConvertUTF16ToJavaString; 29 using base::android::ConvertUTF16ToJavaString;
30 using base::android::JavaParamRef; 30 using base::android::JavaParamRef;
31 using base::android::ScopedJavaGlobalRef; 31 using base::android::ScopedJavaGlobalRef;
32 using base::android::ScopedJavaLocalRef; 32 using base::android::ScopedJavaLocalRef;
33 using base::android::ToJavaIntArray;
33 using ntp_snippets::Category; 34 using ntp_snippets::Category;
35 using ntp_snippets::CategoryInfo;
34 using ntp_snippets::CategoryStatus; 36 using ntp_snippets::CategoryStatus;
35 using ntp_snippets::KnownCategories; 37 using ntp_snippets::KnownCategories;
38 using ntp_snippets::ContentSuggestion;
36 39
37 namespace { 40 namespace {
38 41
39 void SnippetVisitedHistoryRequestCallback( 42 void URLVisitedHistoryRequestCallback(
40 base::android::ScopedJavaGlobalRef<jobject> callback, 43 base::android::ScopedJavaGlobalRef<jobject> callback,
41 bool success, 44 bool success,
42 const history::URLRow& row, 45 const history::URLRow& row,
43 const history::VisitVector& visitVector) { 46 const history::VisitVector& visitVector) {
44 bool visited = success && row.visit_count() != 0; 47 bool visited = success && row.visit_count() != 0;
45 base::android::RunCallbackAndroid(callback, visited); 48 base::android::RunCallbackAndroid(callback, visited);
46 } 49 }
47 50
48 } // namespace 51 } // namespace
49 52
50 static jlong Init(JNIEnv* env, 53 static jlong Init(JNIEnv* env,
51 const JavaParamRef<jobject>& obj, 54 const JavaParamRef<jobject>& obj,
52 const JavaParamRef<jobject>& j_profile) { 55 const JavaParamRef<jobject>& j_profile) {
53 NTPSnippetsBridge* snippets_bridge = new NTPSnippetsBridge(env, j_profile); 56 NTPSnippetsBridge* snippets_bridge = new NTPSnippetsBridge(env, j_profile);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 } 89 }
87 90
88 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { 91 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
89 delete this; 92 delete this;
90 } 93 }
91 94
92 void NTPSnippetsBridge::SetObserver(JNIEnv* env, 95 void NTPSnippetsBridge::SetObserver(JNIEnv* env,
93 const JavaParamRef<jobject>& obj, 96 const JavaParamRef<jobject>& obj,
94 const JavaParamRef<jobject>& j_observer) { 97 const JavaParamRef<jobject>& j_observer) {
95 observer_.Reset(env, j_observer); 98 observer_.Reset(env, j_observer);
96 OnNewSuggestions();
97 } 99 }
98 100
99 void NTPSnippetsBridge::FetchImage(JNIEnv* env, 101 ScopedJavaLocalRef<jintArray> NTPSnippetsBridge::GetCategories(
100 const JavaParamRef<jobject>& obj, 102 JNIEnv* env,
101 const JavaParamRef<jstring>& snippet_id, 103 const base::android::JavaParamRef<jobject>& obj) {
102 const JavaParamRef<jobject>& j_callback) { 104 std::vector<int> categoryIds;
Bernhard Bauer 2016/08/09 14:30:12 Nit: C++ local variables are underscore_style (Yea
Philipp Keck 2016/08/09 16:59:16 Done.
103 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback); 105 for (Category category : content_suggestions_service_->GetCategories()) {
104 content_suggestions_service_->FetchSuggestionImage( 106 categoryIds.push_back(category.id());
105 ConvertJavaStringToUTF8(env, snippet_id), 107 }
106 base::Bind(&NTPSnippetsBridge::OnImageFetched, 108 return ToJavaIntArray(env, categoryIds);
107 weak_ptr_factory_.GetWeakPtr(), callback));
108 }
109
110 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env,
111 const JavaParamRef<jobject>& obj,
112 const JavaParamRef<jstring>& id) {
113 content_suggestions_service_->DismissSuggestion(
114 ConvertJavaStringToUTF8(env, id));
115 }
116
117 void NTPSnippetsBridge::SnippetVisited(JNIEnv* env,
118 const JavaParamRef<jobject>& obj,
119 const JavaParamRef<jobject>& jcallback,
120 const JavaParamRef<jstring>& jurl) {
121 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback);
122
123 history_service_->QueryURL(
124 GURL(ConvertJavaStringToUTF8(env, jurl)),
125 false,
126 base::Bind(&SnippetVisitedHistoryRequestCallback, callback),
127 &tracker_);
128 } 109 }
129 110
130 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env, 111 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env,
131 const JavaParamRef<jobject>& obj, 112 const JavaParamRef<jobject>& obj,
132 jint category) { 113 jint category) {
133 return static_cast<int>(content_suggestions_service_->GetCategoryStatus( 114 return static_cast<int>(content_suggestions_service_->GetCategoryStatus(
134 content_suggestions_service_->category_factory()->FromKnownCategory( 115 content_suggestions_service_->category_factory()->FromIDValue(category)));
135 KnownCategories::ARTICLES))); 116 }
117
118 base::android::ScopedJavaLocalRef<jobject> NTPSnippetsBridge::GetCategoryInfo(
119 JNIEnv* env,
120 const base::android::JavaParamRef<jobject>& obj,
121 jint category) {
122 base::Optional<CategoryInfo> info =
123 content_suggestions_service_->GetCategoryInfo(
124 content_suggestions_service_->category_factory()->FromIDValue(
125 category));
126 if (!info)
127 return base::android::ScopedJavaLocalRef<jobject>(env, nullptr);
128 return Java_SnippetsBridge_createSuggestionsCategoryInfo(
129 env, ConvertUTF16ToJavaString(env, info->title()).obj(),
130 static_cast<int>(info->card_layout()));
131 }
132
133 ScopedJavaLocalRef<jobject> NTPSnippetsBridge::GetSuggestionsForCategory(
134 JNIEnv* env,
135 const base::android::JavaParamRef<jobject>& obj,
136 jint category) {
137 const std::vector<ContentSuggestion>& suggestions =
138 content_suggestions_service_->GetSuggestionsForCategory(
139 content_suggestions_service_->category_factory()->FromIDValue(
140 category));
141 ScopedJavaLocalRef<jobject> result =
142 Java_SnippetsBridge_createSuggestionList(env);
143 for (const ContentSuggestion& suggestion : suggestions) {
144 Java_SnippetsBridge_addSuggestion(
145 env, result.obj(), ConvertUTF8ToJavaString(env, suggestion.id()).obj(),
146 ConvertUTF16ToJavaString(env, suggestion.title()).obj(),
147 ConvertUTF16ToJavaString(env, suggestion.publisher_name()).obj(),
148 ConvertUTF16ToJavaString(env, suggestion.snippet_text()).obj(),
149 ConvertUTF8ToJavaString(env, suggestion.url().spec()).obj(),
150 ConvertUTF8ToJavaString(env, suggestion.amp_url().spec()).obj(),
151 suggestion.publish_date().ToJavaTime(), suggestion.score());
152 }
153 return result;
154 }
155
156 void NTPSnippetsBridge::FetchSuggestionImage(
157 JNIEnv* env,
158 const JavaParamRef<jobject>& obj,
159 const JavaParamRef<jstring>& suggestion_id,
160 const JavaParamRef<jobject>& j_callback) {
161 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback);
162 content_suggestions_service_->FetchSuggestionImage(
163 ConvertJavaStringToUTF8(env, suggestion_id),
164 base::Bind(&NTPSnippetsBridge::OnImageFetched,
165 weak_ptr_factory_.GetWeakPtr(), callback));
166 }
167
168 void NTPSnippetsBridge::DismissSuggestion(
169 JNIEnv* env,
170 const JavaParamRef<jobject>& obj,
171 const JavaParamRef<jstring>& suggestion_id) {
172 content_suggestions_service_->DismissSuggestion(
173 ConvertJavaStringToUTF8(env, suggestion_id));
174 }
175
176 void NTPSnippetsBridge::GetURLVisited(JNIEnv* env,
177 const JavaParamRef<jobject>& obj,
178 const JavaParamRef<jobject>& jcallback,
179 const JavaParamRef<jstring>& jurl) {
180 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback);
181
182 history_service_->QueryURL(
183 GURL(ConvertJavaStringToUTF8(env, jurl)), false,
184 base::Bind(&URLVisitedHistoryRequestCallback, callback), &tracker_);
136 } 185 }
137 186
138 NTPSnippetsBridge::~NTPSnippetsBridge() {} 187 NTPSnippetsBridge::~NTPSnippetsBridge() {}
139 188
140 void NTPSnippetsBridge::OnNewSuggestions() { 189 void NTPSnippetsBridge::OnNewSuggestions(Category category) {
141 if (observer_.is_null()) 190 if (observer_.is_null())
142 return; 191 return;
143 192
144 // Show all suggestions from all categories, even though we currently display
145 // them in a single section on the UI.
146 // TODO(pke): This is only for debugging new sections and will be replaced
147 // with proper multi-section UI support.
148 JNIEnv* env = base::android::AttachCurrentThread(); 193 JNIEnv* env = base::android::AttachCurrentThread();
149 ScopedJavaLocalRef<jobject> suggestions = 194 Java_SnippetsBridge_onNewSuggestions(env, observer_.obj(),
150 Java_SnippetsBridge_createSuggestionList(env); 195 static_cast<int>(category.id()));
151 for (Category category :
152 content_suggestions_service_->GetCategories()) {
153 if (content_suggestions_service_->GetCategoryStatus(category) !=
154 CategoryStatus::AVAILABLE) {
155 continue;
156 }
157 for (const ntp_snippets::ContentSuggestion& suggestion :
158 content_suggestions_service_->GetSuggestionsForCategory(category)) {
159 Java_SnippetsBridge_addSuggestion(
160 env, suggestions.obj(),
161 ConvertUTF8ToJavaString(env, suggestion.id()).obj(),
162 ConvertUTF16ToJavaString(env, suggestion.title()).obj(),
163 ConvertUTF16ToJavaString(env, suggestion.publisher_name()).obj(),
164 ConvertUTF16ToJavaString(env, suggestion.snippet_text()).obj(),
165 ConvertUTF8ToJavaString(env, suggestion.url().spec()).obj(),
166 ConvertUTF8ToJavaString(env, suggestion.amp_url().spec()).obj(),
167 suggestion.publish_date().ToJavaTime(), suggestion.score());
168 }
169 }
170
171 // TODO(mvanouwerkerk): Do not hard code ARTICLES.
172 Java_SnippetsBridge_onSuggestionsAvailable(
173 env, observer_.obj(),
174 static_cast<int>(
175 content_suggestions_service_->category_factory()->FromKnownCategory(
176 KnownCategories::ARTICLES).id()),
177 suggestions.obj());
178 } 196 }
179 197
180 void NTPSnippetsBridge::OnCategoryStatusChanged(Category category, 198 void NTPSnippetsBridge::OnCategoryStatusChanged(Category category,
181 CategoryStatus new_status) { 199 CategoryStatus new_status) {
182 // TODO(mvanouwerkerk): Do not hard code ARTICLES. 200 if (observer_.is_null())
183 if (!category.IsKnownCategory(KnownCategories::ARTICLES))
184 return; 201 return;
185 202
186 JNIEnv* env = base::android::AttachCurrentThread(); 203 JNIEnv* env = base::android::AttachCurrentThread();
187 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(), 204 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(),
188 static_cast<int>(category.id()), 205 static_cast<int>(category.id()),
189 static_cast<int>(new_status)); 206 static_cast<int>(new_status));
190 } 207 }
191 208
192 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() { 209 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() {
193 observer_.Reset(); 210 observer_.Reset();
194 content_suggestions_service_observer_.Remove(content_suggestions_service_); 211 content_suggestions_service_observer_.Remove(content_suggestions_service_);
195 } 212 }
196 213
197 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback, 214 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback,
198 const std::string& snippet_id, 215 const std::string& snippet_id,
199 const gfx::Image& image) { 216 const gfx::Image& image) {
200 ScopedJavaLocalRef<jobject> j_bitmap; 217 ScopedJavaLocalRef<jobject> j_bitmap;
201 if (!image.IsEmpty()) 218 if (!image.IsEmpty())
202 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap()); 219 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap());
203 220
204 base::android::RunCallbackAndroid(callback, j_bitmap); 221 base::android::RunCallbackAndroid(callback, j_bitmap);
205 } 222 }
206 223
207 // static 224 // static
208 bool NTPSnippetsBridge::Register(JNIEnv* env) { 225 bool NTPSnippetsBridge::Register(JNIEnv* env) {
209 return RegisterNativesImpl(env); 226 return RegisterNativesImpl(env);
210 } 227 }
OLDNEW
« no previous file with comments | « chrome/browser/android/ntp/ntp_snippets_bridge.h ('k') | chrome/browser/ui/webui/snippets_internals_message_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698