| // 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 IOS_CHROME_BROWSER_READING_LIST_READING_LIST_DOWNLOAD_SERVICE_H_ |
| #define IOS_CHROME_BROWSER_READING_LIST_READING_LIST_DOWNLOAD_SERVICE_H_ |
| |
| #include "base/macros.h" |
| #include "components/keyed_service/core/keyed_service.h" |
| #include "components/reading_list/core/reading_list_model_observer.h" |
| #include "ios/chrome/browser/reading_list/url_downloader.h" |
| #include "net/base/network_change_notifier.h" |
| |
| class GURL; |
| class PrefService; |
| class ReadingListModel; |
| namespace base { |
| class FilePath; |
| } |
| |
| namespace reading_list { |
| class ReadingListDistillerPageFactory; |
| } |
| |
| // Observes the reading list and downloads offline versions of its articles. |
| // Any calls made to DownloadEntry before the model is loaded will be ignored. |
| // When the model is loaded, offline directory is automatically synced with the |
| // entries in the model. |
| class ReadingListDownloadService |
| : public KeyedService, |
| public ReadingListModelObserver, |
| public net::NetworkChangeNotifier::NetworkChangeObserver { |
| public: |
| ReadingListDownloadService( |
| ReadingListModel* reading_list_model, |
| PrefService* prefs, |
| base::FilePath chrome_profile_path, |
| net::URLRequestContextGetter* url_request_context_getter, |
| std::unique_ptr<dom_distiller::DistillerFactory> distiller_factory, |
| std::unique_ptr<reading_list::ReadingListDistillerPageFactory> |
| distiller_page_factory); |
| ~ReadingListDownloadService() override; |
| |
| // Initializes the reading list download service. |
| void Initialize(); |
| |
| // Clear the current download queue. |
| void Clear(); |
| |
| // The root folder containing all the offline files. |
| virtual base::FilePath OfflineRoot() const; |
| |
| // KeyedService implementation. |
| void Shutdown() override; |
| |
| // ReadingListModelObserver implementation |
| void ReadingListModelLoaded(const ReadingListModel* model) override; |
| void ReadingListWillRemoveEntry(const ReadingListModel* model, |
| const GURL& url) override; |
| void ReadingListDidAddEntry(const ReadingListModel* model, |
| const GURL& url, |
| reading_list::EntrySource entry_source) override; |
| void ReadingListDidMoveEntry(const ReadingListModel* model, |
| const GURL& url) override; |
| |
| private: |
| // Checks the model and determines which entries are processed and which |
| // entries need to be processed. |
| // Initiates a cleanup of |OfflineRoot()| directory removing sub_directories |
| // not corresponding to a processed ReadingListEntry. |
| // Schedules unprocessed entries for distillation. |
| void SyncWithModel(); |
| // Schedules all entries in |unprocessed_entries| for distillation. |
| void DownloadUnprocessedEntries(const std::set<GURL>& unprocessed_entries); |
| // Processes a new entry and schedules a download if needed. |
| void ProcessNewEntry(const GURL& url); |
| // Schedules a download of an offline version of the reading list entry, |
| // according to the delay of the entry. Must only be called after reading list |
| // model is loaded. |
| void ScheduleDownloadEntry(const GURL& url); |
| // Tries to save an offline version of the reading list entry if it is not yet |
| // saved. Must only be called after reading list model is loaded. |
| void DownloadEntry(const GURL& url); |
| // Removes the offline version of the reading list entry if it exists. Must |
| // only be called after reading list model is loaded. |
| void RemoveDownloadedEntry(const GURL& url); |
| // Callback for entry download. |
| void OnDownloadEnd(const GURL& url, |
| const GURL& distilled_url, |
| URLDownloader::SuccessState success, |
| const base::FilePath& distilled_path, |
| int64_t size, |
| const std::string& title); |
| |
| // Callback for entry deletion. |
| void OnDeleteEnd(const GURL& url, bool success); |
| |
| // net::NetworkChangeNotifier::NetworkChangeObserver: |
| void OnNetworkChanged( |
| net::NetworkChangeNotifier::ConnectionType type) override; |
| |
| ReadingListModel* reading_list_model_; |
| base::FilePath chrome_profile_path_; |
| std::unique_ptr<URLDownloader> url_downloader_; |
| std::vector<GURL> url_to_download_cellular_; |
| std::vector<GURL> url_to_download_wifi_; |
| bool had_connection_; |
| std::unique_ptr<reading_list::ReadingListDistillerPageFactory> |
| distiller_page_factory_; |
| std::unique_ptr<dom_distiller::DistillerFactory> distiller_factory_; |
| |
| base::WeakPtrFactory<ReadingListDownloadService> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ReadingListDownloadService); |
| }; |
| |
| #endif // IOS_CHROME_BROWSER_READING_LIST_READING_LIST_DOWNLOAD_SERVICE_H_ |