blob: 5669756b3cac3f08f66ece3af96872362dc20d25 [file] [log] [blame]
// Copyright 2020 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_UI_GLOBAL_MEDIA_CONTROLS_PRESENTATION_REQUEST_NOTIFICATION_ITEM_H_
#define CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_PRESENTATION_REQUEST_NOTIFICATION_ITEM_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr_exclusion.h"
#include "base/memory/weak_ptr.h"
#include "components/media_message_center/media_notification_item.h"
#include "components/media_router/browser/presentation/start_presentation_context.h"
#include "content/public/browser/presentation_request.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "services/media_session/public/mojom/media_session.mojom.h"
#include "ui/gfx/image/image_skia.h"
namespace content {
class MediaSession;
} // namespace content
namespace global_media_controls {
class MediaItemManager;
} // namespace global_media_controls
// See the class comment for PresentationRequestNotificationProducer for more
// information.
class PresentationRequestNotificationItem final
: public media_message_center::MediaNotificationItem,
public media_session::mojom::MediaSessionObserver {
public:
PresentationRequestNotificationItem(
global_media_controls::MediaItemManager* item_manager,
const content::PresentationRequest& request,
std::unique_ptr<media_router::StartPresentationContext> context);
PresentationRequestNotificationItem(
const PresentationRequestNotificationItem&) = delete;
PresentationRequestNotificationItem& operator=(
const PresentationRequestNotificationItem&) = delete;
~PresentationRequestNotificationItem() final;
// media_message_center::MediaNotificationItem
void Dismiss() final;
// Usually, a MediaSessionNotificationItem is shown instead of a
// PresentationRequestNotificationItem when a user tries to cast from a page
// that has a media session. However, in certain cases the media session is
// not active and we show a PresentationRequestNotificationItem instead (e.g.
// when the user dismisses the MediaSessionNotificationItem).
//
// media_session::mojom::MediaSessionObserver:
void MediaSessionInfoChanged(
media_session::mojom::MediaSessionInfoPtr session_info) override {}
void MediaSessionMetadataChanged(
const absl::optional<media_session::MediaMetadata>& metadata) override;
void MediaSessionActionsChanged(
const std::vector<media_session::mojom::MediaSessionAction>& actions)
override {}
void MediaSessionImagesChanged(
const base::flat_map<media_session::mojom::MediaSessionImageType,
std::vector<media_session::MediaImage>>& images)
override;
void MediaSessionPositionChanged(
const absl::optional<media_session::MediaPosition>& position) override {}
base::WeakPtr<PresentationRequestNotificationItem> GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
static void SetMediaSessionForTest(content::MediaSession* media_session);
const std::string& id() const { return id_; }
media_router::StartPresentationContext* context() const {
return context_.get();
}
bool is_default_presentation_request() const {
return is_default_presentation_request_;
}
std::unique_ptr<media_router::StartPresentationContext> PassContext() {
return std::move(context_);
}
const content::PresentationRequest request() const { return request_; }
private:
FRIEND_TEST_ALL_PREFIXES(PresentationRequestNotificationItemTest,
NotificationHeader);
FRIEND_TEST_ALL_PREFIXES(PresentationRequestNotificationItemTest,
UsesMediaSessionMetadataWhenAvailable);
// media_message_center::MediaNotificationItem
void SetView(media_message_center::MediaNotificationView* view) final;
void OnMediaSessionActionButtonPressed(
media_session::mojom::MediaSessionAction action) final;
void SeekTo(base::TimeDelta time) final {}
media_message_center::SourceType SourceType() override;
void SetVolume(float volume) override {}
void SetMute(bool mute) override {}
bool RequestMediaRemoting() override;
void UpdateViewWithMetadata();
void UpdateViewWithImages();
void OnArtworkBitmap(const SkBitmap& bitmap);
void OnFaviconBitmap(const SkBitmap& bitmap);
const std::string id_;
// This field is not a raw_ptr<> because it was filtered by the rewriter for:
// #union
RAW_PTR_EXCLUSION global_media_controls::MediaItemManager* const
item_manager_;
// True if the item is created from a default PresentationRequest, which means
// |context_| is set to nullptr in the constructor.
const bool is_default_presentation_request_;
// |context_| is nullptr if:
// (1) It is created for a default PresentationRequest;
// (2) MediaNotificationService has passed |context_| to initialize a
// CastDialogController.
std::unique_ptr<media_router::StartPresentationContext> context_;
const content::PresentationRequest request_;
mojo::Receiver<media_session::mojom::MediaSessionObserver> observer_receiver_{
this};
// The metadata for the Media Session associated with the WebContents that
// this presentation request is associated with.
absl::optional<media_session::MediaMetadata> metadata_;
// The favicon/artwork images for the Media Session associated with the
// WebContents this presentation request is associated with.
absl::optional<gfx::ImageSkia> artwork_image_;
absl::optional<gfx::ImageSkia> favicon_image_;
// This field is not a raw_ptr<> because it was filtered by the rewriter for:
// #union
RAW_PTR_EXCLUSION media_message_center::MediaNotificationView* view_ =
nullptr;
base::WeakPtrFactory<PresentationRequestNotificationItem> weak_ptr_factory_{
this};
};
#endif // CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_PRESENTATION_REQUEST_NOTIFICATION_ITEM_H_