1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_OFFLINE_CONTENT_PROVIDER_H_
#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_OFFLINE_CONTENT_PROVIDER_H_
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/containers/circular_deque.h"
#include "base/memory/raw_ptr.h"
#include "components/download/public/common/all_download_event_notifier.h"
#include "components/download/public/common/download_item.h"
#include "components/download/public/common/simple_download_manager_coordinator.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/offline_items_collection/core/offline_content_aggregator.h"
#include "components/offline_items_collection/core/offline_content_provider.h"
#include "components/offline_items_collection/core/offline_item.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/download/android/open_download_dialog_bridge_delegate.h"
#endif
// TODO(xingliu): Remove using in the header files.
using DownloadItem = download::DownloadItem;
using SimpleDownloadManagerCoordinator =
download::SimpleDownloadManagerCoordinator;
using ContentId = offline_items_collection::ContentId;
using OfflineItem = offline_items_collection::OfflineItem;
using OfflineContentProvider = offline_items_collection::OfflineContentProvider;
using OfflineContentAggregator =
offline_items_collection::OfflineContentAggregator;
using UpdateDelta = offline_items_collection::UpdateDelta;
using OpenParams = offline_items_collection::OpenParams;
class Profile;
class SkBitmap;
// This class handles the task of observing the downloads associated with a
// SimpleDownloadManagerCoordinator and notifies UI about updates about various
// downloads. This is a per-profile class which works with both reduced mode and
// full browser mode. It also provides internal buffering of the download
// actions if the required backend is not ready.
class DownloadOfflineContentProvider
: public KeyedService,
public OfflineContentProvider,
public DownloadItem::Observer,
public SimpleDownloadManagerCoordinator::Observer {
public:
explicit DownloadOfflineContentProvider(OfflineContentAggregator* aggregator,
const std::string& name_space);
DownloadOfflineContentProvider(const DownloadOfflineContentProvider&) =
delete;
DownloadOfflineContentProvider& operator=(
const DownloadOfflineContentProvider&) = delete;
~DownloadOfflineContentProvider() override;
// Should be called when a DownloadManager is available.
void SetSimpleDownloadManagerCoordinator(
SimpleDownloadManagerCoordinator* manager);
// OfflineContentProvider implmentation.
// Some of these methods can be run in reduced mode while others require the
// full browser process to be started as mentioned below.
// Methods that require full browser process.
void OpenItem(const OpenParams& open_params, const ContentId& id) override;
void RemoveItem(const ContentId& id) override;
void GetItemById(
const ContentId& id,
OfflineContentProvider::SingleItemCallback callback) override;
void GetAllItems(
OfflineContentProvider::MultipleItemCallback callback) override;
void GetVisualsForItem(
const ContentId& id,
GetVisualsOptions options,
OfflineContentProvider::VisualsCallback callback) override;
void GetShareInfoForItem(const ContentId& id,
ShareCallback callback) override;
void RenameItem(const ContentId& id,
const std::string& name,
RenameCallback callback) override;
// Methods that can be run in reduced mode.
void CancelDownload(const ContentId& id) override;
void PauseDownload(const ContentId& id) override;
void ResumeDownload(const ContentId& id) override;
void ValidateDangerousDownload(const ContentId& id) override;
// Entry point for associating this class with a download item. Must be called
// for all new and in-progress downloads, after which this class will start
// observing the given download.
void OnDownloadStarted(DownloadItem* download_item);
// DownloadItem::Observer overrides
void OnDownloadUpdated(DownloadItem* item) override;
void OnDownloadRemoved(DownloadItem* item) override;
void OnProfileCreated(Profile* profile);
private:
enum class State {
// Download system is not yet initialized.
UNINITIALIZED,
// Only active downloads have been loaded.
ACTIVE_DOWNLOADS_ONLY,
// All downloads including ones from history have been loaded.
HISTORY_LOADED,
};
// SimpleDownloadManagerCoordinator::Observer overrides
void OnDownloadsInitialized(bool active_downloads_only) override;
void OnManagerGoingDown(SimpleDownloadManagerCoordinator* manager) override;
void GetAllDownloads(
std::vector<raw_ptr<DownloadItem, VectorExperimental>>* all_items);
DownloadItem* GetDownload(const std::string& download_guid);
void OnThumbnailRetrieved(const ContentId& id,
VisualsCallback callback,
const SkBitmap& bitmap);
void AddCompletedDownload(DownloadItem* item);
void AddCompletedDownloadDone(const std::string& download_guid,
int64_t system_download_id);
void OnRenameDownloadCallbackDone(RenameCallback callback,
DownloadItem* item,
DownloadItem::DownloadRenameResult result);
void UpdateObservers(const OfflineItem& item,
const std::optional<UpdateDelta>& update_delta);
void CheckForExternallyRemovedDownloads();
// Ensure that download core service is started.
void EnsureDownloadCoreServiceStarted();
// Helper method to run callbacks with the latest download information.
void RunGetAllItemsCallback(
OfflineContentProvider::MultipleItemCallback callback);
void RunGetItemByIdCallback(
const ContentId& id,
OfflineContentProvider::SingleItemCallback callback);
raw_ptr<OfflineContentAggregator> aggregator_;
std::string name_space_;
raw_ptr<SimpleDownloadManagerCoordinator> manager_;
std::unique_ptr<download::AllDownloadEventNotifier::Observer>
all_download_observer_;
bool checked_for_externally_removed_downloads_;
State state_;
base::circular_deque<base::OnceClosure> pending_actions_for_reduced_mode_;
base::circular_deque<base::OnceClosure> pending_actions_for_full_browser_;
raw_ptr<Profile> profile_;
#if BUILDFLAG(IS_ANDROID)
OpenDownloadDialogBridgeDelegate open_download_dialog_delegate_;
#endif
base::WeakPtrFactory<DownloadOfflineContentProvider> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_OFFLINE_CONTENT_PROVIDER_H_
|