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

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; Rebase 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
« no previous file with comments | « chrome/browser/android/ntp/ntp_snippets_bridge.h ('k') | components/ntp_snippets/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
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 "components/ntp_snippets/ntp_snippets_service.h"
22 #include "jni/SnippetsBridge_jni.h" 23 #include "jni/SnippetsBridge_jni.h"
23 #include "ui/gfx/android/java_bitmap.h" 24 #include "ui/gfx/android/java_bitmap.h"
24 #include "ui/gfx/image/image.h" 25 #include "ui/gfx/image/image.h"
25 26
26 using base::android::AttachCurrentThread; 27 using base::android::AttachCurrentThread;
27 using base::android::ConvertJavaStringToUTF8; 28 using base::android::ConvertJavaStringToUTF8;
28 using base::android::JavaParamRef; 29 using base::android::JavaParamRef;
29 using base::android::ToJavaArrayOfStrings; 30 using base::android::ToJavaArrayOfStrings;
30 using base::android::ToJavaLongArray; 31 using base::android::ToJavaLongArray;
31 using base::android::ToJavaFloatArray; 32 using base::android::ToJavaFloatArray;
32 using base::android::ScopedJavaGlobalRef; 33 using base::android::ScopedJavaGlobalRef;
33 using base::android::ScopedJavaLocalRef; 34 using base::android::ScopedJavaLocalRef;
35 using ntp_snippets::ContentSuggestionsCategory;
36 using ntp_snippets::ContentSuggestionsCategoryStatus;
34 37
35 namespace { 38 namespace {
36 39
37 void SnippetVisitedHistoryRequestCallback( 40 void SnippetVisitedHistoryRequestCallback(
38 base::android::ScopedJavaGlobalRef<jobject> callback, 41 base::android::ScopedJavaGlobalRef<jobject> callback,
39 bool success, 42 bool success,
40 const history::URLRow& row, 43 const history::URLRow& row,
41 const history::VisitVector& visitVector) { 44 const history::VisitVector& visitVector) {
42 bool visited = success && row.visit_count() != 0; 45 bool visited = success && row.visit_count() != 0;
43 base::android::RunCallbackAndroid(callback, visited); 46 base::android::RunCallbackAndroid(callback, visited);
(...skipping 17 matching lines...) Expand all
61 // Reschedules the fetching of snippets. Used to support different fetching 64 // Reschedules the fetching of snippets. Used to support different fetching
62 // intervals for different times of day. 65 // intervals for different times of day.
63 static void RescheduleFetching(JNIEnv* env, 66 static void RescheduleFetching(JNIEnv* env,
64 const JavaParamRef<jclass>& caller) { 67 const JavaParamRef<jclass>& caller) {
65 Profile* profile = ProfileManager::GetLastUsedProfile(); 68 Profile* profile = ProfileManager::GetLastUsedProfile();
66 NTPSnippetsServiceFactory::GetForProfile(profile)->RescheduleFetching(); 69 NTPSnippetsServiceFactory::GetForProfile(profile)->RescheduleFetching();
67 } 70 }
68 71
69 NTPSnippetsBridge::NTPSnippetsBridge(JNIEnv* env, 72 NTPSnippetsBridge::NTPSnippetsBridge(JNIEnv* env,
70 const JavaParamRef<jobject>& j_profile) 73 const JavaParamRef<jobject>& j_profile)
71 : snippet_service_observer_(this), weak_ptr_factory_(this) { 74 : content_suggestions_service_observer_(this), weak_ptr_factory_(this) {
72 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 75 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
73 ntp_snippets_service_ = NTPSnippetsServiceFactory::GetForProfile(profile); 76 content_suggestions_service_ =
77 ContentSuggestionsServiceFactory::GetForProfile(profile);
74 history_service_ = 78 history_service_ =
75 HistoryServiceFactory::GetForProfile(profile, 79 HistoryServiceFactory::GetForProfile(profile,
76 ServiceAccessType::EXPLICIT_ACCESS); 80 ServiceAccessType::EXPLICIT_ACCESS);
77 snippet_service_observer_.Add(ntp_snippets_service_); 81 content_suggestions_service_observer_.Add(content_suggestions_service_);
78 } 82 }
79 83
80 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { 84 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
81 delete this; 85 delete this;
82 } 86 }
83 87
84 void NTPSnippetsBridge::SetObserver(JNIEnv* env, 88 void NTPSnippetsBridge::SetObserver(JNIEnv* env,
85 const JavaParamRef<jobject>& obj, 89 const JavaParamRef<jobject>& obj,
86 const JavaParamRef<jobject>& j_observer) { 90 const JavaParamRef<jobject>& j_observer) {
87 observer_.Reset(env, j_observer); 91 observer_.Reset(env, j_observer);
88 NTPSnippetsServiceLoaded(); 92 OnNewSuggestions();
89 } 93 }
90 94
91 void NTPSnippetsBridge::FetchImage(JNIEnv* env, 95 void NTPSnippetsBridge::FetchImage(JNIEnv* env,
92 const JavaParamRef<jobject>& obj, 96 const JavaParamRef<jobject>& obj,
93 const JavaParamRef<jstring>& snippet_id, 97 const JavaParamRef<jstring>& snippet_id,
94 const JavaParamRef<jobject>& j_callback) { 98 const JavaParamRef<jobject>& j_callback) {
95 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback); 99 base::android::ScopedJavaGlobalRef<jobject> callback(j_callback);
96 ntp_snippets_service_->FetchSuggestionImage( 100 content_suggestions_service_->FetchSuggestionImage(
97 ConvertJavaStringToUTF8(env, snippet_id), 101 ConvertJavaStringToUTF8(env, snippet_id),
98 base::Bind(&NTPSnippetsBridge::OnImageFetched, 102 base::Bind(&NTPSnippetsBridge::OnImageFetched,
99 weak_ptr_factory_.GetWeakPtr(), callback)); 103 weak_ptr_factory_.GetWeakPtr(), callback));
100 } 104 }
101 105
102 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env, 106 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env,
103 const JavaParamRef<jobject>& obj, 107 const JavaParamRef<jobject>& obj,
104 const JavaParamRef<jstring>& id) { 108 const JavaParamRef<jstring>& id) {
105 ntp_snippets_service_->DiscardSuggestion(ConvertJavaStringToUTF8(env, id)); 109 content_suggestions_service_->DiscardSuggestion(
110 ConvertJavaStringToUTF8(env, id));
106 } 111 }
107 112
108 void NTPSnippetsBridge::SnippetVisited(JNIEnv* env, 113 void NTPSnippetsBridge::SnippetVisited(JNIEnv* env,
109 const JavaParamRef<jobject>& obj, 114 const JavaParamRef<jobject>& obj,
110 const JavaParamRef<jobject>& jcallback, 115 const JavaParamRef<jobject>& jcallback,
111 const JavaParamRef<jstring>& jurl) { 116 const JavaParamRef<jstring>& jurl) {
112 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback); 117 base::android::ScopedJavaGlobalRef<jobject> callback(jcallback);
113 118
114 history_service_->QueryURL( 119 history_service_->QueryURL(
115 GURL(ConvertJavaStringToUTF8(env, jurl)), 120 GURL(ConvertJavaStringToUTF8(env, jurl)),
116 false, 121 false,
117 base::Bind(&SnippetVisitedHistoryRequestCallback, callback), 122 base::Bind(&SnippetVisitedHistoryRequestCallback, callback),
118 &tracker_); 123 &tracker_);
119 } 124 }
120 125
121 int NTPSnippetsBridge::GetDisabledReason(JNIEnv* env, 126 int NTPSnippetsBridge::GetCategoryStatus(JNIEnv* env,
122 const JavaParamRef<jobject>& obj) { 127 const JavaParamRef<jobject>& obj) {
123 return static_cast<int>(ntp_snippets_service_->disabled_reason()); 128 return static_cast<int>(content_suggestions_service_->GetCategoryStatus(
129 ContentSuggestionsCategory::ARTICLES));
124 } 130 }
125 131
126 NTPSnippetsBridge::~NTPSnippetsBridge() {} 132 NTPSnippetsBridge::~NTPSnippetsBridge() {}
127 133
128 void NTPSnippetsBridge::NTPSnippetsServiceLoaded() { 134 void NTPSnippetsBridge::OnNewSuggestions() {
129 if (observer_.is_null()) 135 if (observer_.is_null())
130 return; 136 return;
131 137
132 std::vector<std::string> ids; 138 std::vector<std::string> ids;
133 std::vector<std::string> titles; 139 std::vector<std::string> titles;
134 // URL for the article. This will also be used to find the favicon for the 140 // URL for the article. This will also be used to find the favicon for the
135 // article. 141 // article.
136 std::vector<std::string> urls; 142 std::vector<std::string> urls;
137 // URL for the AMP version of the article if it exists. This will be used as 143 // 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. 144 // the URL to direct the user to on tap.
139 std::vector<std::string> amp_urls; 145 std::vector<std::string> amp_urls;
140 std::vector<std::string> thumbnail_urls;
141 std::vector<std::string> snippets; 146 std::vector<std::string> snippets;
142 std::vector<int64_t> timestamps; 147 std::vector<int64_t> timestamps;
143 std::vector<std::string> publishers; 148 std::vector<std::string> publishers;
144 std::vector<float> scores; 149 std::vector<float> scores;
145 for (const std::unique_ptr<ntp_snippets::NTPSnippet>& snippet : 150 for (const ntp_snippets::ContentSuggestion& suggestion :
146 ntp_snippets_service_->snippets()) { 151 content_suggestions_service_->GetSuggestionsForCategory(
147 ids.push_back(snippet->id()); 152 ContentSuggestionsCategory::ARTICLES)) {
148 titles.push_back(snippet->title()); 153 ids.push_back(suggestion.id());
154 titles.push_back(suggestion.title());
149 // The url from source_info is a url for a site that is one of the 155 // The url from source_info is a url for a site that is one of the
150 // HOST_RESTRICT parameters, so this is preferred. 156 // HOST_RESTRICT parameters, so this is preferred.
151 urls.push_back(snippet->best_source().url.spec()); 157 urls.push_back(suggestion.url().spec());
152 amp_urls.push_back(snippet->best_source().amp_url.spec()); 158 amp_urls.push_back(suggestion.amp_url().spec());
153 thumbnail_urls.push_back(snippet->salient_image_url().spec()); 159 snippets.push_back(suggestion.snippet_text());
154 snippets.push_back(snippet->snippet()); 160 timestamps.push_back(suggestion.publish_date().ToJavaTime());
155 timestamps.push_back(snippet->publish_date().ToJavaTime()); 161 publishers.push_back(suggestion.publisher_name());
156 publishers.push_back(snippet->best_source().publisher_name); 162 scores.push_back(suggestion.score());
157 scores.push_back(snippet->score());
158 } 163 }
159 164
160 JNIEnv* env = base::android::AttachCurrentThread(); 165 JNIEnv* env = base::android::AttachCurrentThread();
161 Java_SnippetsBridge_onSnippetsAvailable( 166 Java_SnippetsBridge_onSnippetsAvailable(
162 env, observer_.obj(), ToJavaArrayOfStrings(env, ids).obj(), 167 env, observer_.obj(), ToJavaArrayOfStrings(env, ids).obj(),
163 ToJavaArrayOfStrings(env, titles).obj(), 168 ToJavaArrayOfStrings(env, titles).obj(),
164 ToJavaArrayOfStrings(env, urls).obj(), 169 ToJavaArrayOfStrings(env, urls).obj(),
165 ToJavaArrayOfStrings(env, amp_urls).obj(), 170 ToJavaArrayOfStrings(env, amp_urls).obj(),
166 ToJavaArrayOfStrings(env, thumbnail_urls).obj(),
167 ToJavaArrayOfStrings(env, snippets).obj(), 171 ToJavaArrayOfStrings(env, snippets).obj(),
168 ToJavaLongArray(env, timestamps).obj(), 172 ToJavaLongArray(env, timestamps).obj(),
169 ToJavaArrayOfStrings(env, publishers).obj(), 173 ToJavaArrayOfStrings(env, publishers).obj(),
170 ToJavaFloatArray(env, scores).obj()); 174 ToJavaFloatArray(env, scores).obj());
171 } 175 }
172 176
173 void NTPSnippetsBridge::NTPSnippetsServiceShutdown() { 177 void NTPSnippetsBridge::OnCategoryStatusChanged(
174 observer_.Reset(); 178 ContentSuggestionsCategory category,
175 snippet_service_observer_.Remove(ntp_snippets_service_); 179 ContentSuggestionsCategoryStatus new_status) {
180 if (category != ContentSuggestionsCategory::ARTICLES)
181 return;
182
183 JNIEnv* env = base::android::AttachCurrentThread();
184 Java_SnippetsBridge_onCategoryStatusChanged(env, observer_.obj(),
185 static_cast<int>(new_status));
176 } 186 }
177 187
178 void NTPSnippetsBridge::NTPSnippetsServiceDisabledReasonChanged( 188 void NTPSnippetsBridge::ContentSuggestionsServiceShutdown() {
179 ntp_snippets::DisabledReason disabled_reason) { 189 observer_.Reset();
180 // The user signed out or disabled sync. Since snippets rely on those, we 190 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 } 191 }
186 192
187 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback, 193 void NTPSnippetsBridge::OnImageFetched(ScopedJavaGlobalRef<jobject> callback,
188 const std::string& snippet_id, 194 const std::string& snippet_id,
189 const gfx::Image& image) { 195 const gfx::Image& image) {
190 ScopedJavaLocalRef<jobject> j_bitmap; 196 ScopedJavaLocalRef<jobject> j_bitmap;
191 if (!image.IsEmpty()) 197 if (!image.IsEmpty())
192 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap()); 198 j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap());
193 199
194 base::android::RunCallbackAndroid(callback, j_bitmap); 200 base::android::RunCallbackAndroid(callback, j_bitmap);
195 } 201 }
196 202
197 // static 203 // static
198 bool NTPSnippetsBridge::Register(JNIEnv* env) { 204 bool NTPSnippetsBridge::Register(JNIEnv* env) {
199 return RegisterNativesImpl(env); 205 return RegisterNativesImpl(env);
200 } 206 }
OLDNEW
« no previous file with comments | « chrome/browser/android/ntp/ntp_snippets_bridge.h ('k') | components/ntp_snippets/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698