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

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

Issue 2158883002: Change NTPSnippetsBridge to read from ContentSuggestionsService (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@offlinepagesprovider
Patch Set: Marc's comments Created 4 years, 5 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"
11 #include "base/android/jni_array.h" 11 #include "base/android/jni_array.h"
12 #include "base/android/jni_string.h" 12 #include "base/android/jni_string.h"
13 #include "base/callback.h" 13 #include "base/callback.h"
14 #include "chrome/browser/history/history_service_factory.h" 14 #include "chrome/browser/history/history_service_factory.h"
15 #include "chrome/browser/ntp_snippets/content_suggestions_service_factory.h"
15 #include "chrome/browser/ntp_snippets/ntp_snippets_service_factory.h" 16 #include "chrome/browser/ntp_snippets/ntp_snippets_service_factory.h"
Marc Treib 2016/07/20 09:17:38 Not needed anymore
Philipp Keck 2016/07/20 13:20:02 It's still needed in the static methods FetchSnipp
Marc Treib 2016/07/20 13:41:11 Ah, right. Hm, we could pipe both of these through
Philipp Keck 2016/07/20 14:51:15 For now, I'd consider it an implementation detail
Marc Treib 2016/07/20 14:56:02 For the scheduling I agree (and it's really just o
16 #include "chrome/browser/profiles/profile.h" 17 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/browser/profiles/profile_android.h" 18 #include "chrome/browser/profiles/profile_android.h"
18 #include "chrome/browser/profiles/profile_manager.h" 19 #include "chrome/browser/profiles/profile_manager.h"
19 #include "components/history/core/browser/history_service.h" 20 #include "components/history/core/browser/history_service.h"
20 #include "components/ntp_snippets/ntp_snippet.h" 21 #include "components/ntp_snippets/content_suggestion.h"
21 #include "components/ntp_snippets/ntp_snippets_service.h"
22 #include "jni/SnippetsBridge_jni.h" 22 #include "jni/SnippetsBridge_jni.h"
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::JavaParamRef; 28 using base::android::JavaParamRef;
29 using base::android::ToJavaArrayOfStrings; 29 using base::android::ToJavaArrayOfStrings;
30 using base::android::ToJavaLongArray; 30 using base::android::ToJavaLongArray;
31 using base::android::ToJavaFloatArray; 31 using base::android::ToJavaFloatArray;
32 using base::android::ScopedJavaGlobalRef; 32 using base::android::ScopedJavaGlobalRef;
33 using base::android::ScopedJavaLocalRef; 33 using base::android::ScopedJavaLocalRef;
34 using ntp_snippets::ContentSuggestionsCategory;
35 using ntp_snippets::ContentSuggestionsCategoryStatus;
34 36
35 namespace { 37 namespace {
36 38
37 void SnippetVisitedHistoryRequestCallback( 39 void SnippetVisitedHistoryRequestCallback(
38 base::android::ScopedJavaGlobalRef<jobject> callback, 40 base::android::ScopedJavaGlobalRef<jobject> callback,
39 bool success, 41 bool success,
40 const history::URLRow& row, 42 const history::URLRow& row,
41 const history::VisitVector& visitVector) { 43 const history::VisitVector& visitVector) {
42 bool visited = success && row.visit_count() != 0; 44 bool visited = success && row.visit_count() != 0;
43 base::android::RunCallbackAndroid(callback, visited); 45 base::android::RunCallbackAndroid(callback, visited);
(...skipping 17 matching lines...) Expand all
61 // Reschedules the fetching of snippets. Used to support different fetching 63 // Reschedules the fetching of snippets. Used to support different fetching
62 // intervals for different times of day. 64 // intervals for different times of day.
63 static void RescheduleFetching(JNIEnv* env, 65 static void RescheduleFetching(JNIEnv* env,
64 const JavaParamRef<jclass>& caller) { 66 const JavaParamRef<jclass>& caller) {
65 Profile* profile = ProfileManager::GetLastUsedProfile(); 67 Profile* profile = ProfileManager::GetLastUsedProfile();
66 NTPSnippetsServiceFactory::GetForProfile(profile)->RescheduleFetching(); 68 NTPSnippetsServiceFactory::GetForProfile(profile)->RescheduleFetching();
67 } 69 }
68 70
69 NTPSnippetsBridge::NTPSnippetsBridge(JNIEnv* env, 71 NTPSnippetsBridge::NTPSnippetsBridge(JNIEnv* env,
70 const JavaParamRef<jobject>& j_profile) 72 const JavaParamRef<jobject>& j_profile)
71 : snippet_service_observer_(this), weak_ptr_factory_(this) { 73 : content_suggestions_service_observer_(this), weak_ptr_factory_(this) {
72 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 74 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
73 ntp_snippets_service_ = NTPSnippetsServiceFactory::GetForProfile(profile); 75 content_suggestions_service_ =
76 ContentSuggestionsServiceFactory::GetForProfile(profile);
74 history_service_ = 77 history_service_ =
75 HistoryServiceFactory::GetForProfile(profile, 78 HistoryServiceFactory::GetForProfile(profile,
76 ServiceAccessType::EXPLICIT_ACCESS); 79 ServiceAccessType::EXPLICIT_ACCESS);
77 snippet_service_observer_.Add(ntp_snippets_service_); 80 content_suggestions_service_observer_.Add(content_suggestions_service_);
78 } 81 }
79 82
80 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { 83 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
81 delete this; 84 delete this;
82 } 85 }
83 86
84 void NTPSnippetsBridge::SetObserver(JNIEnv* env, 87 void NTPSnippetsBridge::SetObserver(JNIEnv* env,
85 const JavaParamRef<jobject>& obj, 88 const JavaParamRef<jobject>& obj,
86 const JavaParamRef<jobject>& j_observer) { 89 const JavaParamRef<jobject>& j_observer) {
87 observer_.Reset(env, j_observer); 90 observer_.Reset(env, j_observer);
88 NTPSnippetsServiceLoaded(); 91 OnNewSuggestions();
89 } 92 }
90 93
91 void NTPSnippetsBridge::FetchImage(JNIEnv* env, 94 void NTPSnippetsBridge::FetchImage(JNIEnv* env,
92 const JavaParamRef<jobject>& obj, 95 const JavaParamRef<jobject>& obj,
93 const JavaParamRef<jstring>& snippet_id, 96 const JavaParamRef<jstring>& snippet_id,
94 const JavaParamRef<jobject>& j_callback) { 97 const JavaParamRef<jobject>& j_callback) {
95 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback); 98 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback);
96 ntp_snippets_service_->FetchSuggestionImage( 99 content_suggestions_service_->FetchSuggestionImage(
97 ConvertJavaStringToUTF8(env, snippet_id), 100 ConvertJavaStringToUTF8(env, snippet_id),
98 base::Bind(&NTPSnippetsBridge::OnImageFetched, 101 base::Bind(&NTPSnippetsBridge::OnImageFetched,
99 weak_ptr_factory_.GetWeakPtr(), callback)); 102 weak_ptr_factory_.GetWeakPtr(), callback));
100 } 103 }
101 104
102 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env, 105 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env,
103 const JavaParamRef<jobject>& obj, 106 const JavaParamRef<jobject>& obj,
104 const JavaParamRef<jstring>& id) { 107 const JavaParamRef<jstring>& id) {
105 ntp_snippets_service_->DiscardSuggestion(ConvertJavaStringToUTF8(env, id)); 108 content_suggestions_service_->DiscardSuggestion(
109 ConvertJavaStringToUTF8(env, id));
106 } 110 }
107 111
108 void NTPSnippetsBridge::SnippetVisited(JNIEnv* env, 112 void NTPSnippetsBridge::SnippetVisited(JNIEnv* env,
109 const JavaParamRef<jobject>& obj, 113 const JavaParamRef<jobject>& obj,
110 const JavaParamRef<jobject>& jcallback, 114 const JavaParamRef<jobject>& jcallback,
111 const JavaParamRef<jstring>& jurl) { 115 const JavaParamRef<jstring>& jurl) {
112 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback); 116 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback);
113 117
114 history_service_->QueryURL( 118 history_service_->QueryURL(
115 GURL(ConvertJavaStringToUTF8(env, jurl)), 119 GURL(ConvertJavaStringToUTF8(env, jurl)),
116 false, 120 false,
117 base::Bind(&SnippetVisitedHistoryRequestCallback, callback), 121 base::Bind(&SnippetVisitedHistoryRequestCallback, callback),
118 &tracker_); 122 &tracker_);
119 } 123 }
120 124
121 int NTPSnippetsBridge::GetDisabledReason(JNIEnv* env, 125 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env,
122 const JavaParamRef<jobject>& obj) { 126 const JavaParamRef<jobject>& obj) {
123 return static_cast<int>(ntp_snippets_service_->disabled_reason()); 127 return static_cast<int>(content_suggestions_service_->GetCategoryStatus(
128 ContentSuggestionsCategory::ARTICLES));
124 } 129 }
125 130
126 NTPSnippetsBridge::~NTPSnippetsBridge() {} 131 NTPSnippetsBridge::~NTPSnippetsBridge() {}
127 132
128 void NTPSnippetsBridge::NTPSnippetsServiceLoaded() { 133 void NTPSnippetsBridge::OnNewSuggestions() {
129 if (observer_.is_null()) 134 if (observer_.is_null())
130 return; 135 return;
131 136
132 std::vector<std::string> ids; 137 std::vector<std::string> ids;
133 std::vector<std::string> titles; 138 std::vector<std::string> titles;
134 // URL for the article. This will also be used to find the favicon for the 139 // URL for the article. This will also be used to find the favicon for the
135 // article. 140 // article.
136 std::vector<std::string> urls; 141 std::vector<std::string> urls;
137 // URL for the AMP version of the article if it exists. This will be used as 142 // URL for the AMP version of the article if it exists. This will be used as
138 // the URL to direct the user to on tap. 143 // the URL to direct the user to on tap.
139 std::vector<std::string> amp_urls; 144 std::vector<std::string> amp_urls;
140 std::vector<std::string> thumbnail_urls;
141 std::vector<std::string> snippets; 145 std::vector<std::string> snippets;
142 std::vector<int64_t> timestamps; 146 std::vector<int64_t> timestamps;
143 std::vector<std::string> publishers; 147 std::vector<std::string> publishers;
144 std::vector<float> scores; 148 std::vector<float> scores;
145 for (const std::unique_ptr<ntp_snippets::NTPSnippet>& snippet : 149 for (const ntp_snippets::ContentSuggestion& suggestion :
146 ntp_snippets_service_->snippets()) { 150 content_suggestions_service_->GetSuggestionsForCategory(
147 ids.push_back(snippet->id()); 151 ContentSuggestionsCategory::ARTICLES)) {
148 titles.push_back(snippet->title()); 152 ids.push_back(suggestion.id());
153 titles.push_back(suggestion.title());
149 // The url from source_info is a url for a site that is one of the 154 // The url from source_info is a url for a site that is one of the
150 // HOST_RESTRICT parameters, so this is preferred. 155 // HOST_RESTRICT parameters, so this is preferred.
151 urls.push_back(snippet->best_source().url.spec()); 156 urls.push_back(suggestion.url().spec());
152 amp_urls.push_back(snippet->best_source().amp_url.spec()); 157 amp_urls.push_back(suggestion.amp_url().spec());
153 thumbnail_urls.push_back(snippet->salient_image_url().spec()); 158 snippets.push_back(suggestion.snippet_text());
154 snippets.push_back(snippet->snippet()); 159 timestamps.push_back(suggestion.publish_date().ToJavaTime());
155 timestamps.push_back(snippet->publish_date().ToJavaTime()); 160 publishers.push_back(suggestion.publisher_name());
156 publishers.push_back(snippet->best_source().publisher_name); 161 scores.push_back(suggestion.score());
157 scores.push_back(snippet->score());
158 } 162 }
159 163
160 JNIEnv* env = base::android::AttachCurrentThread(); 164 JNIEnv* env = base::android::AttachCurrentThread();
161 Java_SnippetsBridge_onSnippetsAvailable( 165 Java_SnippetsBridge_onSnippetsAvailable(
162 env, observer_.obj(), ToJavaArrayOfStrings(env, ids).obj(), 166 env, observer_.obj(), ToJavaArrayOfStrings(env, ids).obj(),
163 ToJavaArrayOfStrings(env, titles).obj(), 167 ToJavaArrayOfStrings(env, titles).obj(),
164 ToJavaArrayOfStrings(env, urls).obj(), 168 ToJavaArrayOfStrings(env, urls).obj(),
165 ToJavaArrayOfStrings(env, amp_urls).obj(), 169 ToJavaArrayOfStrings(env, amp_urls).obj(),
166 ToJavaArrayOfStrings(env, thumbnail_urls).obj(),
167 ToJavaArrayOfStrings(env, snippets).obj(), 170 ToJavaArrayOfStrings(env, snippets).obj(),
168 ToJavaLongArray(env, timestamps).obj(), 171 ToJavaLongArray(env, timestamps).obj(),
169 ToJavaArrayOfStrings(env, publishers).obj(), 172 ToJavaArrayOfStrings(env, publishers).obj(),
170 ToJavaFloatArray(env, scores).obj()); 173 ToJavaFloatArray(env, scores).obj());
171 } 174 }
172 175
173 void NTPSnippetsBridge::NTPSnippetsServiceShutdown() { 176 void NTPSnippetsBridge::OnCategoryStatusChanged(
174 observer_.Reset(); 177 ContentSuggestionsCategory category,
175 snippet_service_observer_.Remove(ntp_snippets_service_); 178 ContentSuggestionsCategoryStatus new_status) {
179 if (category != ContentSuggestionsCategory::ARTICLES)
180 return;
181
182 JNIEnv* env = base::android::AttachCurrentThread();
183 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(),
184 static_cast<int>(new_status));
176 } 185 }
177 186
178 void NTPSnippetsBridge::NTPSnippetsServiceDisabledReasonChanged( 187 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() {
179 ntp_snippets::DisabledReason disabled_reason) { 188 observer_.Reset();
180 // The user signed out or disabled sync. Since snippets rely on those, we 189 content_suggestions_service_observer_.Remove(content_suggestions_service_);
181 // clear them to be consistent with the initially signed out state.
182 JNIEnv* env = base::android::AttachCurrentThread();
183 Java_SnippetsBridge_onDisabledReasonChanged(
184 env, observer_.obj(), static_cast<int>(disabled_reason));
185 } 190 }
186 191
187 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback, 192 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback,
188 const std::string& snippet_id, 193 const std::string& snippet_id,
189 const gfx::Image& image) { 194 const gfx::Image& image) {
190 ScopedJavaLocalRef<jobject> j_bitmap; 195 ScopedJavaLocalRef<jobject> j_bitmap;
191 if (!image.IsEmpty()) 196 if (!image.IsEmpty())
192 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap()); 197 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap());
193 198
194 base::android::RunCallbackAndroid(callback, j_bitmap); 199 base::android::RunCallbackAndroid(callback, j_bitmap);
195 } 200 }
196 201
197 // static 202 // static
198 bool NTPSnippetsBridge::Register(JNIEnv* env) { 203 bool NTPSnippetsBridge::Register(JNIEnv* env) {
199 return RegisterNativesImpl(env); 204 return RegisterNativesImpl(env);
200 } 205 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698