blob: dfdf4c47fa64655d170e83461d16240103193731 [file] [log] [blame]
imchengf3e5a012015-11-20 04:08:371// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Evan Stadebbb9f5242020-09-25 17:26:465#ifndef COMPONENTS_MEDIA_ROUTER_BROWSER_MEDIA_ROUTER_BASE_H_
6#define COMPONENTS_MEDIA_ROUTER_BROWSER_MEDIA_ROUTER_BASE_H_
imchengf3e5a012015-11-20 04:08:377
mfoltzb4ba3722016-03-18 17:13:448#include <set>
avid09ea9f2016-12-25 23:07:449#include <unordered_map>
mfoltzbdabddf2016-04-27 06:10:4610#include <vector>
mfoltzb4ba3722016-03-18 17:13:4411
imchengf3e5a012015-11-20 04:08:3712#include "base/callback_list.h"
imchengf3e5a012015-11-20 04:08:3713#include "base/gtest_prod_util.h"
14#include "base/macros.h"
Takumi Fujimotoadda1f9b2017-08-16 05:19:4115#include "build/build_config.h"
Evan Stadebbb9f5242020-09-25 17:26:4616#include "components/media_router/browser/issue_manager.h"
17#include "components/media_router/browser/media_router.h"
18#include "components/media_router/browser/media_routes_observer.h"
Evan Stade92b69ca2020-08-21 23:55:5819#include "components/media_router/common/media_route.h"
mark a. foltz6bbe59f2018-07-24 20:06:2420#include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
mfoltzb4ba3722016-03-18 17:13:4421
Takumi Fujimotofd94425d2019-08-18 22:36:1222#if !defined(OS_ANDROID)
Evan Stade92b69ca2020-08-21 23:55:5823#include "components/media_router/common/mojom/media_controller.mojom.h"
Takumi Fujimotofd94425d2019-08-18 22:36:1224#include "mojo/public/cpp/bindings/pending_receiver.h"
Mario Sanchez Prada4cdf6ead2019-09-24 10:42:0125#include "mojo/public/cpp/bindings/pending_remote.h"
Takumi Fujimotofd94425d2019-08-18 22:36:1226#endif // !defined(OS_ANDROID)
27
imchengf3e5a012015-11-20 04:08:3728namespace media_router {
29
30class MediaRouterBase : public MediaRouter {
31 public:
imchengf3e5a012015-11-20 04:08:3732 ~MediaRouterBase() override;
33
Evan Stadebbb9f5242020-09-25 17:26:4634 // Must be called before invoking any other method.
35 void Initialize();
36
Derek Chenge3fb6f72017-09-19 00:58:0237 // MediaRouter implementation.
dchengc16dc8092016-04-08 23:12:5638 std::unique_ptr<PresentationConnectionStateSubscription>
imchengf3e5a012015-11-20 04:08:3739 AddPresentationConnectionStateChangedCallback(
40 const MediaRoute::Id& route_id,
41 const content::PresentationConnectionStateChangedCallback& callback)
42 override;
trizzofo9f8e900b2016-07-21 22:24:4143 void OnIncognitoProfileShutdown() override;
Derek Chenge3fb6f72017-09-19 00:58:0244 IssueManager* GetIssueManager() final;
takumif21ad18d2016-12-05 18:50:0445 std::vector<MediaRoute> GetCurrentRoutes() const override;
Thomas Guilbertfc4431b2018-07-20 19:05:4746 std::unique_ptr<media::FlingingController> GetFlingingController(
Thomas Guilbert42b46652018-03-12 23:01:4747 const MediaRoute::Id& route_id) override;
Takumi Fujimotoadda1f9b2017-08-16 05:19:4148#if !defined(OS_ANDROID)
Takumi Fujimotofd94425d2019-08-18 22:36:1249 void GetMediaController(
50 const MediaRoute::Id& route_id,
51 mojo::PendingReceiver<mojom::MediaController> controller,
Mario Sanchez Prada4cdf6ead2019-09-24 10:42:0152 mojo::PendingRemote<mojom::MediaStatusObserver> observer) override;
Takumi Fujimotod470c932020-08-06 22:50:4353 base::Value GetLogs() const override;
Takumi Fujimotoadda1f9b2017-08-16 05:19:4154#endif // !defined(OS_ANDROID)
Bin Zhao59c66472018-03-07 20:30:4555 base::Value GetState() const override;
mark a. foltze61571562020-03-09 18:45:4156 void GetProviderState(
57 MediaRouteProviderId provider_id,
58 mojom::MediaRouteProvider::GetStateCallback callback) const override;
xjzef7927f2017-07-07 20:58:1959
imchengf3e5a012015-11-20 04:08:3760 protected:
61 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest,
62 PresentationConnectionStateChangedCallback);
imchenged10e962016-02-23 06:34:4463 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest,
64 PresentationConnectionStateChangedCallbackRemoved);
takumif6eab02de2016-10-11 22:39:5565 FRIEND_TEST_ALL_PREFIXES(MediaRouterBaseTest, CreatePresentationIds);
66 FRIEND_TEST_ALL_PREFIXES(MediaRouterBaseTest, NotifyCallbacks);
imchengf3e5a012015-11-20 04:08:3767
mfoltzbdabddf2016-04-27 06:10:4668 MediaRouterBase();
69
avayvodca198012016-04-18 17:21:1870 // Generates a unique presentation id. Shared between Android and desktop.
71 static std::string CreatePresentationId();
72
imchengf3e5a012015-11-20 04:08:3773 void NotifyPresentationConnectionStateChange(
74 const MediaRoute::Id& route_id,
mark a. foltze8ad3202018-04-23 22:50:2375 blink::mojom::PresentationConnectionState state);
imchenged10e962016-02-23 06:34:4476 void NotifyPresentationConnectionClose(
77 const MediaRoute::Id& route_id,
mark a. foltz67461c82018-04-13 17:05:4178 blink::mojom::PresentationConnectionCloseReason reason,
imchenged10e962016-02-23 06:34:4479 const std::string& message);
imchengf3e5a012015-11-20 04:08:3780
mfoltz0ae252e82016-05-12 19:30:5581 // Returns true when there is at least one MediaRoute that can be returned by
82 // JoinRoute().
83 bool HasJoinableRoute() const;
mfoltzb4ba3722016-03-18 17:13:4484
Derek Cheng76870b6a2017-09-07 03:08:3885 // Returns a pointer to the MediaRoute whose ID is |route_id|, or nullptr
86 // if not found.
87 const MediaRoute* GetRoute(const MediaRoute::Id& route_id) const;
takumif3c8ebf962017-04-18 05:29:2588
imchenged10e962016-02-23 06:34:4489 using PresentationConnectionStateChangedCallbacks = base::CallbackList<void(
90 const content::PresentationConnectionStateChangeInfo&)>;
mfoltzbdabddf2016-04-27 06:10:4691
avid09ea9f2016-12-25 23:07:4492 std::unordered_map<
imchengf3e5a012015-11-20 04:08:3793 MediaRoute::Id,
dchengc16dc8092016-04-08 23:12:5694 std::unique_ptr<PresentationConnectionStateChangedCallbacks>>
imchengf3e5a012015-11-20 04:08:3795 presentation_connection_state_callbacks_;
96
imchengf3e5a012015-11-20 04:08:3797 private:
takumif21ad18d2016-12-05 18:50:0498 friend class MediaRouterBaseTest;
mfoltzbdabddf2016-04-27 06:10:4699 friend class MediaRouterMojoTest;
100
101 class InternalMediaRoutesObserver;
102
imchengf3e5a012015-11-20 04:08:37103 // Called when a PresentationConnectionStateChangedCallback associated with
104 // |route_id| is removed from |presentation_connection_state_callbacks_|.
105 void OnPresentationConnectionStateCallbackRemoved(
106 const MediaRoute::Id& route_id);
107
mfoltzbdabddf2016-04-27 06:10:46108 // KeyedService
109 void Shutdown() override;
110
Derek Chenge3fb6f72017-09-19 00:58:02111 IssueManager issue_manager_;
112
mfoltzbdabddf2016-04-27 06:10:46113 std::unique_ptr<InternalMediaRoutesObserver> internal_routes_observer_;
114 bool initialized_;
mfoltzb4ba3722016-03-18 17:13:44115
imchengf3e5a012015-11-20 04:08:37116 DISALLOW_COPY_AND_ASSIGN(MediaRouterBase);
117};
118
119} // namespace media_router
120
Evan Stadebbb9f5242020-09-25 17:26:46121#endif // COMPONENTS_MEDIA_ROUTER_BROWSER_MEDIA_ROUTER_BASE_H_