| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/ntp_snippets/ntp_snippets_service.h" | 5 #include "components/ntp_snippets/ntp_snippets_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 [](const std::unique_ptr<NTPSnippet>& snippet) { return !snippet; }), | 180 [](const std::unique_ptr<NTPSnippet>& snippet) { return !snippet; }), |
| 181 snippets->end()); | 181 snippets->end()); |
| 182 } | 182 } |
| 183 | 183 |
| 184 } // namespace | 184 } // namespace |
| 185 | 185 |
| 186 NTPSnippetsService::NTPSnippetsService( | 186 NTPSnippetsService::NTPSnippetsService( |
| 187 bool enabled, | 187 bool enabled, |
| 188 PrefService* pref_service, | 188 PrefService* pref_service, |
| 189 SuggestionsService* suggestions_service, | 189 SuggestionsService* suggestions_service, |
| 190 ContentSuggestionsCategoryFactory* category_factory, |
| 190 const std::string& application_language_code, | 191 const std::string& application_language_code, |
| 191 NTPSnippetsScheduler* scheduler, | 192 NTPSnippetsScheduler* scheduler, |
| 192 std::unique_ptr<NTPSnippetsFetcher> snippets_fetcher, | 193 std::unique_ptr<NTPSnippetsFetcher> snippets_fetcher, |
| 193 std::unique_ptr<ImageFetcher> image_fetcher, | 194 std::unique_ptr<ImageFetcher> image_fetcher, |
| 194 std::unique_ptr<ImageDecoder> image_decoder, | 195 std::unique_ptr<ImageDecoder> image_decoder, |
| 195 std::unique_ptr<NTPSnippetsDatabase> database, | 196 std::unique_ptr<NTPSnippetsDatabase> database, |
| 196 std::unique_ptr<NTPSnippetsStatusService> status_service) | 197 std::unique_ptr<NTPSnippetsStatusService> status_service) |
| 197 : ContentSuggestionsProvider({ContentSuggestionsCategory::ARTICLES}), | 198 : ContentSuggestionsProvider(category_factory), |
| 198 state_(State::NOT_INITED), | 199 state_(State::NOT_INITED), |
| 199 category_status_(ContentSuggestionsCategoryStatus::INITIALIZING), | 200 category_status_(ContentSuggestionsCategoryStatus::INITIALIZING), |
| 200 pref_service_(pref_service), | 201 pref_service_(pref_service), |
| 201 suggestions_service_(suggestions_service), | 202 suggestions_service_(suggestions_service), |
| 202 application_language_code_(application_language_code), | 203 application_language_code_(application_language_code), |
| 203 observer_(nullptr), | 204 observer_(nullptr), |
| 204 scheduler_(scheduler), | 205 scheduler_(scheduler), |
| 205 snippets_fetcher_(std::move(snippets_fetcher)), | 206 snippets_fetcher_(std::move(snippets_fetcher)), |
| 206 image_fetcher_(std::move(image_fetcher)), | 207 image_fetcher_(std::move(image_fetcher)), |
| 207 image_decoder_(std::move(image_decoder)), | 208 image_decoder_(std::move(image_decoder)), |
| 208 database_(std::move(database)), | 209 database_(std::move(database)), |
| 209 snippets_status_service_(std::move(status_service)), | 210 snippets_status_service_(std::move(status_service)), |
| 210 fetch_after_load_(false) { | 211 fetch_after_load_(false), |
| 212 provided_category_(category_factory->FromKnownCategory( |
| 213 KnownSuggestionsCategories::ARTICLES)) { |
| 211 // In some cases, don't even bother loading the database. | 214 // In some cases, don't even bother loading the database. |
| 212 if (!enabled) { | 215 if (!enabled) { |
| 213 EnterState(State::SHUT_DOWN, | 216 EnterState(State::SHUT_DOWN, |
| 214 ContentSuggestionsCategoryStatus::CATEGORY_EXPLICITLY_DISABLED); | 217 ContentSuggestionsCategoryStatus::CATEGORY_EXPLICITLY_DISABLED); |
| 215 return; | 218 return; |
| 216 } | 219 } |
| 217 if (database_->IsErrorState()) { | 220 if (database_->IsErrorState()) { |
| 218 EnterState(State::SHUT_DOWN, | 221 EnterState(State::SHUT_DOWN, |
| 219 ContentSuggestionsCategoryStatus::LOADING_ERROR); | 222 ContentSuggestionsCategoryStatus::LOADING_ERROR); |
| 220 return; | 223 return; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 if (ready()) { | 274 if (ready()) { |
| 272 base::Time now = base::Time::Now(); | 275 base::Time now = base::Time::Now(); |
| 273 scheduler_->Schedule( | 276 scheduler_->Schedule( |
| 274 GetFetchingIntervalWifiCharging(), GetFetchingIntervalWifi(now), | 277 GetFetchingIntervalWifiCharging(), GetFetchingIntervalWifi(now), |
| 275 GetFetchingIntervalFallback(), GetRescheduleTime(now)); | 278 GetFetchingIntervalFallback(), GetRescheduleTime(now)); |
| 276 } else { | 279 } else { |
| 277 scheduler_->Unschedule(); | 280 scheduler_->Unschedule(); |
| 278 } | 281 } |
| 279 } | 282 } |
| 280 | 283 |
| 284 std::vector<ContentSuggestionsCategory> |
| 285 NTPSnippetsService::GetProvidedCategories() { |
| 286 return std::vector<ContentSuggestionsCategory>({provided_category_}); |
| 287 } |
| 288 |
| 281 void NTPSnippetsService::FetchSuggestionImage( | 289 void NTPSnippetsService::FetchSuggestionImage( |
| 282 const std::string& suggestion_id, | 290 const std::string& suggestion_id, |
| 283 const ImageFetchedCallback& callback) { | 291 const ImageFetchedCallback& callback) { |
| 284 std::string snippet_id = GetWithinCategoryIDFromUniqueID(suggestion_id); | 292 std::string snippet_id = GetWithinCategoryIDFromUniqueID(suggestion_id); |
| 285 database_->LoadImage( | 293 database_->LoadImage( |
| 286 snippet_id, | 294 snippet_id, |
| 287 base::Bind(&NTPSnippetsService::OnSnippetImageFetchedFromDatabase, | 295 base::Bind(&NTPSnippetsService::OnSnippetImageFetchedFromDatabase, |
| 288 base::Unretained(this), snippet_id, callback)); | 296 base::Unretained(this), snippet_id, callback)); |
| 289 } | 297 } |
| 290 | 298 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 database_->DeleteSnippets(dismissed_snippets_); | 352 database_->DeleteSnippets(dismissed_snippets_); |
| 345 dismissed_snippets_.clear(); | 353 dismissed_snippets_.clear(); |
| 346 } | 354 } |
| 347 | 355 |
| 348 void NTPSnippetsService::SetObserver(Observer* observer) { | 356 void NTPSnippetsService::SetObserver(Observer* observer) { |
| 349 observer_ = observer; | 357 observer_ = observer; |
| 350 } | 358 } |
| 351 | 359 |
| 352 ContentSuggestionsCategoryStatus NTPSnippetsService::GetCategoryStatus( | 360 ContentSuggestionsCategoryStatus NTPSnippetsService::GetCategoryStatus( |
| 353 ContentSuggestionsCategory category) { | 361 ContentSuggestionsCategory category) { |
| 354 DCHECK_EQ(ContentSuggestionsCategory::ARTICLES, category); | 362 DCHECK(category.IsKnownCategory(KnownSuggestionsCategories::ARTICLES)); |
| 355 return category_status_; | 363 return category_status_; |
| 356 } | 364 } |
| 357 | 365 |
| 358 void NTPSnippetsService::AddObserver(NTPSnippetsServiceObserver* observer) { | 366 void NTPSnippetsService::AddObserver(NTPSnippetsServiceObserver* observer) { |
| 359 observers_.AddObserver(observer); | 367 observers_.AddObserver(observer); |
| 360 } | 368 } |
| 361 | 369 |
| 362 void NTPSnippetsService::RemoveObserver(NTPSnippetsServiceObserver* observer) { | 370 void NTPSnippetsService::RemoveObserver(NTPSnippetsServiceObserver* observer) { |
| 363 observers_.RemoveObserver(observer); | 371 observers_.RemoveObserver(observer); |
| 364 } | 372 } |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 | 625 |
| 618 // Fetching from the DB failed; start a network fetch. | 626 // Fetching from the DB failed; start a network fetch. |
| 619 FetchSnippetImageFromNetwork(snippet_id, callback); | 627 FetchSnippetImageFromNetwork(snippet_id, callback); |
| 620 } | 628 } |
| 621 | 629 |
| 622 void NTPSnippetsService::OnSnippetImageDecoded( | 630 void NTPSnippetsService::OnSnippetImageDecoded( |
| 623 const std::string& snippet_id, | 631 const std::string& snippet_id, |
| 624 const ImageFetchedCallback& callback, | 632 const ImageFetchedCallback& callback, |
| 625 const gfx::Image& image) { | 633 const gfx::Image& image) { |
| 626 if (!image.IsEmpty()) { | 634 if (!image.IsEmpty()) { |
| 627 callback.Run(MakeUniqueID(ContentSuggestionsCategory::ARTICLES, snippet_id), | 635 callback.Run(MakeUniqueID(provided_category_, snippet_id), image); |
| 628 image); | |
| 629 return; | 636 return; |
| 630 } | 637 } |
| 631 | 638 |
| 632 // If decoding the image failed, delete the DB entry. | 639 // If decoding the image failed, delete the DB entry. |
| 633 database_->DeleteImage(snippet_id); | 640 database_->DeleteImage(snippet_id); |
| 634 | 641 |
| 635 FetchSnippetImageFromNetwork(snippet_id, callback); | 642 FetchSnippetImageFromNetwork(snippet_id, callback); |
| 636 } | 643 } |
| 637 | 644 |
| 638 void NTPSnippetsService::FetchSnippetImageFromNetwork( | 645 void NTPSnippetsService::FetchSnippetImageFromNetwork( |
| 639 const std::string& snippet_id, | 646 const std::string& snippet_id, |
| 640 const ImageFetchedCallback& callback) { | 647 const ImageFetchedCallback& callback) { |
| 641 auto it = | 648 auto it = |
| 642 std::find_if(snippets_.begin(), snippets_.end(), | 649 std::find_if(snippets_.begin(), snippets_.end(), |
| 643 [&snippet_id](const std::unique_ptr<NTPSnippet>& snippet) { | 650 [&snippet_id](const std::unique_ptr<NTPSnippet>& snippet) { |
| 644 return snippet->id() == snippet_id; | 651 return snippet->id() == snippet_id; |
| 645 }); | 652 }); |
| 646 if (it == snippets_.end()) { | 653 if (it == snippets_.end()) { |
| 647 callback.Run(MakeUniqueID(ContentSuggestionsCategory::ARTICLES, snippet_id), | 654 callback.Run(MakeUniqueID(provided_category_, snippet_id), gfx::Image()); |
| 648 gfx::Image()); | |
| 649 return; | 655 return; |
| 650 } | 656 } |
| 651 | 657 |
| 652 const NTPSnippet& snippet = *it->get(); | 658 const NTPSnippet& snippet = *it->get(); |
| 653 image_fetcher_->StartOrQueueNetworkRequest( | 659 image_fetcher_->StartOrQueueNetworkRequest( |
| 654 snippet.id(), snippet.salient_image_url(), callback); | 660 snippet.id(), snippet.salient_image_url(), callback); |
| 655 } | 661 } |
| 656 | 662 |
| 657 void NTPSnippetsService::EnterStateEnabled(bool fetch_snippets) { | 663 void NTPSnippetsService::EnterStateEnabled(bool fetch_snippets) { |
| 658 if (fetch_snippets) | 664 if (fetch_snippets) |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 NTPSnippetsServiceLoaded()); | 810 NTPSnippetsServiceLoaded()); |
| 805 | 811 |
| 806 if (!observer_) | 812 if (!observer_) |
| 807 return; | 813 return; |
| 808 | 814 |
| 809 std::vector<ContentSuggestion> result; | 815 std::vector<ContentSuggestion> result; |
| 810 for (const std::unique_ptr<NTPSnippet>& snippet : snippets_) { | 816 for (const std::unique_ptr<NTPSnippet>& snippet : snippets_) { |
| 811 if (!snippet->is_complete()) | 817 if (!snippet->is_complete()) |
| 812 continue; | 818 continue; |
| 813 ContentSuggestion suggestion( | 819 ContentSuggestion suggestion( |
| 814 MakeUniqueID(ContentSuggestionsCategory::ARTICLES, snippet->id()), | 820 MakeUniqueID(provided_category_, snippet->id()), |
| 815 snippet->best_source().url); | 821 snippet->best_source().url); |
| 816 suggestion.set_amp_url(snippet->best_source().amp_url); | 822 suggestion.set_amp_url(snippet->best_source().amp_url); |
| 817 suggestion.set_title(snippet->title()); | 823 suggestion.set_title(snippet->title()); |
| 818 suggestion.set_snippet_text(snippet->snippet()); | 824 suggestion.set_snippet_text(snippet->snippet()); |
| 819 suggestion.set_publish_date(snippet->publish_date()); | 825 suggestion.set_publish_date(snippet->publish_date()); |
| 820 suggestion.set_publisher_name(snippet->best_source().publisher_name); | 826 suggestion.set_publisher_name(snippet->best_source().publisher_name); |
| 821 suggestion.set_score(snippet->score()); | 827 suggestion.set_score(snippet->score()); |
| 822 result.emplace_back(std::move(suggestion)); | 828 result.emplace_back(std::move(suggestion)); |
| 823 } | 829 } |
| 824 observer_->OnNewSuggestions(ContentSuggestionsCategory::ARTICLES, | 830 observer_->OnNewSuggestions(provided_category_, std::move(result)); |
| 825 std::move(result)); | |
| 826 } | 831 } |
| 827 | 832 |
| 828 void NTPSnippetsService::NotifyCategoryStatusChanged() { | 833 void NTPSnippetsService::NotifyCategoryStatusChanged() { |
| 829 if (observer_) { | 834 if (observer_) { |
| 830 observer_->OnCategoryStatusChanged(ContentSuggestionsCategory::ARTICLES, | 835 observer_->OnCategoryStatusChanged(provided_category_, category_status_); |
| 831 category_status_); | |
| 832 } | 836 } |
| 833 } | 837 } |
| 834 | 838 |
| 835 } // namespace ntp_snippets | 839 } // namespace ntp_snippets |
| OLD | NEW |