// Copyright 2023 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_MEDIA_ROUTER_CAST_NOTIFICATION_CONTROLLER_LACROS_H_
#define CHROME_BROWSER_UI_MEDIA_ROUTER_CAST_NOTIFICATION_CONTROLLER_LACROS_H_
#include "components/keyed_service/core/keyed_service.h"
#include "components/media_router/browser/media_routes_observer.h"
#include "components/media_router/browser/mirroring_media_controller_host.h"
#include "components/media_router/common/media_route.h"
#include "ui/message_center/public/cpp/notification.h"
class NotificationDisplayService;
class Profile;
namespace media_router {
class MediaRouter;
// Manages showing Chrome OS notifications when casting from Lacros and handling
// user input from the notifications, e.g. to stop casting.
//
// Notifications for Cast sessions started from Ash are managed by
// ash::CastNotificationController instead.
class CastNotificationControllerLacros
: public KeyedService,
public MediaRoutesObserver,
public MirroringMediaControllerHost::Observer {
public:
explicit CastNotificationControllerLacros(Profile* profile);
CastNotificationControllerLacros(
Profile* profile,
NotificationDisplayService* notification_service,
MediaRouter* router);
CastNotificationControllerLacros(const CastNotificationControllerLacros&) =
delete;
CastNotificationControllerLacros& operator=(
const CastNotificationControllerLacros&) = delete;
~CastNotificationControllerLacros() override;
// MediaRoutesObserver:
void OnRoutesUpdated(const std::vector<MediaRoute>& routes) override;
// MirroringMediaControllerHost::Observer:
void OnFreezeInfoChanged() override;
private:
void ShowNotification(const MediaRoute& route);
void HideNotification();
message_center::Notification CreateNotification(const MediaRoute& route);
std::vector<message_center::ButtonInfo> GetButtons(
const MediaRoute& route,
MirroringMediaControllerHost* freeze_host);
void OnNotificationClicked(std::optional<int> button_index);
void StopCasting();
void FreezeOrUnfreezeCastStream();
void StopObservingFreezeHost();
const raw_ptr<Profile> profile_;
// Dangling in SubAppsServiceImplBrowserTest.AddFailAppIsSubApp due to
// NotificationDisplayServiceTester replacing the service referenced here.
const raw_ptr<NotificationDisplayService, AcrossTasksDanglingUntriaged>
notification_service_;
const raw_ptr<MediaRouter> media_router_;
std::optional<MediaRoute> displayed_route_;
bool displayed_route_is_frozen_ = false;
std::optional<int> freeze_button_index_;
std::optional<int> stop_button_index_;
raw_ptr<MirroringMediaControllerHost> freeze_host_ = nullptr;
base::WeakPtrFactory<CastNotificationControllerLacros> weak_ptr_factory_{
this};
};
} // namespace media_router
#endif // CHROME_BROWSER_UI_MEDIA_ROUTER_CAST_NOTIFICATION_CONTROLLER_LACROS_H_