// Copyright 2023 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_UI_ASH_DOWNLOAD_STATUS_DISPLAY_MANAGER_H_
#define CHROME_BROWSER_UI_ASH_DOWNLOAD_STATUS_DISPLAY_MANAGER_H_
#include <memory>
#include <string>
#include <variant>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_observer.h"
namespace crosapi {
class DownloadStatusUpdaterAsh;
namespace mojom {
class DownloadStatus;
} // namespace mojom
} // namespace crosapi
namespace ash::download_status {
enum class CommandType;
class DisplayClient;
struct DisplayMetadata;
// Acts as an intermediary between Lacros download updates and Ash displayed
// download updates by:
// 1. Translating the Lacros download update metadata into display metadata.
// 2. Notifying clients of the latest display metadata.
// NOTE: This class is created only when the downloads integration V2 feature
// is enabled.
class DisplayManager : public ProfileObserver {
public:
DisplayManager(Profile* profile,
crosapi::DownloadStatusUpdaterAsh* download_status_updater);
DisplayManager(const DisplayManager&) = delete;
DisplayManager& operator=(const DisplayManager&) = delete;
~DisplayManager() override;
// Updates the displayed download specified by `download_status`.
void Update(const crosapi::mojom::DownloadStatus& download_status);
private:
// ProfileObserver:
void OnProfileWillBeDestroyed(Profile* profile) override;
// Calculates the metadata to display the download update specified by
// `download_status`. This function should be called only when the specified
// download can be displayed.
DisplayMetadata CalculateDisplayMetadata(
const crosapi::mojom::DownloadStatus& download_status);
// Performs `command` on the download using the specific `param`.
void PerformCommand(
CommandType command,
const std::variant</*guid=*/std::string, base::FilePath>& param);
// Removes the displayed download specified by `guid` from all clients. No op
// if the specified download is not displayed.
void Remove(const std::string& guid);
// Reset when `OnProfileWillBeDestroyed()` is called to prevent the dangling
// pointer issue.
raw_ptr<Profile> profile_ = nullptr;
// Used to handle download actions, including pausing, resuming, and canceling
// downloads. NOTE: `download_status_updater_` owns this instance.
const raw_ptr<crosapi::DownloadStatusUpdaterAsh> download_status_updater_;
// Responsible for displaying download updates.
// All clients are ready when `DisplayManager` is created to ensure
// consistency in the received display metadata among clients.
std::vector<std::unique_ptr<DisplayClient>> clients_;
base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this};
base::WeakPtrFactory<DisplayManager> weak_ptr_factory_{this};
};
} // namespace ash::download_status
#endif // CHROME_BROWSER_UI_ASH_DOWNLOAD_STATUS_DISPLAY_MANAGER_H_