diff --git a/html5/verto/verto_communicator/js/3rd-party/getScreenId.js b/html5/verto/verto_communicator/js/3rd-party/getScreenId.js
index b2cfc6d3c0..5c379b7e1a 100644
--- a/html5/verto/verto_communicator/js/3rd-party/getScreenId.js
+++ b/html5/verto/verto_communicator/js/3rd-party/getScreenId.js
@@ -1,10 +1,10 @@
-// Last time updated at Sep 07, 2014, 08:32:23
+// Last time updated at Oct 24, 2015, 08:32:23
// Latest file can be found here: https://cdn.webrtc-experiment.com/getScreenId.js
// Muaz Khan - www.MuazKhan.com
// MIT License - www.WebRTC-Experiment.com/licence
-// Documentation - https://github.com/muaz-khan/WebRTC-Experiment/tree/master/getScreenId.js
+// Documentation - https://github.com/muaz-khan/getScreenId.
// ______________
// getScreenId.js
@@ -13,7 +13,7 @@
getScreenId(function (error, sourceId, screen_constraints) {
// error == null || 'permission-denied' || 'not-installed' || 'installed-disabled' || 'not-chrome'
// sourceId == null || 'string' || 'firefox'
-
+
if(sourceId == 'firefox') {
navigator.mozGetUserMedia(screen_constraints, onSuccess, onFailure);
}
@@ -79,6 +79,11 @@ getScreenId(function (error, sourceId, screen_constraints) {
}
function postMessage() {
+ if (!iframe) {
+ loadIFrame(postMessage);
+ return;
+ }
+
if (!iframe.isLoaded) {
setTimeout(postMessage, 100);
return;
@@ -89,11 +94,137 @@ getScreenId(function (error, sourceId, screen_constraints) {
}, '*');
}
- var iframe = document.createElement('iframe');
- iframe.onload = function() {
- iframe.isLoaded = true;
+ function loadIFrame(loadCallback) {
+ if (iframe) {
+ loadCallback();
+ return;
+ }
+
+ iframe = document.createElement('iframe');
+ iframe.onload = function() {
+ iframe.isLoaded = true;
+
+ loadCallback();
+ };
+ iframe.src = 'https://www.webrtc-experiment.com/getSourceId/'; // https://wwww.yourdomain.com/getScreenId.html
+ iframe.style.display = 'none';
+ (document.body || document.documentElement).appendChild(iframe);
+ }
+
+ var iframe;
+
+ // this function is used in v3.0
+ window.getScreenConstraints = function(callback) {
+ loadIFrame(function() {
+ getScreenId(function(error, sourceId, screen_constraints) {
+ callback(error, screen_constraints.video);
+ });
+ });
+ };
+})();
+
+(function() {
+ if(document.domain.indexOf('webrtc-experiment.com') === -1) {
+ return;
+ }
+
+ window.getScreenId = function(callback) {
+ // for Firefox:
+ // sourceId == 'firefox'
+ // screen_constraints = {...}
+ if (!!navigator.mozGetUserMedia) {
+ callback(null, 'firefox', {
+ video: {
+ mozMediaSource: 'window',
+ mediaSource: 'window'
+ }
+ });
+ return;
+ }
+
+ postMessage();
+
+ window.addEventListener('message', onIFrameCallback);
+
+ function onIFrameCallback(event) {
+ if (!event.data) return;
+
+ if (event.data.chromeMediaSourceId) {
+ if (event.data.chromeMediaSourceId === 'PermissionDeniedError') {
+ callback('permission-denied');
+ } else callback(null, event.data.chromeMediaSourceId, getScreenConstraints(null, event.data.chromeMediaSourceId));
+ }
+
+ if (event.data.chromeExtensionStatus) {
+ callback(event.data.chromeExtensionStatus, null, getScreenConstraints(event.data.chromeExtensionStatus));
+ }
+
+ // this event listener is no more needed
+ window.removeEventListener('message', onIFrameCallback);
+ }
+ };
+
+ function getScreenConstraints(error, sourceId) {
+ var screen_constraints = {
+ audio: false,
+ video: {
+ mandatory: {
+ chromeMediaSource: error ? 'screen' : 'desktop',
+ maxWidth: window.screen.width > 1920 ? window.screen.width : 1920,
+ maxHeight: window.screen.height > 1080 ? window.screen.height : 1080
+ },
+ optional: []
+ }
+ };
+
+ if (sourceId) {
+ screen_constraints.video.mandatory.chromeMediaSourceId = sourceId;
+ }
+
+ return screen_constraints;
+ }
+
+ function postMessage() {
+ if (!iframe) {
+ loadIFrame(postMessage);
+ return;
+ }
+
+ if (!iframe.isLoaded) {
+ setTimeout(postMessage, 100);
+ return;
+ }
+
+ iframe.contentWindow.postMessage({
+ captureSourceId: true
+ }, '*');
+ }
+
+ function loadIFrame(loadCallback) {
+ if (iframe) {
+ loadCallback();
+ return;
+ }
+
+ iframe = document.createElement('iframe');
+ iframe.onload = function() {
+ iframe.isLoaded = true;
+
+ loadCallback();
+ };
+ iframe.src = 'https://www.webrtc-experiment.com/getSourceId/'; // https://wwww.yourdomain.com/getScreenId.html
+ iframe.style.display = 'none';
+ (document.body || document.documentElement).appendChild(iframe);
+ }
+
+ var iframe;
+
+ // this function is used in v3.0
+ window.getScreenConstraints = function(callback) {
+ loadIFrame(function() {
+ getScreenId(function(error, sourceId, screen_constraints) {
+ callback(error, screen_constraints.video);
+ });
+ });
};
- iframe.src = 'https://www.webrtc-experiment.com/getSourceId/';
- iframe.style.display = 'none';
- (document.body || document.documentElement).appendChild(iframe);
})();
diff --git a/html5/verto/verto_communicator/src/vertoControllers/controllers/InCallController.js b/html5/verto/verto_communicator/src/vertoControllers/controllers/InCallController.js
index 84d8894b28..b3a1870963 100644
--- a/html5/verto/verto_communicator/src/vertoControllers/controllers/InCallController.js
+++ b/html5/verto/verto_communicator/src/vertoControllers/controllers/InCallController.js
@@ -19,7 +19,7 @@
if (storage.data.videoCall) {
$scope.callTemplate = 'partials/video_call.html';
}
-
+
$rootScope.$on('call.conference', function(event, data) {
$timeout(function() {
if($scope.chatStatus) {
@@ -75,9 +75,31 @@
verto.data.conf.setVideoLayout(layout);
};
+
+ $scope.screenshare = function() {
+ if(verto.data.shareCall) {
+ verto.screenshareHangup();
+ return false;
+ }
+ verto.screenshare(storage.data.called_number);
+ };
+
$scope.muteMic = verto.muteMic;
$scope.muteVideo = verto.muteVideo;
+ $scope.$on('ScreenShareExtensionStatus', function(error) {
+ switch(error) {
+ case 'permission-denied':
+ toastr.info('Please allow the plugin in order to use Screen Share', 'Error'); break;
+ case 'not-installed':
+ toastr.warning('Please install the plugin in order to use Screen Share', 'Warning'); break;
+ case 'installed-disabled':
+ toastr.info('Please enable the plugin in order to use Screen Share', 'Error'); break;
+ // case 'not-chrome'
+ // toastr.info('Please allow the plugin in order to use Screen Share', 'Error');
+ }
+ });
+
$timeout(function() {
console.log('broadcast time-start incall');
$scope.$broadcast('timer-start');
diff --git a/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js b/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js
index b34aad8631..571558c780 100644
--- a/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js
+++ b/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js
@@ -24,13 +24,13 @@
* @type {string}
*/
$rootScope.dialpadNumber = '';
-
+
// If verto is not connected, redirects to login page.
if (!verto.data.connected) {
console.debug('MainController: WebSocket not connected. Redirecting to login.');
$location.path('/');
}
-
+
$rootScope.$on('config.http.success', function(ev) {
$scope.login(false);
});
@@ -58,7 +58,7 @@
}
});
};
-
+
verto.data.connecting = true;
verto.connect(connectCallback);
};
@@ -135,7 +135,7 @@
templateUrl: templateUrl,
controller: controller,
};
-
+
angular.extend(options, _options);
var modalInstance = $modal.open(options);
@@ -154,7 +154,7 @@
jQuery.material.init();
}
);
-
+
return modalInstance;
};
@@ -454,14 +454,6 @@
$scope.incomingCall = false;
};
- $scope.screenshare = function() {
- if (verto.data.shareCall) {
- verto.screenshareHangup();
- return false;
- }
- verto.screenshare(storage.data.called_number);
- };
-
$scope.play = function() {
var file = $scope.promptInput('Please, enter filename', '', 'File',
function(file) {
diff --git a/html5/verto/verto_communicator/src/vertoService/services/vertoService.js b/html5/verto/verto_communicator/src/vertoService/services/vertoService.js
index 26c13c6fc1..71b823fb29 100644
--- a/html5/verto/verto_communicator/src/vertoService/services/vertoService.js
+++ b/html5/verto/verto_communicator/src/vertoService/services/vertoService.js
@@ -169,7 +169,7 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
var height = res[1];
if(resolution.width == width && resolution.height == height) {
- videoQuality.push(resolution);
+ videoQuality.push(resolution);
}
});
});
@@ -200,9 +200,9 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
refreshDevicesCallback : function refreshDevicesCallback(callback) {
data.videoDevices = [{
- id: 'none',
- label: 'No Camera'
- }];
+ id: 'none',
+ label: 'No Camera'
+ }];
data.shareDevices = [{
id: 'screen',
label: 'Screen'
@@ -556,10 +556,10 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
// Checking if we have a failed connection attempt before
// connecting again.
if (data.instance && !data.instance.rpcClient.socketReady()) {
- clearTimeout(data.instance.rpcClient.to);
- data.instance.logout();
- data.instance.login();
- return;
+ clearTimeout(data.instance.rpcClient.to);
+ data.instance.logout();
+ data.instance.login();
+ return;
};
data.instance = new jQuery.verto({
login: data.login + '@' + data.hostname,
@@ -583,22 +583,22 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
jQuery.verto.unloadJobs.push(function() {
that.reloaded = true;
});
- data.instance.deviceParams({
- useCamera: storage.data.selectedVideo,
- useMic: storage.data.selectedAudio,
- onResCheck: that.refreshVideoResolution
- });
+ data.instance.deviceParams({
+ useCamera: storage.data.selectedVideo,
+ useMic: storage.data.selectedAudio,
+ onResCheck: that.refreshVideoResolution
+ });
}
if (data.mediaPerm) {
ourBootstrap();
} else {
- $.FSRTC.checkPerms(ourBootstrap, true, true);
+ $.FSRTC.checkPerms(ourBootstrap, true, true);
}
},
mediaPerm: function(callback) {
- $.FSRTC.checkPerms(callback, true, true);
+ $.FSRTC.checkPerms(callback, true, true);
},
/**
@@ -681,6 +681,12 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
var that = this;
getScreenId(function(error, sourceId, screen_constraints) {
+
+ if(error) {
+ $rootScope.$emit('ScreenShareExtensionStatus', error);
+ return;
+ }
+
var call = data.instance.newCall({
destination_number: destination + '-screen',
caller_id_name: data.name + ' (Screen)',
@@ -698,6 +704,24 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
}
});
+
+ call.rtc.options.callbacks.onStream = function(rtc, stream) {
+ if(stream) {
+ var StreamTrack = stream.getVideoTracks()[0];
+ StreamTrack.addEventListener('ended', stopSharing);
+ // (stream.getVideoTracks()[0]).onended = stopSharing;
+ }
+
+ console.log("stream started");
+
+ function stopSharing() {
+ if(that.data.shareCall) {
+ that.screenshareHangup();
+ console.log("screenshare ended");
+ }
+ }
+ };
+
data.shareCall = call;
console.log('shareCall', data);