#ifndef ASH_WALLPAPER_SEA_PEN_WALLPAPER_MANAGER_H_
#define ASH_WALLPAPER_SEA_PEN_WALLPAPER_MANAGER_H_
#include <memory>
#include "ash/ash_export.h"
#include "ash/public/cpp/wallpaper/sea_pen_image.h"
#include "ash/wallpaper/wallpaper_file_manager.h"
#include "ash/webui/common/mojom/sea_pen.mojom-forward.h"
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "ui/gfx/image/image_skia.h"
class AccountId;
namespace base {
class SequencedTaskRunner;
}
namespace ash {
class ASH_EXPORT SeaPenWallpaperManager {
public:
class SessionDelegate {
public:
virtual ~SessionDelegate() = default;
virtual base::FilePath GetStorageDirectory(const AccountId& account_id) = 0;
};
SeaPenWallpaperManager();
SeaPenWallpaperManager(const SeaPenWallpaperManager&) = delete;
SeaPenWallpaperManager& operator=(const SeaPenWallpaperManager&) = delete;
~SeaPenWallpaperManager();
static SeaPenWallpaperManager* GetInstance();
using SaveSeaPenImageCallback = base::OnceCallback<void(bool success)>;
void SaveSeaPenImage(const AccountId& account_id,
const SeaPenImage& sea_pen_image,
const personalization_app::mojom::SeaPenQueryPtr& query,
SaveSeaPenImageCallback callback);
using DeleteRecentSeaPenImageCallback =
base::OnceCallback<void(bool success)>;
void DeleteSeaPenImage(const AccountId& account_id,
uint32_t image_id,
DeleteRecentSeaPenImageCallback callback);
using GetImageIdsCallback =
base::OnceCallback<void(const std::vector<uint32_t>& ids)>;
void GetImageIds(const AccountId& account_id, GetImageIdsCallback callback);
void TouchFile(const AccountId& account_id, uint32_t image_id);
using GetTemplateIdFromFileCallback =
base::OnceCallback<void(std::optional<int> template_id)>;
void GetTemplateIdFromFile(const AccountId& account_id,
const uint32_t image_id,
GetTemplateIdFromFileCallback callback);
using GetImageAndMetadataCallback = base::OnceCallback<void(
const gfx::ImageSkia& image,
personalization_app::mojom::RecentSeaPenImageInfoPtr image_info)>;
void GetImageAndMetadata(const AccountId& account_id,
uint32_t image_id,
GetImageAndMetadataCallback callback);
using GetImageCallback =
base::OnceCallback<void(const gfx::ImageSkia& image)>;
void GetImage(const AccountId& account_id,
uint32_t image_id,
GetImageCallback callback);
void SetSessionDelegateForTesting(
std::unique_ptr<SessionDelegate> session_delegate);
SessionDelegate* session_delegate_for_testing() {
return session_delegate_.get();
}
private:
base::FilePath GetFilePathForImageId(const AccountId& account_id,
uint32_t image_id) const;
void OnSeaPenImageDecoded(
const AccountId& account_id,
uint32_t image_id,
const personalization_app::mojom::SeaPenQueryPtr& query,
SaveSeaPenImageCallback callback,
const gfx::ImageSkia& image_skia);
void OnFileRead(GetImageAndMetadataCallback callback, std::string data);
void OnFileReadGetTemplateId(GetTemplateIdFromFileCallback callback,
const std::string& data);
std::unique_ptr<SessionDelegate> session_delegate_;
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<SeaPenWallpaperManager> weak_factory_{this};
};
}
#endif