#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
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;
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;
void SetSimpleDownloadManagerCoordinator(
SimpleDownloadManagerCoordinator* manager);
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;
void CancelDownload(const ContentId& id) override;
void PauseDownload(const ContentId& id) override;
void ResumeDownload(const ContentId& id) override;
void ValidateDangerousDownload(const ContentId& id) override;
void OnDownloadStarted(DownloadItem* download_item);
void OnDownloadUpdated(DownloadItem* item) override;
void OnDownloadRemoved(DownloadItem* item) override;
void OnProfileCreated(Profile* profile);
private:
enum class State {
UNINITIALIZED,
ACTIVE_DOWNLOADS_ONLY,
HISTORY_LOADED,
};
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();
void EnsureDownloadCoreServiceStarted();
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