#ifndef ASH_AMBIENT_MODEL_AMBIENT_ANIMATION_PHOTO_PROVIDER_H_
#define ASH_AMBIENT_MODEL_AMBIENT_ANIMATION_PHOTO_PROVIDER_H_
#include <functional>
#include <string>
#include <string_view>
#include <vector>
#include "ash/ambient/model/ambient_backend_model.h"
#include "ash/ambient/util/ambient_util.h"
#include "ash/ash_export.h"
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "cc/paint/skottie_frame_data_provider.h"
#include "cc/paint/skottie_resource_metadata.h"
namespace ash {
class AmbientAnimationStaticResources;
class ASH_EXPORT AmbientAnimationPhotoProvider
: public cc::SkottieFrameDataProvider {
public:
class Observer : public base::CheckedObserver {
public:
virtual void OnDynamicImageAssetsRefreshed(
const base::flat_map<ambient::util::ParsedDynamicAssetId,
std::reference_wrapper<const PhotoWithDetails>>&
new_topics) = 0;
protected:
~Observer() override = default;
};
AmbientAnimationPhotoProvider(
const AmbientAnimationStaticResources* static_resources,
const AmbientBackendModel* backend_model);
~AmbientAnimationPhotoProvider() override;
scoped_refptr<ImageAsset> LoadImageAsset(
std::string_view resource_id,
const base::FilePath& resource_path,
const std::optional<gfx::Size>& size) override;
void AddObserver(Observer* obs);
void RemoveObserver(Observer* obs);
bool ToggleStaticImageAsset(cc::SkottieResourceIdHash asset_id, bool enabled);
private:
class DynamicImageAssetImpl;
class StaticImageAssetImpl;
struct OrderDynamicAssetsByIdx {
bool operator()(const scoped_refptr<DynamicImageAssetImpl>& asset_l,
const scoped_refptr<DynamicImageAssetImpl>& asset_r) const;
};
using DynamicAssetSet = base::flat_set<scoped_refptr<DynamicImageAssetImpl>,
OrderDynamicAssetsByIdx>;
PhotoWithDetails GenerateNextTopicForDynamicAsset(
const DynamicImageAssetImpl& asset);
PhotoWithDetails ExtractPendingTopicForDynamicAsset(
const DynamicImageAssetImpl& asset);
void RotateDynamicAssetTopics();
std::vector<std::reference_wrapper<const PhotoWithDetails>>
GetTopicsToChooseFrom() const;
void NotifyObserverOfNewTopics();
void RecordDynamicAssetMetrics();
bool enable_tree_shadow_ = false;
const raw_ptr<const AmbientAnimationStaticResources> static_resources_;
const raw_ptr<const AmbientBackendModel> backend_model_;
base::flat_map<cc::SkottieResourceIdHash, scoped_refptr<StaticImageAssetImpl>>
static_assets_;
base::flat_map</*position_id*/ std::string, DynamicAssetSet>
dynamic_assets_per_position_;
size_t total_num_dynamic_assets_ = 0;
base::flat_map<const DynamicImageAssetImpl*, PhotoWithDetails>
pending_dynamic_asset_topics_;
base::ObserverList<Observer> observers_;
base::WeakPtrFactory<AmbientAnimationPhotoProvider> weak_factory_;
};
}
#endif