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

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: Rename SnippetsObserver to ContentSuggestionsSourceObserver 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 SnippetVisitedHistoryRequestCallback(
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);
(...skipping 40 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();
Marc Treib 2016/08/09 13:38:16 Why this change? Does the UI now explicitly query
Philipp Keck 2016/08/09 14:02:54 Correct: https://codereview.chromium.org/223047300
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<Category> categories =
105 content_suggestions_service_->GetCategories();
106 return ToJavaIntArray(env, reinterpret_cast<int*>(categories.data()),
Marc Treib 2016/08/09 13:38:16 Ooh, I'm not sure this is safe. Rule of thumb, rei
Philipp Keck 2016/08/09 14:02:54 Done.
107 categories.size());
108 }
109
110 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env,
111 const JavaParamRef<jobject>& obj,
112 jint category) {
113 return static_cast<int>(content_suggestions_service_->GetCategoryStatus(
114 content_suggestions_service_->category_factory()->FromIDValue(category)));
115 }
116
117 base::android::ScopedJavaLocalRef<jobject> NTPSnippetsBridge::GetCategoryInfo(
118 JNIEnv* env,
119 const base::android::JavaParamRef<jobject>& obj,
120 jint category) {
121 base::Optional<CategoryInfo> info =
122 content_suggestions_service_->GetCategoryInfo(
123 content_suggestions_service_->category_factory()->FromIDValue(
124 category));
125 if (!info)
126 return base::android::ScopedJavaLocalRef<jobject>(env, nullptr);
127 return Java_SnippetsBridge_createSuggestionsCategoryInfo(
128 env, ConvertUTF16ToJavaString(env, info->title()).obj(),
129 static_cast<int>(info->card_layout()));
130 }
131
132 ScopedJavaLocalRef<jobject> NTPSnippetsBridge::GetSuggestionsForCategory(
133 JNIEnv* env,
134 const base::android::JavaParamRef<jobject>& obj,
135 jint category) {
136 const std::vector<ContentSuggestion>& suggestions =
137 content_suggestions_service_->GetSuggestionsForCategory(
138 content_suggestions_service_->category_factory()->FromIDValue(
139 category));
140 ScopedJavaLocalRef<jobject> result =
141 Java_SnippetsBridge_createSuggestionList(env);
142 for (const ContentSuggestion& suggestion : suggestions) {
143 Java_SnippetsBridge_addSuggestion(
144 env, result.obj(), ConvertUTF8ToJavaString(env, suggestion.id()).obj(),
145 ConvertUTF16ToJavaString(env, suggestion.title()).obj(),
146 ConvertUTF16ToJavaString(env, suggestion.publisher_name()).obj(),
147 ConvertUTF16ToJavaString(env, suggestion.snippet_text()).obj(),
148 ConvertUTF8ToJavaString(env, suggestion.url().spec()).obj(),
149 ConvertUTF8ToJavaString(env, suggestion.amp_url().spec()).obj(),
150 suggestion.publish_date().ToJavaTime(), suggestion.score());
151 }
152 return result;
153 }
154
155 void NTPSnippetsBridge::FetchSuggestionImage(
156 JNIEnv* env,
157 const JavaParamRef<jobject>& obj,
158 const JavaParamRef<jstring>& suggestion_id,
159 const JavaParamRef<jobject>& j_callback) {
103 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback); 160 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback);
104 content_suggestions_service_->FetchSuggestionImage( 161 content_suggestions_service_->FetchSuggestionImage(
105 ConvertJavaStringToUTF8(env, snippet_id), 162 ConvertJavaStringToUTF8(env, suggestion_id),
106 base::Bind(&NTPSnippetsBridge::OnImageFetched, 163 base::Bind(&NTPSnippetsBridge::OnImageFetched,
107 weak_ptr_factory_.GetWeakPtr(), callback)); 164 weak_ptr_factory_.GetWeakPtr(), callback));
108 } 165 }
109 166
110 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env, 167 void NTPSnippetsBridge::DismissSuggestion(
111 const JavaParamRef<jobject>& obj, 168 JNIEnv* env,
112 const JavaParamRef<jstring>& id) { 169 const JavaParamRef<jobject>& obj,
170 const JavaParamRef<jstring>& suggestion_id) {
113 content_suggestions_service_->DismissSuggestion( 171 content_suggestions_service_->DismissSuggestion(
114 ConvertJavaStringToUTF8(env, id)); 172 ConvertJavaStringToUTF8(env, suggestion_id));
115 } 173 }
116 174
117 void NTPSnippetsBridge::SnippetVisited(JNIEnv* env, 175 void NTPSnippetsBridge::GetSuggestionVisited(
118 const JavaParamRef<jobject>& obj, 176 JNIEnv* env,
119 const JavaParamRef<jobject>& jcallback, 177 const JavaParamRef<jobject>& obj,
120 const JavaParamRef<jstring>& jurl) { 178 const JavaParamRef<jobject>& jcallback,
179 const JavaParamRef<jstring>& jurl) {
121 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback); 180 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback);
122 181
123 history_service_->QueryURL( 182 history_service_->QueryURL(
124 GURL(ConvertJavaStringToUTF8(env, jurl)), 183 GURL(ConvertJavaStringToUTF8(env, jurl)),
125 false, 184 false,
126 base::Bind(&SnippetVisitedHistoryRequestCallback, callback), 185 base::Bind(&SnippetVisitedHistoryRequestCallback, callback),
Marc Treib 2016/08/09 13:38:16 nit: Rename to match the method
Philipp Keck 2016/08/09 14:02:54 Done.
127 &tracker_); 186 &tracker_);
128 } 187 }
129 188
130 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env,
131 const JavaParamRef<jobject>& obj,
132 jint category) {
133 return static_cast<int>(content_suggestions_service_->GetCategoryStatus(
134 content_suggestions_service_->category_factory()->FromKnownCategory(
135 KnownCategories::ARTICLES)));
136 }
137
138 NTPSnippetsBridge::~NTPSnippetsBridge() {} 189 NTPSnippetsBridge::~NTPSnippetsBridge() {}
139 190
140 void NTPSnippetsBridge::OnNewSuggestions() { 191 void NTPSnippetsBridge::OnNewSuggestions(Category category) {
141 if (observer_.is_null()) 192 if (observer_.is_null())
142 return; 193 return;
143 194
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(); 195 JNIEnv* env = base::android::AttachCurrentThread();
149 ScopedJavaLocalRef<jobject> suggestions = 196 Java_SnippetsBridge_onNewSuggestions(env, observer_.obj(),
150 Java_SnippetsBridge_createSuggestionList(env); 197 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 } 198 }
179 199
180 void NTPSnippetsBridge::OnCategoryStatusChanged(Category category, 200 void NTPSnippetsBridge::OnCategoryStatusChanged(Category category,
181 CategoryStatus new_status) { 201 CategoryStatus new_status) {
182 // TODO(mvanouwerkerk): Do not hard code ARTICLES. 202 if (observer_.is_null())
183 if (!category.IsKnownCategory(KnownCategories::ARTICLES))
184 return; 203 return;
185 204
186 JNIEnv* env = base::android::AttachCurrentThread(); 205 JNIEnv* env = base::android::AttachCurrentThread();
187 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(), 206 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(),
188 static_cast<int>(category.id()), 207 static_cast<int>(category.id()),
189 static_cast<int>(new_status)); 208 static_cast<int>(new_status));
190 } 209 }
191 210
192 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() { 211 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() {
193 observer_.Reset(); 212 observer_.Reset();
194 content_suggestions_service_observer_.Remove(content_suggestions_service_); 213 content_suggestions_service_observer_.Remove(content_suggestions_service_);
195 } 214 }
196 215
197 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback, 216 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback,
198 const std::string& snippet_id, 217 const std::string& snippet_id,
199 const gfx::Image& image) { 218 const gfx::Image& image) {
200 ScopedJavaLocalRef<jobject> j_bitmap; 219 ScopedJavaLocalRef<jobject> j_bitmap;
201 if (!image.IsEmpty()) 220 if (!image.IsEmpty())
202 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap()); 221 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap());
203 222
204 base::android::RunCallbackAndroid(callback, j_bitmap); 223 base::android::RunCallbackAndroid(callback, j_bitmap);
205 } 224 }
206 225
207 // static 226 // static
208 bool NTPSnippetsBridge::Register(JNIEnv* env) { 227 bool NTPSnippetsBridge::Register(JNIEnv* env) {
209 return RegisterNativesImpl(env); 228 return RegisterNativesImpl(env);
210 } 229 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698