Chromium Code Reviews| 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; |
|
Marc Treib
2016/07/13 08:49:43
The Win compiler doesn't really need the default c
Philipp Keck
2016/07/13 09:52:10
I will include this in the next CL.
|
| 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 |