您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

LocalVideo.js 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. var SmallVideo = require("./SmallVideo");
  2. var ConnectionIndicator = require("./ConnectionIndicator");
  3. var NicknameHandler = require("../util/NicknameHandler");
  4. var UIUtil = require("../util/UIUtil");
  5. var LargeVideo = require("./LargeVideo");
  6. function LocalVideo(VideoLayout)
  7. {
  8. this.videoSpanId = "localVideoContainer";
  9. this.container = $("#localVideoContainer").get(0);
  10. this.VideoLayout = VideoLayout;
  11. this.flipX = true;
  12. this.peerJid = null;
  13. this.resourceJid = null;
  14. }
  15. LocalVideo.prototype = Object.create(SmallVideo.prototype);
  16. LocalVideo.prototype.constructor = LocalVideo;
  17. /**
  18. * Creates the edit display name button.
  19. *
  20. * @returns the edit button
  21. */
  22. function createEditDisplayNameButton() {
  23. var editButton = document.createElement('a');
  24. editButton.className = 'displayname';
  25. UIUtil.setTooltip(editButton,
  26. "videothumbnail.editnickname",
  27. "top");
  28. editButton.innerHTML = '<i class="fa fa-pencil"></i>';
  29. return editButton;
  30. }
  31. /**
  32. * Sets the display name for the given video span id.
  33. */
  34. LocalVideo.prototype.setDisplayName = function(displayName, key) {
  35. if (!this.container) {
  36. console.warn(
  37. "Unable to set displayName - " + this.videoSpanId + " does not exist");
  38. return;
  39. }
  40. var nameSpan = $('#' + this.videoSpanId + '>span.displayname');
  41. var defaultLocalDisplayName = APP.translation.generateTranslationHTML(
  42. interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME);
  43. // If we already have a display name for this video.
  44. if (nameSpan.length > 0) {
  45. if (nameSpan.text() !== displayName) {
  46. if (displayName && displayName.length > 0)
  47. {
  48. var meHTML = APP.translation.generateTranslationHTML("me");
  49. $('#localDisplayName').html(displayName + ' (' + meHTML + ')');
  50. }
  51. else
  52. $('#localDisplayName').html(defaultLocalDisplayName);
  53. }
  54. } else {
  55. var editButton = createEditDisplayNameButton();
  56. nameSpan = document.createElement('span');
  57. nameSpan.className = 'displayname';
  58. $('#' + this.videoSpanId)[0].appendChild(nameSpan);
  59. if (displayName && displayName.length > 0) {
  60. var meHTML = APP.translation.generateTranslationHTML("me");
  61. nameSpan.innerHTML = displayName + meHTML;
  62. }
  63. else {
  64. nameSpan.innerHTML = defaultLocalDisplayName;
  65. }
  66. nameSpan.id = 'localDisplayName';
  67. this.container.appendChild(editButton);
  68. //translates popover of edit button
  69. APP.translation.translateElement($("a.displayname"));
  70. var editableText = document.createElement('input');
  71. editableText.className = 'displayname';
  72. editableText.type = 'text';
  73. editableText.id = 'editDisplayName';
  74. if (displayName && displayName.length) {
  75. editableText.value = displayName;
  76. }
  77. var defaultNickname = APP.translation.translateString(
  78. "defaultNickname", {name: "Jane Pink"});
  79. editableText.setAttribute('style', 'display:none;');
  80. editableText.setAttribute('data-18n',
  81. '[placeholder]defaultNickname');
  82. editableText.setAttribute("data-i18n-options",
  83. JSON.stringify({name: "Jane Pink"}));
  84. editableText.setAttribute("placeholder", defaultNickname);
  85. this.container.appendChild(editableText);
  86. var self = this;
  87. $('#localVideoContainer .displayname')
  88. .bind("click", function (e) {
  89. e.preventDefault();
  90. e.stopPropagation();
  91. $('#localDisplayName').hide();
  92. $('#editDisplayName').show();
  93. $('#editDisplayName').focus();
  94. $('#editDisplayName').select();
  95. $('#editDisplayName').one("focusout", function (e) {
  96. self.VideoLayout.inputDisplayNameHandler(this.value);
  97. });
  98. $('#editDisplayName').on('keydown', function (e) {
  99. if (e.keyCode === 13) {
  100. e.preventDefault();
  101. self.VideoLayout.inputDisplayNameHandler(this.value);
  102. }
  103. });
  104. });
  105. }
  106. }
  107. LocalVideo.prototype.inputDisplayNameHandler = function (name) {
  108. NicknameHandler.setNickname(name);
  109. if (!$('#localDisplayName').is(":visible")) {
  110. if (NicknameHandler.getNickname())
  111. {
  112. var meHTML = APP.translation.generateTranslationHTML("me");
  113. $('#localDisplayName').html(NicknameHandler.getNickname() + " (" + meHTML + ")");
  114. }
  115. else
  116. {
  117. var defaultHTML = APP.translation.generateTranslationHTML(
  118. interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME);
  119. $('#localDisplayName')
  120. .html(defaultHTML);
  121. }
  122. $('#localDisplayName').show();
  123. }
  124. $('#editDisplayName').hide();
  125. }
  126. LocalVideo.prototype.createConnectionIndicator = function()
  127. {
  128. if(this.connectionIndicator)
  129. return;
  130. this.connectionIndicator
  131. = new ConnectionIndicator(this, null);
  132. }
  133. LocalVideo.prototype.changeVideo = function (stream, isMuted) {
  134. var self = this;
  135. function localVideoClick(event) {
  136. event.stopPropagation();
  137. self.VideoLayout.handleVideoThumbClicked(
  138. false,
  139. APP.xmpp.myResource());
  140. }
  141. $('#localVideoContainer').click(localVideoClick);
  142. // Add hover handler
  143. $('#localVideoContainer').hover(
  144. function() {
  145. self.showDisplayName(true);
  146. },
  147. function() {
  148. if (!LargeVideo.isLargeVideoVisible()
  149. || APP.xmpp.myResource() !== LargeVideo.getResourceJid())
  150. self.showDisplayName(false);
  151. }
  152. );
  153. if(isMuted)
  154. {
  155. APP.UI.setVideoMute(true);
  156. return;
  157. }
  158. this.flipX = (stream.videoType == "screen")? false : true;
  159. var localVideo = document.createElement('video');
  160. localVideo.id = 'localVideo_' +
  161. APP.RTC.getStreamID(stream.getOriginalStream());
  162. localVideo.autoplay = true;
  163. localVideo.volume = 0; // is it required if audio is separated ?
  164. localVideo.oncontextmenu = function () { return false; };
  165. var localVideoContainer = document.getElementById('localVideoWrapper');
  166. localVideoContainer.appendChild(localVideo);
  167. var localVideoSelector = $('#' + localVideo.id);
  168. // Add click handler to both video and video wrapper elements in case
  169. // there's no video.
  170. localVideoSelector.click(localVideoClick);
  171. if (this.flipX) {
  172. localVideoSelector.addClass("flipVideoX");
  173. }
  174. // Attach WebRTC stream
  175. APP.RTC.attachMediaStream(localVideoSelector, stream.getOriginalStream());
  176. // Add stream ended handler
  177. stream.getOriginalStream().onended = function () {
  178. localVideoContainer.removeChild(localVideo);
  179. self.VideoLayout.updateRemovedVideo(APP.xmpp.myResource());
  180. };
  181. }
  182. LocalVideo.prototype.joined = function (jid) {
  183. this.peerJid = jid;
  184. this.resourceJid = Strophe.getResourceFromJid(jid);
  185. }
  186. module.exports = LocalVideo;