chromium/ash/public/cpp/wallpaper/wallpaper_drivefs_delegate.h

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_PUBLIC_CPP_WALLPAPER_WALLPAPER_DRIVEFS_DELEGATE_H_
#define ASH_PUBLIC_CPP_WALLPAPER_WALLPAPER_DRIVEFS_DELEGATE_H_

#include "ash/public/cpp/ash_public_export.h"
#include "ash/public/cpp/image_downloader.h"
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/time/time.h"
#include "components/account_id/account_id.h"

namespace ash {

// Utility class to interact with DriveFS to sync user custom wallpapers.
class ASH_PUBLIC_EXPORT WallpaperDriveFsDelegate {
 public:
  virtual ~WallpaperDriveFsDelegate() = default;

  // Gets the path that synced custom wallpaper is saved to in DriveFS. Returns
  // empty path if DriveFS is inaccessible. If DriveFS is available and mounted
  // and `DriveIntegrationService` is available for `account_id`, should always
  // return a valid path.
  virtual base::FilePath GetWallpaperPath(const AccountId& account_id) = 0;

  // Copies `source` to DriveFS. This function does not check that `source` is a
  // valid jpg file, so the caller must do so. Calls `callback` when the
  // operation finishes.
  virtual void SaveWallpaper(
      const AccountId& account_id,
      const base::FilePath& source,
      base::OnceCallback<void(bool success)> callback) = 0;

  using GetWallpaperModificationTimeCallback =
      base::OnceCallback<void(base::Time modification_time)>;
  // Gets the `modification_time` of the wallpaper file saved in DriveFS. If
  // unable to retrieve it because the file does not exist or DriveFS is not
  // mounted, replies with a default constructed `base::Time()`.
  virtual void GetWallpaperModificationTime(
      const AccountId& account_id,
      GetWallpaperModificationTimeCallback callback) = 0;

  using WaitForWallpaperChangeCallback = base::OnceCallback<void(bool success)>;
  // Waits for the DriveFS wallpaper file to change. Does not distinguish
  // between types of changes, so the caller must be aware that the file could
  // have been added, deleted, or modified. Runs `callback` with success=false
  // if unable to observe for DriveFS changes for any reason, like DriveFS being
  // or becoming unavailable for `account_id`.
  virtual void WaitForWallpaperChange(
      const AccountId& account_id,
      WaitForWallpaperChangeCallback callback) = 0;

  // Downloads and decodes DriveFS wallpaper file. Replies with default
  // constructed `gfx::ImageSkia` in case of failure, such as the file not
  // existing or DriveFS error.
  virtual void DownloadAndDecodeWallpaper(
      const AccountId& account_id,
      ImageDownloader::DownloadCallback callback) = 0;
};

}  // namespace ash

#endif  // ASH_PUBLIC_CPP_WALLPAPER_WALLPAPER_DRIVEFS_DELEGATE_H_