#ifndef CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_CONTROLLERS_MANAGER_H_
#define CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_CONTROLLERS_MANAGER_H_
#include <map>
#include <memory>
#include <utility>
#include "base/memory/raw_ptr.h"
#include "content/common/content_export.h"
#include "content/public/browser/web_contents_observer.h"
#include "services/media_session/public/mojom/media_session.mojom.h"
namespace media {
enum class MediaContentType;
}
namespace media_session {
struct MediaPosition;
}
namespace content {
class MediaSessionController;
class RenderFrameHost;
class WebContentsImpl;
class CONTENT_EXPORT MediaSessionControllersManager {
public:
explicit MediaSessionControllersManager(WebContentsImpl* web_contents);
MediaSessionControllersManager(const MediaSessionControllersManager&) =
delete;
MediaSessionControllersManager& operator=(
const MediaSessionControllersManager&) = delete;
~MediaSessionControllersManager();
void RenderFrameDeleted(RenderFrameHost* render_frame_host);
void OnMetadata(const MediaPlayerId& id,
bool has_audio,
bool has_video,
media::MediaContentType media_content_type);
bool RequestPlay(const MediaPlayerId& id);
void OnPause(const MediaPlayerId& id, bool reached_end_of_stream);
#if defined(OHOS_MEDIA_AVSESSION)
void OnEndAVSession(const MediaPlayerId& id, bool is_hidden);
#endif
void OnEnd(const MediaPlayerId& id);
void OnMediaPositionStateChanged(
const MediaPlayerId& id,
const media_session::MediaPosition& position);
void PictureInPictureStateChanged(bool is_picture_in_picture);
void WebContentsMutedStateChanged(bool muted);
#if defined(OHOS_MEDIA_POLICY)
void SetHtmlPlayEnabled(bool enabled);
#endif
void OnMediaMutedStatusChanged(const MediaPlayerId& id, bool mute);
void OnPictureInPictureAvailabilityChanged(const MediaPlayerId& id,
bool available);
void OnAudioOutputSinkChanged(const MediaPlayerId& id,
const std::string& raw_device_id);
void OnAudioOutputSinkChangingDisabled(const MediaPlayerId& id);
void OnRemotePlaybackMetadataChange(
const MediaPlayerId& id,
media_session::mojom::RemotePlaybackMetadataPtr remote_playback_metadata);
private:
using ControllersMap =
std::map<MediaPlayerId, std::unique_ptr<MediaSessionController>>;
MediaSessionController* FindOrCreateController(const MediaPlayerId& id);
const raw_ptr<WebContentsImpl> web_contents_;
ControllersMap controllers_map_;
};
}
#endif