/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "media/streaming/media_streaming_player.h" #include "ui/effects/radial_animation.h" #include "ui/effects/animations.h" #include "base/timer.h" class DocumentData; namespace Media { namespace Streaming { class Instance; class Loader; class Document { public: Document( not_null document, std::shared_ptr reader); Document( not_null photo, std::shared_ptr reader); explicit Document(std::unique_ptr loader); void play(const PlaybackOptions &options); void saveFrameToCover(); [[nodiscard]] Player &player(); [[nodiscard]] const Player &player() const; [[nodiscard]] const Information &info() const; [[nodiscard]] bool waitingShown() const; [[nodiscard]] float64 waitingOpacity() const; [[nodiscard]] Ui::RadialState waitingState() const; private: Document( std::shared_ptr reader, DocumentData *document, PhotoData *photo); friend class Instance; void registerInstance(not_null instance); void unregisterInstance(not_null instance); void refreshPlayerPriority(); void waitingCallback(); void handleUpdate(Update &&update); void handleError(Error &&error); void ready(Information &&info); void waitingChange(bool waiting); void validateGoodThumbnail(); void resubscribe(); DocumentData *_document = nullptr; PhotoData *_photo = nullptr; Player _player; Information _info; rpl::lifetime _subscription; bool _waiting = false; mutable Ui::InfiniteRadialAnimation _radial; Ui::Animations::Simple _fading; base::Timer _timer; base::flat_set> _instances; }; } // namespace Streaming } // namespace Media