chromium/chrome/browser/ash/crosapi/wallpaper_ash.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 CHROME_BROWSER_ASH_CROSAPI_WALLPAPER_ASH_H_
#define CHROME_BROWSER_ASH_CROSAPI_WALLPAPER_ASH_H_

#include <string>

#include "base/memory/weak_ptr.h"
#include "chromeos/crosapi/mojom/wallpaper.mojom.h"
#include "extensions/common/extension_id.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "services/data_decoder/public/cpp/data_decoder.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/image/image_skia.h"

namespace crosapi {

// Ash implementation of the wallpaper extension API in Lacros.
class WallpaperAsh : public mojom::Wallpaper {
 public:
  WallpaperAsh();
  WallpaperAsh(const WallpaperAsh&) = delete;
  WallpaperAsh& operator=(const WallpaperAsh&) = delete;
  ~WallpaperAsh() override;

  void BindReceiver(mojo::PendingReceiver<mojom::Wallpaper> receiver);

  // mojom::Wallpaper:
  // Implementation removed in M116.
  void SetWallpaperDeprecated(mojom::WallpaperSettingsPtr wallpaper_settings,
                              const std::string& extension_id,
                              const std::string& extension_name,
                              SetWallpaperDeprecatedCallback callback) override;
  void SetWallpaper(mojom::WallpaperSettingsPtr wallpaper_settings,
                    const std::string& extension_id,
                    const std::string& extension_name,
                    SetWallpaperCallback callback) override;

 private:
  void OnWallpaperDecoded(mojom::WallpaperSettingsPtr wallpaper_settings,
                          const SkBitmap& bitmap);
  void SendErrorResult(const std::string& response);
  void SendSuccessResult(const std::vector<uint8_t>& thumbnail_data);

  mojo::ReceiverSet<mojom::Wallpaper> receivers_;
  // The ID of the extension making the current SetWallpaper() call.
  extensions::ExtensionId extension_id_;
  SetWallpaperCallback pending_callback_;
  data_decoder::DataDecoder data_decoder_;
  base::WeakPtrFactory<WallpaperAsh> weak_ptr_factory_{this};
};

}  // namespace crosapi

#endif  // CHROME_BROWSER_ASH_CROSAPI_WALLPAPER_ASH_H_