From a066f4b7041347d628c735c07e82b1efc290ec94 Mon Sep 17 00:00:00 2001
From: Greg Fodor <gfodor@gmail.com>
Date: Tue, 30 Oct 2018 16:10:45 +0000
Subject: [PATCH] Properly shutdown stream on removal

---
 src/assets/stylesheets/2d-hud.scss           |  8 ++++----
 src/components/emit-scene-event-on-remove.js | 11 +++++++++++
 src/hub.js                                   |  1 +
 src/network-schemas.js                       | 15 ---------------
 src/react-components/2d-hud.js               |  5 ++++-
 src/scene-entry-manager.js                   |  8 +++++++-
 6 files changed, 27 insertions(+), 21 deletions(-)
 create mode 100644 src/components/emit-scene-event-on-remove.js

diff --git a/src/assets/stylesheets/2d-hud.scss b/src/assets/stylesheets/2d-hud.scss
index 834223deb..b1d4f0584 100644
--- a/src/assets/stylesheets/2d-hud.scss
+++ b/src/assets/stylesheets/2d-hud.scss
@@ -45,11 +45,11 @@
 
   :local(.video-share-extra-options) {
     position: absolute;
-    top: 0;
+    top: -1px;
     left: 0;
     display: flex;
     flex-direction: column;
-    border-radius: 30px;
+    border-radius: 28px;
     padding: 3px 3px 6px 3px;
     background-color: rgba(72, 72, 72, 0.2);
     border: 2px solid rgba(72, 72, 72, 0.3);
@@ -61,7 +61,7 @@
     }
 
     :local(.iconButton):first-child {
-      margin-top: 0;
+      margin-top: 1px;
     }
   }
 }
@@ -91,7 +91,7 @@
   justify-content: center;
   align-items: center;
   cursor: pointer;
-  margin: 0px 2px;
+  margin: 0px 4px;
 }
 
 :local(.iconButton.small) {
diff --git a/src/components/emit-scene-event-on-remove.js b/src/components/emit-scene-event-on-remove.js
new file mode 100644
index 000000000..4f6a02f54
--- /dev/null
+++ b/src/components/emit-scene-event-on-remove.js
@@ -0,0 +1,11 @@
+AFRAME.registerComponent("emit-scene-event-on-remove", {
+  schema: {
+    event: { default: null }
+  },
+
+  remove() {
+    if (this.data.event) {
+      this.el.sceneEl.emit(this.data.event, { el: this.el });
+    }
+  }
+});
diff --git a/src/hub.js b/src/hub.js
index 1d74a8864..b8c039be7 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -61,6 +61,7 @@ import "./components/gamma-factor";
 import "./components/visible-to-owner";
 import "./components/camera-tool";
 import "./components/action-to-event";
+import "./components/emit-scene-event-on-remove";
 
 import ReactDOM from "react-dom";
 import React from "react";
diff --git a/src/network-schemas.js b/src/network-schemas.js
index 686b91e48..4d20913ea 100644
--- a/src/network-schemas.js
+++ b/src/network-schemas.js
@@ -72,21 +72,6 @@ function registerNetworkSchemas() {
     ]
   });
 
-  NAF.schemas.add({
-    template: "#screen-template",
-    components: [
-      {
-        component: "position",
-        requiresNetworkUpdate: vectorRequiresUpdate(0.001)
-      },
-      {
-        component: "rotation",
-        requiresNetworkUpdate: vectorRequiresUpdate(0.5)
-      },
-      "scale"
-    ]
-  });
-
   NAF.schemas.add({
     template: "#interactable-media",
     components: [
diff --git a/src/react-components/2d-hud.js b/src/react-components/2d-hud.js
index 16cb31125..fd3e3317a 100644
--- a/src/react-components/2d-hud.js
+++ b/src/react-components/2d-hud.js
@@ -54,7 +54,10 @@ class TopHUD extends Component {
 
     const showExtrasOnHover = () => {
       clearTimeout(this.hideVideoSharingButtonTimeout);
-      this.setState({ showVideoShareOptions: true });
+
+      if (!this.props.videoShareMediaSource) {
+        this.setState({ showVideoShareOptions: true });
+      }
     };
 
     const hideExtrasOnOut = () => {
diff --git a/src/scene-entry-manager.js b/src/scene-entry-manager.js
index 6b36a09ee..6614d9be1 100644
--- a/src/scene-entry-manager.js
+++ b/src/scene-entry-manager.js
@@ -253,6 +253,9 @@ export default class SceneEntryManager {
         newStream.getVideoTracks().forEach(track => mediaStream.addTrack(track));
         NAF.connection.adapter.setLocalMediaStream(mediaStream);
         currentVideoShareEntity = spawnMediaInfrontOfPlayer(mediaStream, undefined);
+
+        // Wire up custom removal event which will stop the stream.
+        currentVideoShareEntity.setAttribute("emit-scene-event-on-remove", "event:action_end_video_sharing");
       }
 
       this.scene.emit("share_video_enabled", { source: constraints.video.mediaSource });
@@ -298,7 +301,10 @@ export default class SceneEntryManager {
     this.scene.addEventListener("action_end_video_sharing", () => {
       if (isHandlingVideoShare) return;
       isHandlingVideoShare = true;
-      currentVideoShareEntity.parentNode.removeChild(currentVideoShareEntity);
+
+      if (currentVideoShareEntity.parentNode) {
+        currentVideoShareEntity.parentNode.removeChild(currentVideoShareEntity);
+      }
 
       for (const track of mediaStream.getVideoTracks()) {
         mediaStream.removeTrack(track);
-- 
GitLab