// Copyright 2021 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_ASH_CROSAPI_DOWNLOAD_CONTROLLER_ASH_H_
#define CHROME_BROWSER_ASH_CROSAPI_DOWNLOAD_CONTROLLER_ASH_H_
#include <string>
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chromeos/crosapi/mojom/download_controller.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace crosapi {
// The ash-chrome implementation of the DownloadController crosapi interface.
// This is where ash-chrome receives information on download events from lacros.
// This class must only be used from the main thread.
class DownloadControllerAsh : public mojom::DownloadController {
public:
// Allows ash classes to observe download events.
class DownloadControllerObserver : public base::CheckedObserver {
public:
virtual void OnLacrosDownloadCreated(const mojom::DownloadItem&) {}
virtual void OnLacrosDownloadUpdated(const mojom::DownloadItem&) {}
virtual void OnLacrosDownloadDestroyed(const mojom::DownloadItem&) {}
};
DownloadControllerAsh();
DownloadControllerAsh(const DownloadControllerAsh&) = delete;
DownloadControllerAsh& operator=(const DownloadControllerAsh&) = delete;
~DownloadControllerAsh() override;
// Bind this receiver for `mojom::DownloadController`. This is used by
// crosapi.
void BindReceiver(mojo::PendingReceiver<mojom::DownloadController> receiver);
// mojom::DownloadController:
void BindClient(
mojo::PendingRemote<mojom::DownloadControllerClient> client) override;
void OnDownloadCreated(mojom::DownloadItemPtr download) override;
void OnDownloadUpdated(mojom::DownloadItemPtr download) override;
void OnDownloadDestroyed(mojom::DownloadItemPtr download) override;
// Required for the below `base::ObserverList`:
void AddObserver(DownloadControllerObserver* observer);
void RemoveObserver(DownloadControllerObserver* observer);
// Asynchronously returns all downloads from each Lacros client via the
// specified `callback`, no matter the type or state. Downloads are sorted
// chronologically by start time.
void GetAllDownloads(
mojom::DownloadControllerClient::GetAllDownloadsCallback callback);
// Pauses the download associated with the specified `download_guid`. This
// method will ultimately invoke `download::DownloadItem::Pause()`.
void Pause(const std::string& download_guid);
// Resumes the download associated with the specified `download_guid`. If
// `user_resume` is set to `true`, it signifies that this invocation was
// triggered by an explicit user action. This method will ultimately invoke
// `download::DownloadItem::Resume()`.
void Resume(const std::string& download_guid, bool user_resume);
// Cancels the download associated with the specified `download_guid`. If
// `user_cancel` is set to `true`, it signifies that this invocation was
// triggered by an explicit user action. This method will ultimately invoke
// `download::DownloadItem::Cancel()`.
void Cancel(const std::string& download_guid, bool user_cancel);
// Marks the download associated with the specified `download_guid` to be
// `open_when_complete`. This method will ultimately invoke
// `download::DownloadItem::SetOpenWhenComplete()`.
void SetOpenWhenComplete(const std::string& download_guid,
bool open_when_complete);
private:
mojo::ReceiverSet<mojom::DownloadController> receivers_;
mojo::RemoteSet<mojom::DownloadControllerClient> clients_;
base::ObserverList<DownloadControllerObserver> observers_;
};
} // namespace crosapi
#endif // CHROME_BROWSER_ASH_CROSAPI_DOWNLOAD_CONTROLLER_ASH_H_