Index: components/offline_pages/core/downloads/download_ui_adapter.h |
diff --git a/components/offline_pages/core/downloads/download_ui_adapter.h b/components/offline_pages/core/downloads/download_ui_adapter.h |
index 7ab6ace92d198f4a6413b215be6d686a0b309bc3..abf413a139e814ef4480f9766b8916a31590c9ec 100644 |
--- a/components/offline_pages/core/downloads/download_ui_adapter.h |
+++ b/components/offline_pages/core/downloads/download_ui_adapter.h |
@@ -12,6 +12,7 @@ |
#include "base/observer_list.h" |
#include "base/supports_user_data.h" |
+#include "components/offline_pages/core/background/request_coordinator.h" |
#include "components/offline_pages/core/downloads/download_ui_item.h" |
#include "components/offline_pages/core/offline_page_model.h" |
#include "components/offline_pages/core/offline_page_types.h" |
@@ -22,11 +23,33 @@ namespace offline_pages { |
// share UI with Downloads). |
// An instance of this class is owned by OfflinePageModel and is shared between |
// UI components if needed. It manages the cache of DownloadUIItems, so after |
-// initial load the UI components can synchronously pull the whoel list or any |
+// initial load the UI components can synchronously pull the whole list or any |
// item by its guid. |
+// The items are exposed to UI layer (consumer of this class) as an observable |
+// collection of DownloadUIItems. The consumer is supposed to implement |
+// the DownloadUIAdapter::Observer interface. The creator of the adapter |
+// also passes in the Delegate that determines which items in the underlying |
+// OfflinePage backend are to be included (visible) in the collection. |
class DownloadUIAdapter : public OfflinePageModel::Observer, |
+ public RequestCoordinator::Observer, |
public base::SupportsUserData::Data { |
public: |
+ // Delegate, used to customize behavior of this Adapter. |
+ class Delegate { |
+ public: |
+ virtual ~Delegate() = default; |
+ // Returns true if the page or request with the specified Client Id should |
+ // be visible in the collection of items exposed by this Adapter. This also |
+ // indicates if Observers will be notified about changes for the given page. |
+ virtual bool IsVisibleInUI(const ClientId& client_id) = 0; |
+ // Sometimes the item should be in the collection but not visible in the UI, |
+ // temporarily. This is a relatively special case, for example for Last_N |
+ // snapshots that are only valid while their tab is alive. When the status |
+ // of temporary visibility changes, the Delegate is supposed to call |
+ // DownloadUIAdapter::TemporarilyHiddenStatusChanged(). |
+ virtual bool IsTemporarilyHiddenInUI(const ClientId& client_id) = 0; |
+ }; |
+ |
// Observer, normally implemented by UI or a Bridge. |
class Observer { |
public: |
@@ -50,19 +73,14 @@ class DownloadUIAdapter : public OfflinePageModel::Observer, |
virtual ~Observer() = default; |
}; |
- explicit DownloadUIAdapter(OfflinePageModel* model); |
+ DownloadUIAdapter(OfflinePageModel* model, |
+ RequestCoordinator* coordinator, |
+ std::unique_ptr<Delegate> delegate); |
~DownloadUIAdapter() override; |
- static DownloadUIAdapter* FromOfflinePageModel( |
- OfflinePageModel* offline_page_model); |
- |
- // Checks a client ID for proper namespace and ID format to be shown in the |
- // Downloads Home UI. |
- bool IsVisibleInUI(const ClientId& page); |
- |
// This adapter is potentially shared by UI elements, each of which adds |
// itself as an observer. |
- // When the last observer si removed, cached list of items is destroyed and |
+ // When the last observer is removed, cached list of items is destroyed and |
// next time the initial loading will take longer. |
void AddObserver(Observer* observer); |
void RemoveObserver(Observer* observer); |
@@ -85,17 +103,44 @@ class DownloadUIAdapter : public OfflinePageModel::Observer, |
void OfflinePageDeleted(int64_t offline_id, |
const ClientId& client_id) override; |
+ // RequestCoordinator::Observer |
+ void OnAdded(const SavePageRequest& request) override; |
+ void OnCompleted(const SavePageRequest& request, |
+ RequestNotifier::BackgroundSavePageResult status) override; |
+ void OnChanged(const SavePageRequest& request) override; |
+ |
+ // For the DownloadUIAdapter::Delegate, to report the temporary hidden status |
+ // change. |
+ void TemporaryHiddenStatusChanged(const ClientId& client_id); |
+ |
private: |
- enum class State { NOT_LOADED, LOADING, LOADED }; |
+ enum class State { NOT_LOADED, LOADING_PAGES, LOADING_REQUESTS, LOADED }; |
struct ItemInfo { |
explicit ItemInfo(const OfflinePageItem& page); |
+ explicit ItemInfo(const SavePageRequest& request); |
~ItemInfo(); |
std::unique_ptr<DownloadUIItem> ui_item; |
+ |
// Additional cached data, not exposed to UI through DownloadUIItem. |
+ // Indicates if this item wraps the completed page or in-progress request. |
+ bool is_request; |
+ |
+ // These are shared between pages and requests. |
int64_t offline_id; |
+ // ClientId is here to support the Delegate that can toggle temporary |
+ // visibility of the items in the collection. |
+ ClientId client_id; |
+ |
+ // This item is present in the collection but temporarily hidden from UI. |
+ // This is useful when unrelated reasons cause the UI item to be excluded |
+ // (filtered out) from UI. When item becomes temporarily hidden the adapter |
+ // issues ItemDeleted notification to observers, and ItemAdded when it |
+ // becomes visible again. |
+ bool temporarily_hidden; |
+ |
private: |
DISALLOW_COPY_AND_ASSIGN(ItemInfo); |
}; |
@@ -107,12 +152,23 @@ class DownloadUIAdapter : public OfflinePageModel::Observer, |
// Task callbacks. |
void OnOfflinePagesLoaded(const MultipleOfflinePageItemResult& pages); |
+ void OnRequestsLoaded(std::vector<std::unique_ptr<SavePageRequest>> requests); |
+ |
void NotifyItemsLoaded(Observer* observer); |
void OnDeletePagesDone(DeletePageResult result); |
+ void AddItemHelper(std::unique_ptr<ItemInfo> item_info); |
+ void DeleteItemHelper(const std::string& guid); |
+ |
// Always valid, this class is a member of the model. |
OfflinePageModel* model_; |
+ // Always valid, a service. |
+ RequestCoordinator* request_coordinator_; |
+ |
+ // A delegate, supplied at construction. |
+ std::unique_ptr<Delegate> delegate_; |
+ |
State state_; |
// The cache of UI items. The key is DownloadUIItem.guid. |