Index: components/ntp_snippets/downloads/download_suggestions_provider.h |
diff --git a/components/ntp_snippets/downloads/download_suggestions_provider.h b/components/ntp_snippets/downloads/download_suggestions_provider.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4292db7dee10e5a6349dc4bf84c7e47df8933f76 |
--- /dev/null |
+++ b/components/ntp_snippets/downloads/download_suggestions_provider.h |
@@ -0,0 +1,159 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef COMPONENTS_NTP_SNIPPETS_DOWNLOADS_DOWNLOAD_SUGGESTIONS_PROVIDER_H_ |
+#define COMPONENTS_NTP_SNIPPETS_DOWNLOADS_DOWNLOAD_SUGGESTIONS_PROVIDER_H_ |
+ |
+#include <set> |
+#include <string> |
+#include <vector> |
+ |
+#include "base/callback_forward.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/time/time.h" |
+#include "chrome/browser/download/all_download_item_notifier.h" |
+#include "components/ntp_snippets/category.h" |
+#include "components/ntp_snippets/category_factory.h" |
+#include "components/ntp_snippets/category_status.h" |
+#include "components/ntp_snippets/content_suggestion.h" |
+#include "components/ntp_snippets/content_suggestions_provider.h" |
+#include "components/ntp_snippets/offline_pages/offline_page_proxy.h" |
+ |
+class PrefRegistrySimple; |
+class PrefService; |
+ |
+namespace gfx { |
+class Image; |
+} |
+ |
+namespace ntp_snippets { |
+ |
+// Provides download content suggestions from the offline pages model (obtaining |
+// the data through OfflinePageProxy) and the download manager (obtaining the |
+// data through AllDownloadItemNotifier). Offline pages related downloads are |
+// referred to as offline page downloads, while other downloads (e.g. images, |
+// music, books) are referred to as asset downloads. |
+class DownloadSuggestionsProvider : public ContentSuggestionsProvider, |
+ public OfflinePageProxy::Observer, |
+ public AllDownloadItemNotifier::Observer { |
+ public: |
+ DownloadSuggestionsProvider( |
+ ContentSuggestionsProvider::Observer* observer, |
+ CategoryFactory* category_factory, |
+ const scoped_refptr<OfflinePageProxy>& offline_page_proxy, |
+ content::DownloadManager* download_manager, |
+ PrefService* pref_service, |
+ bool download_manager_ui_enabled); |
+ ~DownloadSuggestionsProvider() override; |
+ |
+ // ContentSuggestionsProvider implementation. |
+ CategoryStatus GetCategoryStatus(Category category) override; |
+ CategoryInfo GetCategoryInfo(Category category) override; |
+ void DismissSuggestion(const std::string& suggestion_id) override; |
+ void FetchSuggestionImage(const std::string& suggestion_id, |
+ const ImageFetchedCallback& callback) override; |
+ void ClearHistory( |
+ base::Time begin, |
+ base::Time end, |
+ const base::Callback<bool(const GURL& url)>& filter) override; |
+ void ClearCachedSuggestions(Category category) override; |
+ void GetDismissedSuggestionsForDebugging( |
+ Category category, |
+ const DismissedSuggestionsCallback& callback) override; |
+ void ClearDismissedSuggestionsForDebugging(Category category) override; |
+ |
+ static void RegisterProfilePrefs(PrefRegistrySimple* registry); |
+ |
+ private: |
+ // OfflinePageProxy::Observer implementation. |
+ void OfflinePageModelChanged( |
+ const std::vector<offline_pages::OfflinePageItem>& offline_pages) |
+ override; |
+ void OfflinePageDeleted(int64_t offline_id, |
+ const offline_pages::ClientId& client_id) override; |
+ |
+ // AllDownloadItemNotifier::Observer implementation. |
+ void OnDownloadCreated(content::DownloadManager* manager, |
+ content::DownloadItem* item) override; |
+ void OnDownloadUpdated(content::DownloadManager* manager, |
+ content::DownloadItem* item) override; |
+ void OnDownloadOpened(content::DownloadManager* manager, |
+ content::DownloadItem* item) override; |
+ void OnDownloadRemoved(content::DownloadManager* manager, |
+ content::DownloadItem* item) override; |
+ |
+ // Updates the |category_status_| of the |provided_category_| and notifies the |
+ // |observer_|, if necessary. |
+ void NotifyStatusChanged(CategoryStatus new_status); |
+ |
+ // Manually requests all offline pages and after asynchronously obtaining the |
+ // result caches some most recent ones and updates the suggestions through |
+ // |SubmitContentSuggestions|. |
+ void FetchOfflinePagesDownloadsAndSubmitSuggestions(); |
+ |
+ // Manually syncronously retrieves all asset downloads and caches them. |
+ void FetchAssetsDownloads(); |
+ |
+ // Manually downloads both offline page and asset downloads, caches them and |
+ // updates the suggestions through |SubmitContentSuggestions|. |
+ void FetchAllDownloadsAndSubmitSuggestions(); |
+ |
+ // Takes |kMaxSuggestionsCount| cached suggestions and notifies the service |
+ // about them. |
+ void SubmitContentSuggestions(); |
+ |
+ // Converts an OfflinePageItem to a ContentSuggestion for the |
+ // |provided_category_|. |
+ ContentSuggestion ConvertOfflinePage( |
+ const offline_pages::OfflinePageItem& offline_page) const; |
+ |
+ // Converts DownloadItem to a ContentSuggestion for the |provided_category_|. |
+ ContentSuggestion ConvertDownloadItem( |
+ const content::DownloadItem* download_item) const; |
+ |
+ // Fires the |OnSuggestionInvalidated| event for the suggestion corresponding |
+ // to the given |id_in_category| and clears it from the dismissed IDs list, if |
+ // necessary. |
+ void InvalidateSuggestion(const std::string& id_in_category); |
+ |
+ // Reads dismissed IDs related to asset downloads from Prefs. |
+ std::set<std::string> ReadAssetDismissedIDsFromPrefs() const; |
+ |
+ // Writes |dismissed_ids| into Prefs for asset downloads. |
+ void StoreAssetDismissedIDsToPrefs( |
+ const std::set<std::string>& dismissed_ids); |
+ |
+ // Reads dismissed IDs related to offline page downloads from Prefs. |
+ std::set<std::string> ReadOfflinePageDismissedIDsFromPrefs() const; |
+ |
+ // Writes |dismissed_ids| into Prefs for offline page downloads. |
+ void StoreOfflinePageDismissedIDsToPrefs( |
+ const std::set<std::string>& dismissed_ids); |
+ |
+ CategoryStatus category_status_; |
+ const Category provided_category_; |
+ scoped_refptr<OfflinePageProxy> offline_page_proxy_; |
+ AllDownloadItemNotifier download_manager_notifier_; |
+ |
+ PrefService* pref_service_; |
+ |
+ // Cached offline page downloads. Any of them could be shown. Order is |
+ // undefined. |
+ std::vector<offline_pages::OfflinePageItem> cached_offline_page_downloads_; |
+ // Cached asset downloads. Any of them could be shown. Order is undefined. |
+ std::vector<content::DownloadItem*> cached_asset_downloads_; |
+ |
+ // Whether the Download Manager UI is enabled, in which case the More button |
+ // for the Downloads section can redirect there. |
+ bool download_manager_ui_enabled_; |
+ |
+ base::WeakPtrFactory<DownloadSuggestionsProvider> weak_ptr_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DownloadSuggestionsProvider); |
+}; |
+ |
+} // namespace ntp_snippets |
+ |
+#endif // COMPONENTS_NTP_SNIPPETS_RECENT_TABS_RECENT_TAB_SUGGESTIONS_PROVIDER_H_ |