1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
// 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/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "components/global_media_controls/public/mojom/device_service.mojom.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 "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/mojom/media_session.mojom.h"
#include "ui/gfx/image/image_skia.h"
namespace content {
class MediaSession;
} // namespace content
// This object observes changes to the media session related to a device picker
// shown for a presentation request, and forwards those changes to
// global_media_controls::mojom::DevicePickerProvider.
class PresentationRequestNotificationItem final
: public media_session::mojom::MediaSessionObserver {
public:
PresentationRequestNotificationItem(
const content::PresentationRequest& request,
std::unique_ptr<media_router::StartPresentationContext> context,
const mojo::Remote<global_media_controls::mojom::DevicePickerProvider>&
provider);
PresentationRequestNotificationItem(
const PresentationRequestNotificationItem&) = delete;
PresentationRequestNotificationItem& operator=(
const PresentationRequestNotificationItem&) = delete;
~PresentationRequestNotificationItem() 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 std::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 std::optional<media_session::MediaPosition>& position) override {}
base::WeakPtr<PresentationRequestNotificationItem> GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
static void SetMediaSessionForTest(content::MediaSession* media_session);
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:
void UpdatePickerWithMetadata();
void UpdatePickerWithImages();
void OnArtworkBitmap(const SkBitmap& bitmap);
void OnFaviconBitmap(const SkBitmap& bitmap);
// 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.
std::optional<media_session::MediaMetadata> metadata_;
// The favicon/artwork images for the Media Session associated with the
// WebContents this presentation request is associated with.
gfx::ImageSkia artwork_image_;
gfx::ImageSkia favicon_image_;
const raw_ref<
const mojo::Remote<global_media_controls::mojom::DevicePickerProvider>>
provider_;
base::WeakPtrFactory<PresentationRequestNotificationItem> weak_ptr_factory_{
this};
};
#endif // CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_PRESENTATION_REQUEST_NOTIFICATION_ITEM_H_
|