[Cast MRP] Created MirroringActivityRecord class.

Bug: 965229
Change-Id: Id1f1c3c703f196514fb77b6362aa2c1dc33d0641
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1605342
Reviewed-by: Takumi Fujimoto <takumif@chromium.org>
Commit-Queue: John Williams <jrw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#661951}
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn
index f0dcad8..d59c96f 100644
--- a/chrome/browser/media/router/BUILD.gn
+++ b/chrome/browser/media/router/BUILD.gn
@@ -93,6 +93,8 @@
       "presentation/independent_otr_profile_manager.h",
       "presentation/presentation_navigation_policy.cc",
       "presentation/presentation_navigation_policy.h",
+      "providers/cast/activity_record.cc",
+      "providers/cast/activity_record.h",
       "providers/cast/cast_activity_manager.cc",
       "providers/cast/cast_activity_manager.h",
       "providers/cast/cast_activity_record.cc",
@@ -115,6 +117,8 @@
       "providers/cast/chrome_cast_message_handler.h",
       "providers/cast/dual_media_sink_service.cc",
       "providers/cast/dual_media_sink_service.h",
+      "providers/cast/mirroring_activity_record.cc",
+      "providers/cast/mirroring_activity_record.h",
       "providers/common/buffered_message_sender.cc",
       "providers/common/buffered_message_sender.h",
       "providers/dial/dial_activity_manager.cc",
diff --git a/chrome/browser/media/router/providers/cast/activity_record.cc b/chrome/browser/media/router/providers/cast/activity_record.cc
new file mode 100644
index 0000000..f98dd45
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/activity_record.cc
@@ -0,0 +1,15 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/router/providers/cast/activity_record.h"
+
+namespace media_router {
+
+ActivityRecord::ActivityRecord(const MediaRoute& route,
+                               const std::string& app_id)
+    : route_(route), app_id_(app_id) {}
+
+ActivityRecord::~ActivityRecord() = default;
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/activity_record.h b/chrome/browser/media/router/providers/cast/activity_record.h
new file mode 100644
index 0000000..cc1d4009
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/activity_record.h
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_ACTIVITY_RECORD_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_ACTIVITY_RECORD_H_
+
+#include <string>
+
+#include "chrome/common/media_router/media_route.h"
+
+namespace media_router {
+
+class ActivityRecord {
+ public:
+  ActivityRecord(const MediaRoute& route, const std::string& app_id);
+  ActivityRecord(const ActivityRecord&) = delete;
+  ActivityRecord& operator=(const ActivityRecord&) = delete;
+  virtual ~ActivityRecord();
+
+  const MediaRoute& route() const { return route_; }
+  const std::string& app_id() const { return app_id_; }
+
+ protected:
+  MediaRoute route_;
+  const std::string app_id_;
+};
+
+}  // namespace media_router
+
+#endif  // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_ACTIVITY_RECORD_H_
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.h b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
index 4da79f9..9a50586 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
@@ -37,9 +37,18 @@
 // CastActivityRecord.
 class CastActivityManagerBase {
  public:
+  CastActivityManagerBase() = default;
+  CastActivityManagerBase(const CastActivityManagerBase&) = delete;
+  CastActivityManagerBase& operator=(const CastActivityManagerBase&) = delete;
+
   virtual cast_channel::ResultCallback MakeResultCallbackForRoute(
       const std::string& route_id,
       mojom::MediaRouteProvider::TerminateRouteCallback callback) = 0;
+
+ protected:
+  // The destructor is protected to allow deletion only through a pointer to a
+  // derived type.
+  ~CastActivityManagerBase() = default;
 };
 
 // Handles launching and terminating Cast application on a Cast receiver, and
@@ -237,7 +246,6 @@
   SEQUENCE_CHECKER(sequence_checker_);
   base::WeakPtrFactory<CastActivityManager> weak_ptr_factory_;
   FRIEND_TEST_ALL_PREFIXES(CastActivityManagerTest, SendMediaRequestToReceiver);
-  DISALLOW_COPY_AND_ASSIGN(CastActivityManager);
 };
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_record.cc b/chrome/browser/media/router/providers/cast/cast_activity_record.cc
index 35b35ef..8d63948 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_record.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_record.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// #include "chrome/common/media_router/mojo/media_router.mojom.h"
 #include "chrome/browser/media/router/providers/cast/cast_activity_record.h"
 
 #include <memory>
@@ -21,7 +20,7 @@
 
 CastActivityRecord::CastActivityRecord(const MediaRoute& route,
                                        const std::string& app_id)
-    : route_(route), app_id_(app_id) {}
+    : ActivityRecord(route, app_id) {}
 
 CastActivityRecord::~CastActivityRecord() = default;
 
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_record.h b/chrome/browser/media/router/providers/cast/cast_activity_record.h
index 369a9a8c..27038ab 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_record.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_record.h
@@ -11,6 +11,7 @@
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/optional.h"
+#include "chrome/browser/media/router/providers/cast/activity_record.h"
 #include "chrome/common/media_router/mojo/media_router.mojom.h"
 #include "chrome/common/media_router/providers/cast/cast_media_source.h"
 #include "components/cast_channel/cast_message_handler.h"
@@ -35,16 +36,14 @@
 // are handled by LocalPresentationManager.
 //
 // Instances of this class are associated with a specific session and app.
-class CastActivityRecord {
+class CastActivityRecord : public ActivityRecord {
  public:
   using ClientMap =
       base::flat_map<std::string, std::unique_ptr<CastSessionClient>>;
 
   CastActivityRecord(const MediaRoute& route, const std::string& app_id);
-  virtual ~CastActivityRecord();
+  ~CastActivityRecord() override;
 
-  const MediaRoute& route() const { return route_; }
-  const std::string& app_id() const { return app_id_; }
   const base::Optional<std::string>& session_id() const { return session_id_; }
 
   // TODO(jrw): Get rid of this accessor.
@@ -114,8 +113,6 @@
   virtual void TerminatePresentationConnections() = 0;
 
  protected:
-  MediaRoute route_;
-  const std::string app_id_;
   ClientMap connected_clients_;
 
   // Set by CastActivityManager after the session is launched successfully.
@@ -204,8 +201,6 @@
   CastSessionTracker* const session_tracker_;
   DataDecoder* const data_decoder_;
   CastActivityManagerBase* const activity_manager_;
-
-  DISALLOW_COPY_AND_ASSIGN(CastActivityRecordImpl);
 };
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client.h b/chrome/browser/media/router/providers/cast/cast_session_client.h
index a6b9ad3..7232667 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_client.h
@@ -35,6 +35,8 @@
   CastSessionClient(const std::string& client_id,
                     const url::Origin& origin,
                     int tab_id);
+  CastSessionClient(const CastSessionClient&) = delete;
+  CastSessionClient& operator=(const CastSessionClient&) = delete;
   virtual ~CastSessionClient();
 
   const std::string& client_id() const { return client_id_; }
@@ -185,7 +187,6 @@
   blink::mojom::PresentationConnectionPtr connection_;
 
   base::WeakPtrFactory<CastSessionClientImpl> weak_ptr_factory_;
-  DISALLOW_COPY_AND_ASSIGN(CastSessionClientImpl);
 };
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_record.cc b/chrome/browser/media/router/providers/cast/mirroring_activity_record.cc
new file mode 100644
index 0000000..e042079
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity_record.cc
@@ -0,0 +1,64 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/router/providers/cast/mirroring_activity_record.h"
+
+#include <utility>
+
+#include "chrome/common/media_router/mojo/media_router.mojom.h"
+#include "components/mirroring/mojom/session_parameters.mojom.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+
+using mirroring::mojom::CastMessageChannelPtr;
+using mirroring::mojom::CastMessagePtr;
+using mirroring::mojom::SessionError;
+using mirroring::mojom::SessionObserverPtr;
+using mirroring::mojom::SessionParameters;
+
+namespace media_router {
+
+MirroringActivityRecord::MirroringActivityRecord(
+    const MediaRoute& route,
+    const std::string& app_id,
+    int32_t target_tab_id,
+    mojom::MediaRouter* media_router)
+    : ActivityRecord(route, app_id),
+      observer_binding_(this),
+      channel_binding_(this) {
+  media_router->GetMirroringServiceHostForTab(target_tab_id,
+                                              mojo::MakeRequest(&host_));
+  SessionObserverPtr observer_ptr_;
+  observer_binding_.Bind(mojo::MakeRequest(&observer_ptr_));
+
+  CastMessageChannelPtr channel_ptr_;
+  channel_binding_.Bind(mojo::MakeRequest(&channel_ptr_));
+
+  // TODO(jrw): Set session parameters.
+  host_->Start(SessionParameters::New(), std::move(observer_ptr_),
+               std::move(channel_ptr_), mojo::MakeRequest(&inbound_channel_));
+}
+
+MirroringActivityRecord::~MirroringActivityRecord() = default;
+
+void MirroringActivityRecord::OnError(SessionError error) {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+void MirroringActivityRecord::DidStart() {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+void MirroringActivityRecord::DidStop() {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+void MirroringActivityRecord::Send(CastMessagePtr message) {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_record.h b/chrome/browser/media/router/providers/cast/mirroring_activity_record.h
new file mode 100644
index 0000000..c536c7d
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity_record.h
@@ -0,0 +1,47 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_MIRRORING_ACTIVITY_RECORD_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_MIRRORING_ACTIVITY_RECORD_H_
+
+#include <string>
+
+#include "chrome/browser/media/router/providers/cast/activity_record.h"
+#include "chrome/common/media_router/media_route.h"
+#include "chrome/common/media_router/mojo/media_router.mojom-forward.h"
+#include "components/mirroring/mojom/cast_message_channel.mojom.h"
+#include "components/mirroring/mojom/mirroring_service_host.mojom.h"
+#include "components/mirroring/mojom/session_observer.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
+
+namespace media_router {
+
+class MirroringActivityRecord : public ActivityRecord,
+                                public mirroring::mojom::SessionObserver,
+                                public mirroring::mojom::CastMessageChannel {
+ public:
+  MirroringActivityRecord(const MediaRoute& route,
+                          const std::string& app_id,
+                          int32_t target_tab_id,
+                          mojom::MediaRouter* media_router);
+  ~MirroringActivityRecord() override;
+
+  // SessionObserver implementation
+  void OnError(mirroring::mojom::SessionError error) override;
+  void DidStart() override;
+  void DidStop() override;
+
+  // CastMessageChannel implementation
+  void Send(mirroring::mojom::CastMessagePtr message) override;
+
+ private:
+  mirroring::mojom::MirroringServiceHostPtr host_;
+  mirroring::mojom::CastMessageChannelPtr inbound_channel_;
+  mojo::Binding<mirroring::mojom::SessionObserver> observer_binding_;
+  mojo::Binding<mirroring::mojom::CastMessageChannel> channel_binding_;
+};
+
+}  // namespace media_router
+
+#endif  // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_MIRRORING_ACTIVITY_RECORD_H_
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_record_unittest.cc b/chrome/browser/media/router/providers/cast/mirroring_activity_record_unittest.cc
new file mode 100644
index 0000000..a02c5807
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity_record_unittest.cc
@@ -0,0 +1,25 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/router/providers/cast/mirroring_activity_record.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+using mirroring::mojom::CastMessagePtr;
+using mirroring::mojom::SessionError;
+
+namespace media_router {
+
+class MirroringActivityRecordTest : public testing::Test {
+ public:
+  MirroringActivityRecordTest() {
+    // TODO(jrw)
+  }
+
+  ~MirroringActivityRecordTest() override {
+    // TODO(jrw)
+  }
+};
+
+}  // namespace media_router
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index f4e56827..d864ca7 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3677,6 +3677,7 @@
       "../browser/media/router/providers/cast/cast_session_client_unittest.cc",
       "../browser/media/router/providers/cast/cast_session_tracker_unittest.cc",
       "../browser/media/router/providers/cast/dual_media_sink_service_unittest.cc",
+      "../browser/media/router/providers/cast/mirroring_activity_record_unittest.cc",
       "../browser/media/router/providers/cast/mock_cast_activity_record.cc",
       "../browser/media/router/providers/cast/mock_cast_activity_record.h",
       "../browser/media/router/providers/cast/test_util.cc",