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

Unified Diff: components/ntp_snippets/ntp_snippets_service.cc

Issue 2131943002: Change NTPSnippetsService to implement ContentSuggestionsProvider (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@neuerservice2
Patch Set: Rename ERROR to LOADING_ERROR for compatibility with Windows compilers 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 side-by-side diff with in-line comments
Download patch
Index: components/ntp_snippets/ntp_snippets_service.cc
diff --git a/components/ntp_snippets/ntp_snippets_service.cc b/components/ntp_snippets/ntp_snippets_service.cc
index 51efc2a634d7c014f6fb5099c96fb6b8c51f189a..3ca187619dabdaf930fe055bba7663d8d53a8503 100644
--- a/components/ntp_snippets/ntp_snippets_service.cc
+++ b/components/ntp_snippets/ntp_snippets_service.cc
@@ -193,10 +193,13 @@ NTPSnippetsService::NTPSnippetsService(
std::unique_ptr<ImageDecoder> image_decoder,
std::unique_ptr<NTPSnippetsDatabase> database,
std::unique_ptr<NTPSnippetsStatusService> status_service)
- : state_(State::NOT_INITED),
+ : ContentSuggestionsProvider({ContentSuggestionsCategory::ARTICLES}),
+ state_(State::NOT_INITED),
+ category_status_(ContentSuggestionsCategoryStatus::INITIALIZING),
pref_service_(pref_service),
suggestions_service_(suggestions_service),
application_language_code_(application_language_code),
+ observer_(nullptr),
scheduler_(scheduler),
snippets_fetcher_(std::move(snippets_fetcher)),
image_fetcher_(std::move(image_fetcher)),
@@ -204,9 +207,15 @@ NTPSnippetsService::NTPSnippetsService(
database_(std::move(database)),
snippets_status_service_(std::move(status_service)),
fetch_after_load_(false) {
- if (!enabled || database_->IsErrorState()) {
- // Don't even bother loading the database.
- EnterState(State::SHUT_DOWN);
+ // In some cases, don't even bother loading the database.
+ if (!enabled) {
+ EnterState(State::SHUT_DOWN,
+ ContentSuggestionsCategoryStatus::CATEGORY_EXPLICITLY_DISABLED);
+ return;
+ }
+ if (database_->IsErrorState()) {
+ EnterState(State::SHUT_DOWN,
+ ContentSuggestionsCategoryStatus::LOADING_ERROR);
return;
}
@@ -230,7 +239,7 @@ void NTPSnippetsService::RegisterProfilePrefs(PrefRegistrySimple* registry) {
// Inherited from KeyedService.
void NTPSnippetsService::Shutdown() {
- EnterState(State::SHUT_DOWN);
+ EnterState(State::SHUT_DOWN, ContentSuggestionsCategoryStatus::NOT_PROVIDED);
}
void NTPSnippetsService::FetchSnippets() {
@@ -263,16 +272,16 @@ void NTPSnippetsService::RescheduleFetching() {
}
}
-void NTPSnippetsService::FetchSnippetImage(
- const std::string& snippet_id,
+void NTPSnippetsService::FetchSuggestionImage(
+ const std::string& suggestion_id,
const ImageFetchedCallback& callback) {
database_->LoadImage(
- snippet_id,
+ suggestion_id,
base::Bind(&NTPSnippetsService::OnSnippetImageFetchedFromDatabase,
- base::Unretained(this), snippet_id, callback));
+ base::Unretained(this), suggestion_id, callback));
}
-void NTPSnippetsService::ClearSnippets() {
+void NTPSnippetsService::ClearCachedSuggestionsForDebugging() {
if (!initialized())
return;
@@ -282,8 +291,7 @@ void NTPSnippetsService::ClearSnippets() {
database_->DeleteSnippets(snippets_);
snippets_.clear();
- FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_,
- NTPSnippetsServiceLoaded());
+ NotifyNewSuggestions();
}
std::set<std::string> NTPSnippetsService::GetSuggestionsHosts() const {
@@ -296,17 +304,17 @@ std::set<std::string> NTPSnippetsService::GetSuggestionsHosts() const {
suggestions_service_->GetSuggestionsDataFromCache());
}
-bool NTPSnippetsService::DiscardSnippet(const std::string& snippet_id) {
+void NTPSnippetsService::DiscardSuggestion(const std::string& suggestion_id) {
if (!ready())
- return false;
+ return;
- auto it =
- std::find_if(snippets_.begin(), snippets_.end(),
- [&snippet_id](const std::unique_ptr<NTPSnippet>& snippet) {
- return snippet->id() == snippet_id;
- });
+ auto it = std::find_if(
+ snippets_.begin(), snippets_.end(),
+ [&suggestion_id](const std::unique_ptr<NTPSnippet>& snippet) {
+ return snippet->id() == suggestion_id;
+ });
if (it == snippets_.end())
- return false;
+ return;
(*it)->set_discarded(true);
@@ -316,12 +324,10 @@ bool NTPSnippetsService::DiscardSnippet(const std::string& snippet_id) {
discarded_snippets_.push_back(std::move(*it));
snippets_.erase(it);
- FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_,
- NTPSnippetsServiceLoaded());
- return true;
+ NotifyNewSuggestions();
}
-void NTPSnippetsService::ClearDiscardedSnippets() {
+void NTPSnippetsService::ClearDiscardedSuggestionsForDebugging() {
if (!initialized())
return;
@@ -332,6 +338,16 @@ void NTPSnippetsService::ClearDiscardedSnippets() {
discarded_snippets_.clear();
}
+void NTPSnippetsService::SetObserver(Observer* observer) {
+ observer_ = observer;
+}
+
+ContentSuggestionsCategoryStatus NTPSnippetsService::GetCategoryStatus(
+ ContentSuggestionsCategory category) {
+ DCHECK_EQ(ContentSuggestionsCategory::ARTICLES, category);
+ return category_status_;
+}
+
void NTPSnippetsService::AddObserver(NTPSnippetsServiceObserver* observer) {
observers_.AddObserver(observer);
}
@@ -390,7 +406,7 @@ void NTPSnippetsService::OnDatabaseLoaded(NTPSnippet::PtrVector snippets) {
}
void NTPSnippetsService::OnDatabaseError() {
- EnterState(State::SHUT_DOWN);
+ EnterState(State::SHUT_DOWN, ContentSuggestionsCategoryStatus::LOADING_ERROR);
}
void NTPSnippetsService::OnSuggestionsChanged(
@@ -416,8 +432,7 @@ void NTPSnippetsService::OnSuggestionsChanged(
StoreSnippetHostsToPrefs(hosts);
- FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_,
- NTPSnippetsServiceLoaded());
+ NotifyNewSuggestions();
FetchSnippetsFromHosts(hosts);
}
@@ -454,8 +469,7 @@ void NTPSnippetsService::OnFetchFinished(
discarded_snippets_.size());
}
- FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_,
- NTPSnippetsServiceLoaded());
+ NotifyNewSuggestions();
}
void NTPSnippetsService::MergeSnippets(NTPSnippet::PtrVector new_snippets) {
@@ -647,8 +661,8 @@ void NTPSnippetsService::EnterStateEnabled(bool fetch_snippets) {
}
void NTPSnippetsService::EnterStateDisabled() {
- ClearSnippets();
- ClearDiscardedSnippets();
+ ClearCachedSuggestionsForDebugging();
+ ClearDiscardedSuggestionsForDebugging();
expiry_timer_.Stop();
suggestions_service_subscription_.reset();
@@ -679,8 +693,7 @@ void NTPSnippetsService::FinishInitialization() {
snippets_status_service_->Init(base::Bind(
&NTPSnippetsService::UpdateStateForStatus, base::Unretained(this)));
- FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_,
- NTPSnippetsServiceLoaded());
+ NotifyNewSuggestions();
}
void NTPSnippetsService::UpdateStateForStatus(DisabledReason disabled_reason) {
@@ -688,9 +701,11 @@ void NTPSnippetsService::UpdateStateForStatus(DisabledReason disabled_reason) {
NTPSnippetsServiceDisabledReasonChanged(disabled_reason));
State new_state;
+ ContentSuggestionsCategoryStatus new_status;
switch (disabled_reason) {
case DisabledReason::NONE:
new_state = State::READY;
+ new_status = ContentSuggestionsCategoryStatus::AVAILABLE;
break;
case DisabledReason::HISTORY_SYNC_STATE_UNKNOWN:
@@ -700,27 +715,54 @@ void NTPSnippetsService::UpdateStateForStatus(DisabledReason disabled_reason) {
DVLOG(1) << "Sync configuration incomplete, continuing based on the "
"current state.";
new_state = state_;
+ new_status = ContentSuggestionsCategoryStatus::INITIALIZING;
break;
case DisabledReason::EXPLICITLY_DISABLED:
+ new_state = State::DISABLED;
+ new_status =
+ ContentSuggestionsCategoryStatus::CATEGORY_EXPLICITLY_DISABLED;
+ break;
+
case DisabledReason::SIGNED_OUT:
+ new_state = State::DISABLED;
+ new_status = ContentSuggestionsCategoryStatus::SIGNED_OUT;
+ break;
+
case DisabledReason::SYNC_DISABLED:
+ new_state = State::DISABLED;
+ new_status = ContentSuggestionsCategoryStatus::SYNC_DISABLED;
+ break;
+
case DisabledReason::PASSPHRASE_ENCRYPTION_ENABLED:
+ new_state = State::DISABLED;
+ new_status =
+ ContentSuggestionsCategoryStatus::PASSPHRASE_ENCRYPTION_ENABLED;
+ break;
+
case DisabledReason::HISTORY_SYNC_DISABLED:
new_state = State::DISABLED;
+ new_status = ContentSuggestionsCategoryStatus::HISTORY_SYNC_DISABLED;
break;
default:
// All cases should be handled by the above switch
NOTREACHED();
new_state = State::DISABLED;
+ new_status = ContentSuggestionsCategoryStatus::LOADING_ERROR;
break;
}
- EnterState(new_state);
+ EnterState(new_state, new_status);
}
-void NTPSnippetsService::EnterState(State state) {
+void NTPSnippetsService::EnterState(State state,
+ ContentSuggestionsCategoryStatus status) {
+ if (status != category_status_) {
+ category_status_ = status;
+ NotifyCategoryStatusChanged();
+ }
+
if (state == state_)
return;
@@ -757,4 +799,38 @@ void NTPSnippetsService::EnterState(State state) {
}
}
+void NTPSnippetsService::NotifyNewSuggestions() {
+ // TODO(pke): Remove this as soon as this becomes a pure provider.
+ FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_,
+ NTPSnippetsServiceLoaded());
+
+ if (!observer_)
+ return;
+
+ std::vector<ContentSuggestion> result;
+ for (const std::unique_ptr<NTPSnippet>& snippet : snippets_) {
+ if (!snippet->is_complete())
+ continue;
+ ContentSuggestion suggestion(
+ MakeUniqueID(ContentSuggestionsCategory::ARTICLES, snippet->id()),
+ snippet->best_source().url);
+ suggestion.set_amp_url(snippet->best_source().amp_url);
+ suggestion.set_title(snippet->title());
+ suggestion.set_snippet_text(snippet->snippet());
+ suggestion.set_publish_date(snippet->publish_date());
+ suggestion.set_publisher_name(snippet->best_source().publisher_name);
+ suggestion.set_score(snippet->score());
+ result.emplace_back(std::move(suggestion));
+ }
+ observer_->OnNewSuggestions(ContentSuggestionsCategory::ARTICLES,
+ std::move(result));
+}
+
+void NTPSnippetsService::NotifyCategoryStatusChanged() {
+ if (observer_) {
+ observer_->OnCategoryStatusChanged(ContentSuggestionsCategory::ARTICLES,
+ category_status_);
+ }
+}
+
} // namespace ntp_snippets
« no previous file with comments | « components/ntp_snippets/ntp_snippets_service.h ('k') | components/ntp_snippets/ntp_snippets_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698