Introduce SimpleDownloadManager to support reduced mode


Bug: 942770
Change-Id: I780f7a863c519cd9a2fc885c29df8fc20786b917
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1526686
Commit-Queue: Min Qin <qinmin@chromium.org>
Reviewed-by: Shakti Sahu <shaktisahu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#642077}
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn
index 6ca95c9..acd3b175 100644
--- a/components/download/internal/common/BUILD.gn
+++ b/components/download/internal/common/BUILD.gn
@@ -53,6 +53,7 @@
     "resource_downloader.h",
     "save_package_download_job.cc",
     "save_package_download_job.h",
+    "simple_download_manager_coordinator.cc",
     "stream_handle_input_stream.cc",
     "url_download_handler_factory.cc",
     "url_download_request_handle.cc",
diff --git a/components/download/internal/common/simple_download_manager_coordinator.cc b/components/download/internal/common/simple_download_manager_coordinator.cc
new file mode 100644
index 0000000..826ac49
--- /dev/null
+++ b/components/download/internal/common/simple_download_manager_coordinator.cc
@@ -0,0 +1,46 @@
+// Copyright 2019 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.
+
+#include "components/download/public/common/simple_download_manager_coordinator.h"
+
+#include <utility>
+
+#include "components/download/public/common/download_item.h"
+#include "components/download/public/common/simple_download_manager.h"
+
+namespace download {
+
+SimpleDownloadManagerCoordinator::SimpleDownloadManagerCoordinator() = default;
+
+SimpleDownloadManagerCoordinator::~SimpleDownloadManagerCoordinator() = default;
+
+void SimpleDownloadManagerCoordinator::SetSimpleDownloadManager(
+    SimpleDownloadManager* simple_download_manager) {
+  simple_download_manager_ = simple_download_manager;
+}
+
+void SimpleDownloadManagerCoordinator::DownloadUrl(
+    std::unique_ptr<download::DownloadUrlParameters> parameters) {
+  if (simple_download_manager_)
+    simple_download_manager_->DownloadUrl(std::move(parameters));
+}
+
+DownloadItem* SimpleDownloadManagerCoordinator::GetDownloadByGuid(
+    const std::string& guid) {
+  if (simple_download_manager_)
+    return simple_download_manager_->GetDownloadByGuid(guid);
+  return nullptr;
+}
+
+bool SimpleDownloadManagerCoordinator::AreDownloadsInitialized(
+    bool active_downloads_only) {
+  return simple_download_manager_->AreDownloadsInitialized(
+      active_downloads_only);
+}
+
+std::vector<DownloadItem*> SimpleDownloadManagerCoordinator::GetAllDownloads() {
+  return simple_download_manager_->GetAllDownloads();
+}
+
+}  // namespace download
diff --git a/components/download/public/common/BUILD.gn b/components/download/public/common/BUILD.gn
index 26a6dd0..30d3d52 100644
--- a/components/download/public/common/BUILD.gn
+++ b/components/download/public/common/BUILD.gn
@@ -59,6 +59,8 @@
     "parallel_download_configs.h",
     "rate_estimator.h",
     "resume_mode.h",
+    "simple_download_manager.h",
+    "simple_download_manager_coordinator.h",
     "stream_handle_input_stream.h",
     "url_download_handler_factory.h",
     "url_download_request_handle.h",
diff --git a/components/download/public/common/simple_download_manager.h b/components/download/public/common/simple_download_manager.h
new file mode 100644
index 0000000..85e8acf
--- /dev/null
+++ b/components/download/public/common/simple_download_manager.h
@@ -0,0 +1,58 @@
+// Copyright 2019 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_DOWNLOAD_PUBLIC_COMMON_SIMPLE_DOWNLOAD_MANAGER_H_
+#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_SIMPLE_DOWNLOAD_MANAGER_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "components/download/public/common/download_export.h"
+#include "components/download/public/common/download_url_parameters.h"
+
+namespace download {
+
+class DownloadItem;
+
+// Download manager that provides simple functionalities for callers to carry
+// out a download task.
+class COMPONENTS_DOWNLOAD_EXPORT SimpleDownloadManager {
+ public:
+  class Observer {
+   public:
+    Observer() = default;
+    virtual ~Observer() = default;
+
+    virtual void OnDownloadsInitialized(bool active_downloads_only) {}
+    virtual void OnManagerGoingDown() {}
+    virtual void OnDownloadCreated(DownloadItem* item) {}
+    virtual void OnDownloadUpdated(DownloadItem* item) {}
+    virtual void OnDownloadOpened(DownloadItem* item) {}
+    virtual void OnDownloadRemoved(DownloadItem* item) {}
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(Observer);
+  };
+
+  // See DownloadUrlParameters for details about controlling the download.
+  virtual void DownloadUrl(
+      std::unique_ptr<download::DownloadUrlParameters> parameters) = 0;
+
+  // Whether downloads are initialized. If |active_downloads_only| is true, this
+  // call only checks for all the active downloads. Otherwise, it will check all
+  // downloads.
+  virtual bool AreDownloadsInitialized(bool active_downloads_only) = 0;
+
+  // Gets all downloads.
+  virtual std::vector<DownloadItem*> GetAllDownloads() = 0;
+
+  // Get the download item for |guid|.
+  virtual download::DownloadItem* GetDownloadByGuid(
+      const std::string& guid) = 0;
+};
+
+}  // namespace download
+
+#endif  // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_SIMPLE_DOWNLOAD_MANAGER_H_
diff --git a/components/download/public/common/simple_download_manager_coordinator.h b/components/download/public/common/simple_download_manager_coordinator.h
new file mode 100644
index 0000000..85756fe4
--- /dev/null
+++ b/components/download/public/common/simple_download_manager_coordinator.h
@@ -0,0 +1,54 @@
+// Copyright 2019 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_DOWNLOAD_PUBLIC_COMMON_SIMPLE_DOWNLOAD_MANAGER_COORDINATOR_H_
+#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_SIMPLE_DOWNLOAD_MANAGER_COORDINATOR_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "components/download/public/common/download_export.h"
+#include "components/download/public/common/download_url_parameters.h"
+
+namespace download {
+
+class DownloadItem;
+class SimpleDownloadManager;
+
+// This object allows swapping between different SimppleDownloadManager
+// instances so that callers don't need to know about the swap.
+class COMPONENTS_DOWNLOAD_EXPORT SimpleDownloadManagerCoordinator {
+ public:
+  SimpleDownloadManagerCoordinator();
+  ~SimpleDownloadManagerCoordinator();
+
+  void SetSimpleDownloadManager(SimpleDownloadManager* simple_download_manager);
+
+  // See download::DownloadUrlParameters for details about controlling the
+  // download.
+  void DownloadUrl(std::unique_ptr<DownloadUrlParameters> parameters);
+
+  // Whether downloads are initialized. If |active_downloads_only| is true, this
+  // call only checks for all the active downloads. Otherwise, it will check all
+  // downloads.
+  bool AreDownloadsInitialized(bool active_downloads_only);
+
+  // Gets all the downloads. Caller needs to call AreDownloadsInitialized() to
+  // check if all downloads are initialized. If only active downloads are
+  // initialized, this method will only return all active downloads.
+  std::vector<DownloadItem*> GetAllDownloads();
+
+  // Get the download item for |guid|.
+  download::DownloadItem* GetDownloadByGuid(const std::string& guid);
+
+ private:
+  SimpleDownloadManager* simple_download_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(SimpleDownloadManagerCoordinator);
+};
+
+}  // namespace download
+
+#endif  // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_SIMPLE_DOWNLOAD_MANAGER_COORDINATOR_H_