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

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 comments 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 } 103 }
101 104
102 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { 105 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
103 delete this; 106 delete this;
104 } 107 }
105 108
106 void NTPSnippetsBridge::SetObserver(JNIEnv* env, 109 void NTPSnippetsBridge::SetObserver(JNIEnv* env,
107 const JavaParamRef<jobject>& obj, 110 const JavaParamRef<jobject>& obj,
108 const JavaParamRef<jobject>& j_observer) { 111 const JavaParamRef<jobject>& j_observer) {
109 observer_.Reset(env, j_observer); 112 observer_.Reset(env, j_observer);
110 OnNewSuggestions();
dgn 2016/08/10 10:31:22 We currently pull snippets when setting the observ
Philipp Keck 2016/08/10 12:36:13 Replaced with this: https://codereview.chromium.or
111 } 113 }
112 114
113 void NTPSnippetsBridge::FetchImage(JNIEnv* env, 115 ScopedJavaLocalRef<jintArray> NTPSnippetsBridge::GetCategories(
114 const JavaParamRef<jobject>& obj, 116 JNIEnv* env,
115 const JavaParamRef<jstring>& snippet_id, 117 const base::android::JavaParamRef<jobject>& obj) {
116 const JavaParamRef<jobject>& j_callback) { 118 std::vector<int> category_ids;
117 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback); 119 for (Category category : content_suggestions_service_->GetCategories()) {
118 content_suggestions_service_->FetchSuggestionImage( 120 category_ids.push_back(category.id());
119 ConvertJavaStringToUTF8(env, snippet_id), 121 }
120 base::Bind(&NTPSnippetsBridge::OnImageFetched, 122 return ToJavaIntArray(env, category_ids);
121 weak_ptr_factory_.GetWeakPtr(), callback));
122 }
123
124 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env,
125 const JavaParamRef<jobject>& obj,
126 const JavaParamRef<jstring>& id) {
127 content_suggestions_service_->DismissSuggestion(
128 ConvertJavaStringToUTF8(env, id));
129 }
130
131 void NTPSnippetsBridge::SnippetVisited(JNIEnv* env,
132 const JavaParamRef<jobject>& obj,
133 const JavaParamRef<jobject>& jcallback,
134 const JavaParamRef<jstring>& jurl) {
135 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback);
136
137 history_service_->QueryURL(
138 GURL(ConvertJavaStringToUTF8(env, jurl)),
139 false,
140 base::Bind(&SnippetVisitedHistoryRequestCallback, callback),
141 &tracker_);
142 } 123 }
143 124
144 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env, 125 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env,
145 const JavaParamRef<jobject>& obj, 126 const JavaParamRef<jobject>& obj,
146 jint category) { 127 jint category) {
147 return static_cast<int>(content_suggestions_service_->GetCategoryStatus( 128 return static_cast<int>(content_suggestions_service_->GetCategoryStatus(
148 content_suggestions_service_->category_factory()->FromKnownCategory( 129 content_suggestions_service_->category_factory()->FromIDValue(category)));
149 KnownCategories::ARTICLES))); 130 }
131
132 base::android::ScopedJavaLocalRef<jobject> NTPSnippetsBridge::GetCategoryInfo(
133 JNIEnv* env,
134 const base::android::JavaParamRef<jobject>& obj,
135 jint category) {
136 base::Optional<CategoryInfo> info =
137 content_suggestions_service_->GetCategoryInfo(
138 content_suggestions_service_->category_factory()->FromIDValue(
139 category));
140 if (!info)
141 return base::android::ScopedJavaLocalRef<jobject>(env, nullptr);
142 return Java_SnippetsBridge_createSuggestionsCategoryInfo(
143 env, ConvertUTF16ToJavaString(env, info->title()).obj(),
144 static_cast<int>(info->card_layout()));
145 }
146
147 ScopedJavaLocalRef<jobject> NTPSnippetsBridge::GetSuggestionsForCategory(
148 JNIEnv* env,
149 const base::android::JavaParamRef<jobject>& obj,
150 jint category) {
151 const std::vector<ContentSuggestion>& suggestions =
152 content_suggestions_service_->GetSuggestionsForCategory(
153 content_suggestions_service_->category_factory()->FromIDValue(
154 category));
155 ScopedJavaLocalRef<jobject> result =
156 Java_SnippetsBridge_createSuggestionList(env);
157 for (const ContentSuggestion& suggestion : suggestions) {
158 Java_SnippetsBridge_addSuggestion(
159 env, result.obj(), ConvertUTF8ToJavaString(env, suggestion.id()).obj(),
160 ConvertUTF16ToJavaString(env, suggestion.title()).obj(),
161 ConvertUTF16ToJavaString(env, suggestion.publisher_name()).obj(),
162 ConvertUTF16ToJavaString(env, suggestion.snippet_text()).obj(),
163 ConvertUTF8ToJavaString(env, suggestion.url().spec()).obj(),
164 ConvertUTF8ToJavaString(env, suggestion.amp_url().spec()).obj(),
165 suggestion.publish_date().ToJavaTime(), suggestion.score());
166 }
167 return result;
168 }
169
170 void NTPSnippetsBridge::FetchSuggestionImage(
171 JNIEnv* env,
172 const JavaParamRef<jobject>& obj,
173 const JavaParamRef<jstring>& suggestion_id,
174 const JavaParamRef<jobject>& j_callback) {
175 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback);
176 content_suggestions_service_->FetchSuggestionImage(
177 ConvertJavaStringToUTF8(env, suggestion_id),
178 base::Bind(&NTPSnippetsBridge::OnImageFetched,
179 weak_ptr_factory_.GetWeakPtr(), callback));
180 }
181
182 void NTPSnippetsBridge::DismissSuggestion(
183 JNIEnv* env,
184 const JavaParamRef<jobject>& obj,
185 const JavaParamRef<jstring>& suggestion_id) {
186 content_suggestions_service_->DismissSuggestion(
187 ConvertJavaStringToUTF8(env, suggestion_id));
188 }
189
190 void NTPSnippetsBridge::GetURLVisited(JNIEnv* env,
191 const JavaParamRef<jobject>& obj,
192 const JavaParamRef<jobject>& jcallback,
193 const JavaParamRef<jstring>& jurl) {
194 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback);
195
196 history_service_->QueryURL(
197 GURL(ConvertJavaStringToUTF8(env, jurl)), false,
198 base::Bind(&URLVisitedHistoryRequestCallback, callback), &tracker_);
150 } 199 }
151 200
152 NTPSnippetsBridge::~NTPSnippetsBridge() {} 201 NTPSnippetsBridge::~NTPSnippetsBridge() {}
153 202
154 void NTPSnippetsBridge::OnNewSuggestions() { 203 void NTPSnippetsBridge::OnNewSuggestions(Category category) {
155 if (observer_.is_null()) 204 if (observer_.is_null())
156 return; 205 return;
157 206
158 // Show all suggestions from all categories, even though we currently display
159 // them in a single section on the UI.
160 // TODO(pke): This is only for debugging new sections and will be replaced
161 // with proper multi-section UI support.
162 JNIEnv* env = base::android::AttachCurrentThread(); 207 JNIEnv* env = base::android::AttachCurrentThread();
163 ScopedJavaLocalRef<jobject> suggestions = 208 Java_SnippetsBridge_onNewSuggestions(env, observer_.obj(),
164 Java_SnippetsBridge_createSuggestionList(env); 209 static_cast<int>(category.id()));
165 for (Category category :
166 content_suggestions_service_->GetCategories()) {
167 if (content_suggestions_service_->GetCategoryStatus(category) !=
168 CategoryStatus::AVAILABLE) {
169 continue;
170 }
171 for (const ntp_snippets::ContentSuggestion& suggestion :
172 content_suggestions_service_->GetSuggestionsForCategory(category)) {
173 Java_SnippetsBridge_addSuggestion(
174 env, suggestions.obj(),
175 ConvertUTF8ToJavaString(env, suggestion.id()).obj(),
176 ConvertUTF16ToJavaString(env, suggestion.title()).obj(),
177 ConvertUTF16ToJavaString(env, suggestion.publisher_name()).obj(),
178 ConvertUTF16ToJavaString(env, suggestion.snippet_text()).obj(),
179 ConvertUTF8ToJavaString(env, suggestion.url().spec()).obj(),
180 ConvertUTF8ToJavaString(env, suggestion.amp_url().spec()).obj(),
181 suggestion.publish_date().ToJavaTime(), suggestion.score());
182 }
183 }
184
185 // TODO(mvanouwerkerk): Do not hard code ARTICLES.
186 Java_SnippetsBridge_onSuggestionsAvailable(
187 env, observer_.obj(),
188 static_cast<int>(
189 content_suggestions_service_->category_factory()->FromKnownCategory(
190 KnownCategories::ARTICLES).id()),
191 suggestions.obj());
192 } 210 }
193 211
194 void NTPSnippetsBridge::OnCategoryStatusChanged(Category category, 212 void NTPSnippetsBridge::OnCategoryStatusChanged(Category category,
195 CategoryStatus new_status) { 213 CategoryStatus new_status) {
196 // TODO(mvanouwerkerk): Do not hard code ARTICLES. 214 if (observer_.is_null())
197 if (!category.IsKnownCategory(KnownCategories::ARTICLES))
198 return; 215 return;
199 216
200 JNIEnv* env = base::android::AttachCurrentThread(); 217 JNIEnv* env = base::android::AttachCurrentThread();
201 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(), 218 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(),
202 static_cast<int>(category.id()), 219 static_cast<int>(category.id()),
203 static_cast<int>(new_status)); 220 static_cast<int>(new_status));
204 } 221 }
205 222
206 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() { 223 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() {
207 observer_.Reset(); 224 observer_.Reset();
208 content_suggestions_service_observer_.Remove(content_suggestions_service_); 225 content_suggestions_service_observer_.Remove(content_suggestions_service_);
209 } 226 }
210 227
211 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback, 228 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback,
212 const std::string& snippet_id, 229 const std::string& snippet_id,
213 const gfx::Image& image) { 230 const gfx::Image& image) {
214 ScopedJavaLocalRef<jobject> j_bitmap; 231 ScopedJavaLocalRef<jobject> j_bitmap;
215 if (!image.IsEmpty()) 232 if (!image.IsEmpty())
216 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap()); 233 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap());
217 234
218 base::android::RunCallbackAndroid(callback, j_bitmap); 235 base::android::RunCallbackAndroid(callback, j_bitmap);
219 } 236 }
220 237
221 // static 238 // static
222 bool NTPSnippetsBridge::Register(JNIEnv* env) { 239 bool NTPSnippetsBridge::Register(JNIEnv* env) {
223 return RegisterNativesImpl(env); 240 return RegisterNativesImpl(env);
224 } 241 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698