Merge branch 'master' into ssfocus
Conflicts: index.html muc.js videolayout.js
This commit is contained in:
commit
b035bfc9aa
64
app.js
64
app.js
|
@ -10,7 +10,7 @@ var focusJid = null;
|
|||
var roomUrl = null;
|
||||
var roomName = null;
|
||||
var ssrc2jid = {};
|
||||
var mediaStreams = [];
|
||||
var mediaStreams = {};
|
||||
var bridgeIsDown = false;
|
||||
|
||||
/**
|
||||
|
@ -108,9 +108,16 @@ function connect(jid, password) {
|
|||
localVideo = connection.jingle.localVideo;
|
||||
}
|
||||
connection = new Strophe.Connection(document.getElementById('boshURL').value || config.bosh || '/http-bind');
|
||||
|
||||
if (nickname) {
|
||||
connection.emuc.addDisplayNameToPresence(nickname);
|
||||
|
||||
var email = SettingsMenu.getEmail();
|
||||
var displayName = SettingsMenu.getDisplayName();
|
||||
if(email) {
|
||||
connection.emuc.addEmailToPresence(email);
|
||||
} else {
|
||||
connection.emuc.addUserIdToPresence(SettingsMenu.getUID());
|
||||
}
|
||||
if(displayName) {
|
||||
connection.emuc.addDisplayNameToPresence(displayName);
|
||||
}
|
||||
|
||||
if (connection.disco) {
|
||||
|
@ -355,7 +362,12 @@ function waitForPresence(data, sid) {
|
|||
// NOTE(gp) now that we have simulcast, a media stream can have more than 1
|
||||
// ssrc. We should probably take that into account in our MediaStream
|
||||
// wrapper.
|
||||
mediaStreams.push(new MediaStream(data, sid, thessrc));
|
||||
var mediaStream = new MediaStream(data, sid, thessrc);
|
||||
var jid = data.peerjid || connection.emuc.myroomjid;
|
||||
if(!mediaStreams[jid]) {
|
||||
mediaStreams[jid] = {};
|
||||
}
|
||||
mediaStreams[jid][mediaStream.type] = mediaStream;
|
||||
|
||||
var container;
|
||||
var remotes = document.getElementById('remoteVideos');
|
||||
|
@ -392,6 +404,8 @@ function waitForPresence(data, sid) {
|
|||
data.stream,
|
||||
data.peerjid,
|
||||
thessrc);
|
||||
if(isVideo && container.id !== 'mixedstream')
|
||||
videoSrcToSsrc[$(container).find('>video')[0].src] = thessrc;
|
||||
}
|
||||
|
||||
// an attempt to work around https://github.com/jitsi/jitmeet/issues/32
|
||||
|
@ -691,7 +705,7 @@ $(document).bind('joined.muc', function (event, jid, info) {
|
|||
);
|
||||
|
||||
// Add myself to the contact list.
|
||||
ContactList.addContact(jid);
|
||||
ContactList.addContact(jid, SettingsMenu.getEmail() || SettingsMenu.getUID());
|
||||
|
||||
// Once we've joined the muc show the toolbar
|
||||
ToolbarToggler.showToolbar();
|
||||
|
@ -718,7 +732,12 @@ $(document).bind('entered.muc', function (event, jid, info, pres) {
|
|||
}
|
||||
|
||||
// Add Peer's container
|
||||
VideoLayout.ensurePeerContainerExists(jid);
|
||||
var id = $(pres).find('>userID').text();
|
||||
var email = $(pres).find('>email');
|
||||
if(email.length > 0) {
|
||||
id = email.text();
|
||||
}
|
||||
VideoLayout.ensurePeerContainerExists(jid,id);
|
||||
|
||||
if(APIConnector.isEnabled() && APIConnector.isEventEnabled("participantJoined"))
|
||||
{
|
||||
|
@ -845,6 +864,13 @@ $(document).bind('presence.muc', function (event, jid, info, pres) {
|
|||
"Jitsi Videobridge is currently unavailable. Please try again later!");
|
||||
}
|
||||
|
||||
var id = $(pres).find('>userID').text();
|
||||
var email = $(pres).find('>email');
|
||||
if(email.length > 0) {
|
||||
id = email.text();
|
||||
}
|
||||
Avatar.setUserAvatar(jid, id);
|
||||
|
||||
});
|
||||
|
||||
$(document).bind('presence.status.muc', function (event, jid, info, pres) {
|
||||
|
@ -1310,15 +1336,20 @@ $(document).ready(function () {
|
|||
"showMethod": "fadeIn",
|
||||
"hideMethod": "fadeOut",
|
||||
"reposition": function() {
|
||||
if(Chat.isVisible() || ContactList.isVisible()) {
|
||||
$("#toast-container").addClass("toast-bottom-right-center");
|
||||
if(PanelToggler.isVisible()) {
|
||||
$("#toast-container").addClass("notification-bottom-right-center");
|
||||
} else {
|
||||
$("#toast-container").removeClass("toast-bottom-right-center");
|
||||
$("#toast-container").removeClass("notification-bottom-right-center");
|
||||
}
|
||||
},
|
||||
"newestOnTop": false
|
||||
}
|
||||
};
|
||||
|
||||
$('#settingsmenu>input').keyup(function(event){
|
||||
if(event.keyCode === 13) {//enter
|
||||
SettingsMenu.update();
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
|
@ -1617,3 +1648,14 @@ function hangup() {
|
|||
);
|
||||
|
||||
}
|
||||
|
||||
$(document).on('videomuted.muc', function(event, jid, value) {
|
||||
if(mediaStreams[jid] && mediaStreams[jid][MediaStream.VIDEO_TYPE]) {
|
||||
var stream = mediaStreams[jid][MediaStream.VIDEO_TYPE];
|
||||
var isMuted = (value === "true");
|
||||
if (isMuted != stream.muted) {
|
||||
stream.muted = isMuted;
|
||||
Avatar.showUserAvatar(jid, isMuted);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -0,0 +1,150 @@
|
|||
var Avatar = (function(my) {
|
||||
var users = {};
|
||||
var activeSpeakerJid;
|
||||
/**
|
||||
* Sets the user's avatar in the settings menu(if local user), contact list
|
||||
* and thumbnail
|
||||
* @param jid jid of the user
|
||||
* @param id email or userID to be used as a hash
|
||||
*/
|
||||
my.setUserAvatar = function(jid, id) {
|
||||
if(id) {
|
||||
if(users[jid] === id) {
|
||||
return;
|
||||
}
|
||||
users[jid] = id;
|
||||
}
|
||||
var url = getGravatarUrl(users[jid] || jid);
|
||||
var resourceJid = Strophe.getResourceFromJid(jid);
|
||||
var thumbnail = $('#participant_' + resourceJid);
|
||||
var avatar = $('#avatar_' + resourceJid);
|
||||
|
||||
// set the avatar in the settings menu if it is local user and get the
|
||||
// local video container
|
||||
if(jid === connection.emuc.myroomjid) {
|
||||
$('#avatar').get(0).src = url;
|
||||
thumbnail = $('#localVideoContainer');
|
||||
}
|
||||
|
||||
// set the avatar in the contact list
|
||||
var contact = $('#' + resourceJid + '>img');
|
||||
if(contact && contact.length > 0) {
|
||||
contact.get(0).src = url;
|
||||
}
|
||||
|
||||
// set the avatar in the thumbnail
|
||||
if(avatar && avatar.length > 0) {
|
||||
avatar[0].src = url;
|
||||
} else {
|
||||
if (thumbnail && thumbnail.length > 0) {
|
||||
avatar = document.createElement('img');
|
||||
avatar.id = 'avatar_' + resourceJid;
|
||||
avatar.className = 'userAvatar';
|
||||
avatar.src = url;
|
||||
thumbnail.append(avatar);
|
||||
}
|
||||
}
|
||||
|
||||
//if the user is the current active speaker - update the active speaker
|
||||
// avatar
|
||||
if(jid === activeSpeakerJid) {
|
||||
Avatar.updateActiveSpeakerAvatarSrc(jid);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Hides or shows the user's avatar
|
||||
* @param jid jid of the user
|
||||
* @param show whether we should show the avatar or not
|
||||
* video because there is no dominant speaker and no focused speaker
|
||||
*/
|
||||
my.showUserAvatar = function(jid, show) {
|
||||
if(users[jid]) {
|
||||
var resourceJid = Strophe.getResourceFromJid(jid);
|
||||
var video = $('#participant_' + resourceJid + '>video');
|
||||
var avatar = $('#avatar_' + resourceJid);
|
||||
|
||||
if(jid === connection.emuc.myroomjid) {
|
||||
video = $('#localVideoWrapper>video');
|
||||
}
|
||||
if(show === undefined || show === null) {
|
||||
show = isUserMuted(jid);
|
||||
}
|
||||
|
||||
//if the user is the currently focused, the dominant speaker or if
|
||||
//there is no focused and no dominant speaker
|
||||
if (activeSpeakerJid === jid) {
|
||||
setVisibility($("#largeVideo"), !show);
|
||||
setVisibility($('#activeSpeakerAvatar'), show);
|
||||
setVisibility(avatar, false);
|
||||
setVisibility(video, false);
|
||||
} else {
|
||||
if (video && video.length > 0) {
|
||||
setVisibility(video, !show);
|
||||
setVisibility(avatar, show);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates the src of the active speaker avatar
|
||||
* @param jid of the current active speaker
|
||||
*/
|
||||
my.updateActiveSpeakerAvatarSrc = function(jid) {
|
||||
if(!jid) {
|
||||
if (focusedVideoSrc) {
|
||||
jid = getJidFromVideoSrc(focusedVideoSrc);
|
||||
} else {
|
||||
jid = connection.emuc.findJidFromResource(
|
||||
VideoLayout.getDominantSpeakerResourceJid());
|
||||
}
|
||||
}
|
||||
var avatar = $("#activeSpeakerAvatar")[0];
|
||||
var url = getGravatarUrl(users[jid],
|
||||
interfaceConfig.ACTIVE_SPEAKER_AVATAR_SIZE);
|
||||
if(jid === activeSpeakerJid && avatar.src === url) {
|
||||
return;
|
||||
}
|
||||
activeSpeakerJid = jid;
|
||||
var isMuted = isUserMuted(jid);
|
||||
if(jid && isMuted !== null) {
|
||||
avatar.src = url;
|
||||
setVisibility($("#largeVideo"), !isMuted);
|
||||
Avatar.showUserAvatar(jid, isMuted);
|
||||
}
|
||||
};
|
||||
|
||||
function setVisibility(selector, show) {
|
||||
if (selector && selector.length > 0) {
|
||||
selector.css("visibility", show ? "visible" : "hidden");
|
||||
}
|
||||
}
|
||||
|
||||
function isUserMuted(jid) {
|
||||
// XXX(gp) we may want to rename this method to something like
|
||||
// isUserStreaming, for example.
|
||||
if (jid && jid != connection.emuc.myroomjid) {
|
||||
var resource = Strophe.getResourceFromJid(jid);
|
||||
if (!VideoLayout.isInLastN(resource)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mediaStreams[jid] || !mediaStreams[jid][MediaStream.VIDEO_TYPE]) {
|
||||
return null;
|
||||
}
|
||||
return mediaStreams[jid][MediaStream.VIDEO_TYPE].muted;
|
||||
}
|
||||
|
||||
function getGravatarUrl(id, size) {
|
||||
if(id === connection.emuc.myroomjid || !id) {
|
||||
id = SettingsMenu.getUID();
|
||||
}
|
||||
return 'https://www.gravatar.com/avatar/' +
|
||||
MD5.hexdigest(id.trim().toLowerCase()) +
|
||||
"?d=retro&size=" + (size || "30");
|
||||
}
|
||||
|
||||
return my;
|
||||
}(Avatar || {}));
|
|
@ -1,30 +1,10 @@
|
|||
var BottomToolbar = (function (my) {
|
||||
my.toggleChat = function() {
|
||||
if (ContactList.isVisible()) {
|
||||
buttonClick("#contactListButton", "active");
|
||||
$('#contactlist').css('z-index', 4);
|
||||
setTimeout(function() {
|
||||
$('#contactlist').css('display', 'none');
|
||||
$('#contactlist').css('z-index', 5);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
Chat.toggleChat();
|
||||
|
||||
buttonClick("#chatBottomButton", "active");
|
||||
PanelToggler.toggleChat();
|
||||
};
|
||||
|
||||
my.toggleContactList = function() {
|
||||
if (Chat.isVisible()) {
|
||||
buttonClick("#chatBottomButton", "active");
|
||||
setTimeout(function() {
|
||||
$('#chatspace').css('display', 'none');
|
||||
}, 500);
|
||||
}
|
||||
|
||||
buttonClick("#contactListButton", "active");
|
||||
|
||||
ContactList.toggleContactList();
|
||||
PanelToggler.toggleContactList();
|
||||
};
|
||||
|
||||
my.toggleFilmStrip = function() {
|
||||
|
|
142
chat.js
142
chat.js
|
@ -57,7 +57,7 @@ var Chat = (function (my) {
|
|||
|
||||
var onTextAreaResize = function () {
|
||||
resizeChatConversation();
|
||||
scrollChatToBottom();
|
||||
Chat.scrollChatToBottom();
|
||||
};
|
||||
$('#usermsg').autosize({callback: onTextAreaResize});
|
||||
|
||||
|
@ -144,112 +144,7 @@ var Chat = (function (my) {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Opens / closes the chat area.
|
||||
*/
|
||||
my.toggleChat = function () {
|
||||
var chatspace = $('#chatspace');
|
||||
var videospace = $('#videospace');
|
||||
|
||||
var chatSize = (Chat.isVisible()) ? [0, 0] : Chat.getChatSize();
|
||||
var videospaceWidth = window.innerWidth - chatSize[0];
|
||||
var videospaceHeight = window.innerHeight;
|
||||
var videoSize
|
||||
= getVideoSize(null, null, videospaceWidth, videospaceHeight);
|
||||
var videoWidth = videoSize[0];
|
||||
var videoHeight = videoSize[1];
|
||||
var videoPosition = getVideoPosition(videoWidth,
|
||||
videoHeight,
|
||||
videospaceWidth,
|
||||
videospaceHeight);
|
||||
var horizontalIndent = videoPosition[0];
|
||||
var verticalIndent = videoPosition[1];
|
||||
|
||||
var thumbnailSize = VideoLayout.calculateThumbnailSize(videospaceWidth);
|
||||
var thumbnailsWidth = thumbnailSize[0];
|
||||
var thumbnailsHeight = thumbnailSize[1];
|
||||
var completeFunction = Chat.isVisible() ?
|
||||
function() {} : function () {
|
||||
scrollChatToBottom();
|
||||
chatspace.trigger('shown');
|
||||
};
|
||||
|
||||
videospace.animate({right: chatSize[0],
|
||||
width: videospaceWidth,
|
||||
height: videospaceHeight},
|
||||
{queue: false,
|
||||
duration: 500,
|
||||
complete: completeFunction});
|
||||
|
||||
$('#remoteVideos').animate({height: thumbnailsHeight},
|
||||
{queue: false,
|
||||
duration: 500});
|
||||
|
||||
$('#remoteVideos>span').animate({height: thumbnailsHeight,
|
||||
width: thumbnailsWidth},
|
||||
{queue: false,
|
||||
duration: 500,
|
||||
complete: function() {
|
||||
$(document).trigger(
|
||||
"remotevideo.resized",
|
||||
[thumbnailsWidth,
|
||||
thumbnailsHeight]);
|
||||
}});
|
||||
|
||||
$('#largeVideoContainer').animate({ width: videospaceWidth,
|
||||
height: videospaceHeight},
|
||||
{queue: false,
|
||||
duration: 500
|
||||
});
|
||||
|
||||
$('#largeVideo').animate({ width: videoWidth,
|
||||
height: videoHeight,
|
||||
top: verticalIndent,
|
||||
bottom: verticalIndent,
|
||||
left: horizontalIndent,
|
||||
right: horizontalIndent},
|
||||
{ queue: false,
|
||||
duration: 500
|
||||
}
|
||||
);
|
||||
|
||||
if (Chat.isVisible()) {
|
||||
$("#toast-container").animate({right: '5px'},
|
||||
{queue: false,
|
||||
duration: 500});
|
||||
chatspace.hide("slide", { direction: "right",
|
||||
queue: false,
|
||||
duration: 500});
|
||||
|
||||
}
|
||||
else {
|
||||
// Undock the toolbar when the chat is shown and if we're in a
|
||||
// video mode.
|
||||
if (VideoLayout.isLargeVideoVisible()) {
|
||||
ToolbarToggler.dockToolbar(false);
|
||||
}
|
||||
|
||||
|
||||
$("#toast-container").animate({right: (chatSize[0] + 5) + 'px'},
|
||||
{queue: false,
|
||||
duration: 500});
|
||||
chatspace.show("slide", { direction: "right",
|
||||
queue: false,
|
||||
duration: 500,
|
||||
complete: function () {
|
||||
// Request the focus in the nickname field or the chat input field.
|
||||
if ($('#nickname').css('visibility') === 'visible') {
|
||||
$('#nickinput').focus();
|
||||
} else {
|
||||
$('#usermsg').focus();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Chat.resizeChat();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the chat conversation mode.
|
||||
|
@ -268,7 +163,7 @@ var Chat = (function (my) {
|
|||
* Resizes the chat area.
|
||||
*/
|
||||
my.resizeChat = function () {
|
||||
var chatSize = Chat.getChatSize();
|
||||
var chatSize = PanelToggler.getPanelSize();
|
||||
|
||||
$('#chatspace').width(chatSize[0]);
|
||||
$('#chatspace').height(chatSize[1]);
|
||||
|
@ -276,20 +171,6 @@ var Chat = (function (my) {
|
|||
resizeChatConversation();
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the size of the chat.
|
||||
*/
|
||||
my.getChatSize = function () {
|
||||
var availableHeight = window.innerHeight;
|
||||
var availableWidth = window.innerWidth;
|
||||
|
||||
var chatWidth = 200;
|
||||
if (availableWidth * 0.2 < 200)
|
||||
chatWidth = availableWidth * 0.2;
|
||||
|
||||
return [chatWidth, availableHeight];
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates if the chat is currently visible.
|
||||
*/
|
||||
|
@ -309,6 +190,16 @@ var Chat = (function (my) {
|
|||
$('#usermsg').focus();
|
||||
};
|
||||
|
||||
/**
|
||||
* Scrolls chat to the bottom.
|
||||
*/
|
||||
my.scrollChatToBottom = function() {
|
||||
setTimeout(function () {
|
||||
$('#chatconversation').scrollTop(
|
||||
$('#chatconversation')[0].scrollHeight);
|
||||
}, 5);
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds the smileys container to the chat
|
||||
*/
|
||||
|
@ -426,15 +317,6 @@ var Chat = (function (my) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scrolls chat to the bottom.
|
||||
*/
|
||||
function scrollChatToBottom() {
|
||||
setTimeout(function () {
|
||||
$('#chatconversation').scrollTop(
|
||||
$('#chatconversation')[0].scrollHeight);
|
||||
}, 5);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current time in the format it is shown to the user
|
||||
|
|
194
contact_list.js
194
contact_list.js
|
@ -20,22 +20,24 @@ var ContactList = (function (my) {
|
|||
* Adds a contact for the given peerJid if such doesn't yet exist.
|
||||
*
|
||||
* @param peerJid the peerJid corresponding to the contact
|
||||
* @param id the user's email or userId used to get the user's avatar
|
||||
*/
|
||||
my.ensureAddContact = function(peerJid) {
|
||||
my.ensureAddContact = function(peerJid, id) {
|
||||
var resourceJid = Strophe.getResourceFromJid(peerJid);
|
||||
|
||||
var contact = $('#contactlist>ul>li[id="' + resourceJid + '"]');
|
||||
|
||||
if (!contact || contact.length <= 0)
|
||||
ContactList.addContact(peerJid);
|
||||
ContactList.addContact(peerJid,id);
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds a contact for the given peer jid.
|
||||
*
|
||||
* @param peerJid the jid of the contact to add
|
||||
* @param id the email or userId of the user
|
||||
*/
|
||||
my.addContact = function(peerJid) {
|
||||
my.addContact = function(peerJid, id) {
|
||||
var resourceJid = Strophe.getResourceFromJid(peerJid);
|
||||
|
||||
var contactlist = $('#contactlist>ul');
|
||||
|
@ -51,7 +53,7 @@ var ContactList = (function (my) {
|
|||
}
|
||||
};
|
||||
|
||||
newContact.appendChild(createAvatar());
|
||||
newContact.appendChild(createAvatar(id));
|
||||
newContact.appendChild(createDisplayNameParagraph("Participant"));
|
||||
|
||||
var clElement = contactlist.get(0);
|
||||
|
@ -87,145 +89,7 @@ var ContactList = (function (my) {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Opens / closes the contact list area.
|
||||
*/
|
||||
my.toggleContactList = function () {
|
||||
var contactlist = $('#contactlist');
|
||||
var videospace = $('#videospace');
|
||||
|
||||
var chatSize = (ContactList.isVisible()) ? [0, 0] : Chat.getChatSize();
|
||||
var videospaceWidth = window.innerWidth - chatSize[0];
|
||||
var videospaceHeight = window.innerHeight;
|
||||
var videoSize
|
||||
= getVideoSize(null, null, videospaceWidth, videospaceHeight);
|
||||
var videoWidth = videoSize[0];
|
||||
var videoHeight = videoSize[1];
|
||||
var videoPosition = getVideoPosition(videoWidth,
|
||||
videoHeight,
|
||||
videospaceWidth,
|
||||
videospaceHeight);
|
||||
var horizontalIndent = videoPosition[0];
|
||||
var verticalIndent = videoPosition[1];
|
||||
|
||||
var thumbnailSize = VideoLayout.calculateThumbnailSize(videospaceWidth);
|
||||
var thumbnailsWidth = thumbnailSize[0];
|
||||
var thumbnailsHeight = thumbnailSize[1];
|
||||
var completeFunction = ContactList.isVisible() ?
|
||||
function() {} : function () { contactlist.trigger('shown');};
|
||||
|
||||
videospace.animate({right: chatSize[0],
|
||||
width: videospaceWidth,
|
||||
height: videospaceHeight},
|
||||
{queue: false,
|
||||
duration: 500,
|
||||
complete: completeFunction
|
||||
});
|
||||
|
||||
$('#remoteVideos').animate({height: thumbnailsHeight},
|
||||
{queue: false,
|
||||
duration: 500});
|
||||
|
||||
$('#remoteVideos>span').animate({height: thumbnailsHeight,
|
||||
width: thumbnailsWidth},
|
||||
{queue: false,
|
||||
duration: 500,
|
||||
complete: function() {
|
||||
$(document).trigger(
|
||||
"remotevideo.resized",
|
||||
[thumbnailsWidth,
|
||||
thumbnailsHeight]);
|
||||
}});
|
||||
|
||||
$('#largeVideoContainer').animate({ width: videospaceWidth,
|
||||
height: videospaceHeight},
|
||||
{queue: false,
|
||||
duration: 500
|
||||
});
|
||||
|
||||
$('#largeVideo').animate({ width: videoWidth,
|
||||
height: videoHeight,
|
||||
top: verticalIndent,
|
||||
bottom: verticalIndent,
|
||||
left: horizontalIndent,
|
||||
right: horizontalIndent},
|
||||
{ queue: false,
|
||||
duration: 500
|
||||
});
|
||||
|
||||
if (ContactList.isVisible()) {
|
||||
$("#toast-container").animate({right: '12px'},
|
||||
{queue: false,
|
||||
duration: 500});
|
||||
$('#contactlist').hide("slide", { direction: "right",
|
||||
queue: false,
|
||||
duration: 500});
|
||||
} else {
|
||||
// Undock the toolbar when the chat is shown and if we're in a
|
||||
// video mode.
|
||||
if (VideoLayout.isLargeVideoVisible())
|
||||
ToolbarToggler.dockToolbar(false);
|
||||
|
||||
|
||||
$("#toast-container").animate({right: '212px'},
|
||||
{queue: false,
|
||||
duration: 500});
|
||||
$('#contactlist').show("slide", { direction: "right",
|
||||
queue: false,
|
||||
duration: 500});
|
||||
|
||||
//stop the glowing of the contact list icon
|
||||
setVisualNotification(false);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates the number of participants in the contact list button and sets
|
||||
* the glow
|
||||
* @param delta indicates whether a new user has joined (1) or someone has
|
||||
* left(-1)
|
||||
*/
|
||||
function updateNumberOfParticipants(delta) {
|
||||
//when the user is alone we don't show the number of participants
|
||||
if(numberOfContacts === 0) {
|
||||
$("#numberOfParticipants").text('');
|
||||
numberOfContacts += delta;
|
||||
} else if(numberOfContacts !== 0 && !ContactList.isVisible()) {
|
||||
setVisualNotification(true);
|
||||
numberOfContacts += delta;
|
||||
$("#numberOfParticipants").text(numberOfContacts);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates the avatar element.
|
||||
*
|
||||
* @return the newly created avatar element
|
||||
*/
|
||||
function createAvatar() {
|
||||
var avatar = document.createElement('i');
|
||||
avatar.className = "icon-avatar avatar";
|
||||
|
||||
return avatar;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the display name paragraph.
|
||||
*
|
||||
* @param displayName the display name to set
|
||||
*/
|
||||
function createDisplayNameParagraph(displayName) {
|
||||
var p = document.createElement('p');
|
||||
p.innerText = displayName;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows/hides a visual notification, indicating that a new user has joined
|
||||
* the conference.
|
||||
*/
|
||||
function setVisualNotification(show, stopGlowingIn) {
|
||||
my.setVisualNotification = function(show, stopGlowingIn) {
|
||||
var glower = $('#contactListButton');
|
||||
function stopGlowing() {
|
||||
window.clearInterval(notificationInterval);
|
||||
|
@ -247,8 +111,52 @@ var ContactList = (function (my) {
|
|||
if(stopGlowingIn) {
|
||||
setTimeout(stopGlowing, stopGlowingIn);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates the number of participants in the contact list button and sets
|
||||
* the glow
|
||||
* @param delta indicates whether a new user has joined (1) or someone has
|
||||
* left(-1)
|
||||
*/
|
||||
function updateNumberOfParticipants(delta) {
|
||||
//when the user is alone we don't show the number of participants
|
||||
if(numberOfContacts === 0) {
|
||||
$("#numberOfParticipants").text('');
|
||||
numberOfContacts += delta;
|
||||
} else if(numberOfContacts !== 0 && !ContactList.isVisible()) {
|
||||
ContactList.setVisualNotification(true);
|
||||
numberOfContacts += delta;
|
||||
$("#numberOfParticipants").text(numberOfContacts);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the avatar element.
|
||||
*
|
||||
* @return the newly created avatar element
|
||||
*/
|
||||
function createAvatar(id) {
|
||||
var avatar = document.createElement('img');
|
||||
avatar.className = "icon-avatar avatar";
|
||||
avatar.src = "https://www.gravatar.com/avatar/" + id + "?d=retro&size=30";
|
||||
|
||||
return avatar;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the display name paragraph.
|
||||
*
|
||||
* @param displayName the display name to set
|
||||
*/
|
||||
function createDisplayNameParagraph(displayName) {
|
||||
var p = document.createElement('p');
|
||||
p.innerText = displayName;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Indicates that the display name has changed.
|
||||
*/
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
margin-right: 10px;
|
||||
vertical-align: middle;
|
||||
font-size: 22pt;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
#contactlist .clickable {
|
||||
|
|
|
@ -112,4 +112,8 @@
|
|||
.icon-connection:before {
|
||||
line-height: normal;
|
||||
content: "\e61a";
|
||||
}
|
||||
|
||||
.icon-settings:before {
|
||||
content: "\e61b";
|
||||
}
|
|
@ -13,8 +13,7 @@ html, body{
|
|||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
#chatspace,
|
||||
#contactlist {
|
||||
.right-panel {
|
||||
display:none;
|
||||
position:absolute;
|
||||
float: right;
|
||||
|
@ -38,10 +37,6 @@ html, body{
|
|||
display:none;
|
||||
}
|
||||
|
||||
#settingsButton {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.toolbar_span {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
#settingsmenu {
|
||||
background: black;
|
||||
color: #00ccff;
|
||||
}
|
||||
|
||||
#settingsmenu input {
|
||||
margin-top: 10px;
|
||||
margin-left: 10%;
|
||||
width: 80%;
|
||||
font-size: 14px;
|
||||
background: #3a3a3a;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
color: #a7a7a7;
|
||||
}
|
||||
|
||||
#settingsmenu .arrow-up {
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 5px solid transparent;
|
||||
border-right: 5px solid transparent;
|
||||
border-bottom: 5px solid #3a3a3a;
|
||||
position: relative;
|
||||
top: 10px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
#settingsmenu button {
|
||||
width: 36%;
|
||||
left: 32%;
|
||||
padding: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
#settingsmenu #avatar {
|
||||
width: 24%;
|
||||
left: 38%;
|
||||
border-radius: 25px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#settingsmenu .icon-settings {
|
||||
padding: 34px;
|
||||
}
|
|
@ -35,7 +35,9 @@
|
|||
|
||||
#remoteVideos .videocontainer {
|
||||
display: inline-block;
|
||||
background-image:url(../images/avatar1.png);
|
||||
background-color: black;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 45;
|
||||
background-size: contain;
|
||||
border-radius:8px;
|
||||
border: 2px solid #212425;
|
||||
|
@ -115,10 +117,6 @@
|
|||
height: 100%;
|
||||
}
|
||||
|
||||
.dominantspeaker {
|
||||
background: #000 !important;
|
||||
}
|
||||
|
||||
#etherpad,
|
||||
#presentation {
|
||||
text-align: center;
|
||||
|
@ -378,3 +376,19 @@
|
|||
#mixedstream {
|
||||
display:none !important;
|
||||
}
|
||||
|
||||
#activeSpeakerAvatar {
|
||||
visibility: hidden;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
margin: auto;
|
||||
position: relative;
|
||||
border-radius: 50px;
|
||||
}
|
||||
|
||||
.userAvatar {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
left: 35px;
|
||||
border-radius: 200px;
|
||||
}
|
||||
|
|
BIN
fonts/jitsi.eot
BIN
fonts/jitsi.eot
Binary file not shown.
|
@ -34,4 +34,5 @@
|
|||
<glyph unicode="" d="M797.086 112.301c-0.059 0.163-0.119 0.328-0.16 0.485-71.399-45.638-151.782-69.931-234.023-69.931-0.013 0-0.021 0-0.028 0-122.52 0-237.501 52.772-315.469 144.741-99.778 117.698-134.252 329.954-73.022 427.789 4.004-1.662 7.875-3.233 11.68-4.773 13.585-5.511 26.413-10.716 42.305-19.096 6.063-3.202 12.338-4.812 18.673-4.812 11.714 0 22.6 5.648 29.848 15.486 7.815 10.617 10.313 24.778 6.538 36.951l-3.525 11.41c-10.687 34.59-21.723 70.354-34.211 105.078-9.983 27.765-22.399 62.327-59.226 62.327-12.057 0-26.037-3.656-46.73-12.204-44.294-18.319-71.058-29.961-114.534-49.81-15.102-6.887-25.234-22.698-25.203-39.343 0.028-15.842 8.992-29.337 23.975-36.115 18.208-8.257 30.536-13.716 43.468-19.447l10.687-4.753c-101.938-259.102 24.803-526.458 211.314-639.212 83.497-50.474 178.5-77.14 274.769-77.14h0.041c102.72 0 205.561 31.099 284.501 85.198-31.729 28.803-45.566 69.167-51.671 87.171zM1098.203 210.090c-18.113 8.577-30.356 14.258-43.221 20.244l-10.496 4.892c106.448 257.268-15.569 526.801-200.067 642.788-85.36 53.663-183.123 82.032-282.716 82.032-104.848 0-206.41-30.593-285.967-86.165l-5.385-3.764c31.597-27.564 45.86-66.788 52.917-86.41 72.926 47.94 155.675 73.409 239.895 73.409 125.407 0 242.142-54.785 320.294-150.316 97.683-119.447 128.439-332.255 65.498-429.015-3.989 1.736-7.815 3.385-11.624 4.998-13.471 5.759-26.204 11.18-41.954 19.821-6.203 3.424-12.645 5.155-19.212 5.155-11.585 0-22.399-5.558-29.69-15.267-7.813-10.434-10.478-24.432-6.966-36.515l3.279-11.301c10.096-34.845 20.531-70.857 32.412-105.842 9.588-28.238 21.514-63.382 59.179-63.382 11.843 0 25.577 3.424 45.881 11.399 44.351 17.439 71.319 28.601 115.409 47.777 15.19 6.623 25.601 22.252 25.859 38.894 0.281 15.822-8.445 29.499-23.325 36.569z" horiz-adv-x="1122" />
|
||||
<glyph unicode="" d="M46.993 961.7c461.234 0 553.793 0 1015.024 0 35.919 0 53.356-25.959 53.356-57.959-0.581-303.259-0.325-606.488-0.449-909.809 0-43.984-13.203-57.058-57.703-57.058-443.072-0.126-556.453-0.126-999.553 0-44.534 0-57.799 13.009-57.799 57.058-0.098 303.257 0.485 608.072-0.093 911.329-0.034 26.21 11.301 53.761 47.217 56.439zM311.405 450.298c0-119.045-0.072-172.168 0.057-291.249 0.036-50.043 11.208-61.050 62.12-61.050 233.352 0 137.075 0 370.522 0 47.075 0 59.249 11.982 59.249 58.095 0.126 239.111 0.126 346.338 0 585.389 0 48.138-10.687 58.991-57.768 58.991-235.323 0.101-140.844 0.101-376.157 0-47.044 0-57.93-11.043-57.966-58.89-0.129-119.109-0.057-172.209-0.057-291.287zM153.944 838.566c-74.929-0.062-66.687 5.958-66.845-66.685-0.201-63.95-7.054-63.534 62.528-63.372 72.999 0.194 67.201-3.764 67.302 67.554 0 67.722 4.087 62.595-62.985 62.502zM963.644 838.566c-71.159-0.034-65.56 6.185-65.751-65.364-0.129-67.302-4.508-64.693 64.528-64.693 73.089 0 65.299-2.031 65.299 66.238-0.003 68.646 6.956 63.911-64.076 63.818zM216.828 122.408c0.359 73.094 4.639 66.914-67.358 67.17-68.104 0.191-62.569 2.763-62.407-63.31 0.129-73.476-6.954-66.52 67.074-66.649 66.042-0.065 63.142-6.056 62.691 62.789zM1027.718 124.4c0.134 68.334 6.443 65.304-63.297 65.178-70.132-0.132-66.656 5.793-66.527-65.304 0.129-70.645-4.384-64.721 63.756-64.657 71.995 0.132 66.202-6.698 66.068 64.783zM1027.718 342.077c0 70.55 7.219 66.842-67.485 66.522-0.898 0-1.873 0-2.838 0-59.375 0-59.375 0-59.375-58.023 0-77.922-6.443-69.936 69.293-70.196 66.076-0.387 60.539-3.091 60.405 61.697zM151.307 489.873c68.295-0.163 65.815-5.568 65.624 62.982-0.194 71.128 4.895 64.917-66.014 65.010-69.905 0.101-63.813 4.704-63.885-63.978-0.062-67.431-5.7-64.463 64.275-64.014zM961.263 489.873c72.511-0.258 66.589-4.603 66.455 64.494 0 68.558 6.185 63.537-64.267 63.498-70.196-0.028-65.686 6.053-65.498-65.493 0.132-62.5 0.067-62.5 63.31-62.5zM150.399 280.38c71.004 0 66.659-6.567 66.466 64.528-0.163 63.694-0.036 63.501-65.013 63.756-70.805 0.258-64.822 2.673-64.822-63.756 0.036-69.167-5.919-64.788 63.369-64.528z" horiz-adv-x="1115" />
|
||||
<glyph unicode="" d="M3.881 146.835h220.26v-210.835h-220.26v210.835zM308.817 350.143h220.27v-414.143h-220.27v414.143zM613.764 553.412h220.268v-617.412h-220.268v617.412zM918.685 756.715h220.265v-820.715h-220.265v820.715zM1223.629 960h220.263v-1024h-220.263v1024z" horiz-adv-x="1444" />
|
||||
<glyph unicode="" d="M526.071 234.749c-28.637-30.869-56.465-60.861-84.282-90.859-51.578-55.636-103.047-111.376-154.842-166.832-7.606-8.135-15.958-16.1-25.317-22.012-28.075-17.708-58.31-18.090-88.472-6.492-59.84 23.028-80.004 90.727-59.734 139.234 5.413 12.95 13.721 23.601 23.709 33.173 70.256 67.351 140.506 134.717 210.76 202.077 15.638 14.993 31.264 29.995 47.364 45.45-9.302 9.529-18.386 18.833-27.451 28.137-12.122 12.442-13.234 20.28-5.067 35.498 4.735 8.816 4.789 8.878-2.627 16.198-20.012 19.72-40.168 39.198-63.498 55.188-27.167 18.624-57.161 24.233-89.083 19.849-53.402-7.328-91.609-38.372-121.413-81.046-12.774-18.299-15.365-40.313-17.517-61.875-3.23-32.245-2.415-64.479 2.209-96.597 1.654-11.515-3.863-16.539-13.835-11.175-8.306 4.448-16.095 11.048-22.115 18.353-15.574 18.89-22.223 42.042-27.474 65.395-12.955 57.652-8.86 114.49 12.191 169.495 32.345 84.537 79.743 159.571 145.953 221.932 13.659 12.857 176.841 180.564 202.944 207.021 7.493 7.599 14.895 7.635 22.393 0.028 43.009-43.641 85.985-87.316 128.927-131.029 8.117-8.267 8.019-15.097-0.222-23.49-26.339-26.834-52.726-53.627-79.106-80.419-6.244-6.334-97.34-82.437-73.027-128.816 22.693-25.090 46.196-49.449 69.575-73.904 1.189-1.238 4.686-1.386 6.523-0.632 3.63 1.499 6.848 3.997 10.248 6.066 9.745 5.94 19.545 4.918 27.812-3.083 11.755-11.381 23.405-22.858 35.392-34.59 4.807 4.575 9.939 9.41 15.027 14.294 27.128 26.039 54.272 52.071 81.351 78.146 16.413 15.778 18.652 28.418 11.038 49.658-10.473 29.221-14.356 59.677-13.85 90.624 1.017 61.045 20.438 115.334 61.003 161.416 32.825 37.286 72.054 64.311 121.643 74.325 35.227 7.101 69.139 4.513 100.663-14.026 6.365-3.752 11.908-9.007 17.455-14.005 3.491-3.125 3.153-6.236-0.565-9.98-42.503-42.885-84.772-86.013-127.154-129.035-12.442-12.638-12.356-23.167 0.196-35.914 40.344-40.978 80.597-82.050 120.936-123.052 10.076-10.233 19.537-10.021 29.504 0.134 43.195 44.077 86.449 88.090 129.706 132.118 1.21 1.233 2.572 2.322 5.135 4.624 5.491-5.893 11.895-10.924 15.961-17.406 19.452-30.944 22.608-64.83 17.073-100.25-14.253-91.080-97.188-175.638-197.712-190.123-39.977-5.764-79.372-2.562-118.067 9.031-5.898 1.775-11.541 4.629-17.538 5.829-12.47 2.474-23.872-0.366-32.74-9.877-30.921-33.168-61.674-66.484-92.474-99.758-0.73-0.805-1.349-1.718-0.181-1.099 8.992-10.006 17.354-20.662 27.061-29.94 81.064-77.54 164.91-151.986 250.882-224.063 9.936-8.347 10.274-15.695 1.040-25.1-42.338-43.068-84.689-86.111-127.059-129.154-9.413-9.575-16.846-9.152-25.291 1.295-76.686 94.78-156.8 186.609-239.707 276.002-1.334 1.453-2.562 3.029-4.257 5.042z" horiz-adv-x="1105" />
|
||||
</font></defs></svg>
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 33 KiB |
BIN
fonts/jitsi.ttf
BIN
fonts/jitsi.ttf
Binary file not shown.
BIN
fonts/jitsi.woff
BIN
fonts/jitsi.woff
Binary file not shown.
|
@ -1,12 +1,46 @@
|
|||
{
|
||||
"IcoMoonType": "selection",
|
||||
"icons": [
|
||||
{
|
||||
"icon": {
|
||||
"paths": [
|
||||
"M526.071 725.251c-28.637 30.869-56.465 60.861-84.282 90.859-51.578 55.636-103.047 111.376-154.842 166.832-7.606 8.135-15.958 16.1-25.317 22.012-28.075 17.708-58.31 18.090-88.472 6.492-59.84-23.028-80.004-90.727-59.734-139.234 5.413-12.95 13.721-23.601 23.709-33.173 70.256-67.351 140.506-134.717 210.76-202.077 15.638-14.993 31.264-29.995 47.364-45.45-9.302-9.529-18.386-18.833-27.451-28.137-12.122-12.442-13.234-20.28-5.067-35.498 4.735-8.816 4.789-8.878-2.627-16.198-20.012-19.72-40.168-39.198-63.498-55.188-27.167-18.624-57.161-24.233-89.083-19.849-53.402 7.328-91.609 38.372-121.413 81.046-12.774 18.299-15.365 40.313-17.517 61.875-3.23 32.245-2.415 64.479 2.209 96.597 1.654 11.515-3.863 16.539-13.835 11.175-8.306-4.448-16.095-11.048-22.115-18.353-15.574-18.89-22.223-42.042-27.474-65.395-12.955-57.652-8.86-114.49 12.191-169.495 32.345-84.537 79.743-159.571 145.953-221.932 13.659-12.857 176.841-180.564 202.944-207.021 7.493-7.599 14.895-7.635 22.393-0.028 43.009 43.641 85.985 87.316 128.927 131.029 8.117 8.267 8.019 15.097-0.222 23.49-26.339 26.834-52.726 53.627-79.106 80.419-6.244 6.334-97.34 82.437-73.027 128.816 22.693 25.090 46.196 49.449 69.575 73.904 1.189 1.238 4.686 1.386 6.523 0.632 3.63-1.499 6.848-3.997 10.248-6.066 9.745-5.94 19.545-4.918 27.812 3.083 11.755 11.381 23.405 22.858 35.392 34.59 4.807-4.575 9.939-9.41 15.027-14.294 27.128-26.039 54.272-52.071 81.351-78.146 16.413-15.778 18.652-28.418 11.038-49.658-10.473-29.221-14.356-59.677-13.85-90.624 1.017-61.045 20.438-115.334 61.003-161.416 32.825-37.286 72.054-64.311 121.643-74.325 35.227-7.101 69.139-4.513 100.663 14.026 6.365 3.752 11.908 9.007 17.455 14.005 3.491 3.125 3.153 6.236-0.565 9.98-42.503 42.885-84.772 86.013-127.154 129.035-12.442 12.638-12.356 23.167 0.196 35.914 40.344 40.978 80.597 82.050 120.936 123.052 10.076 10.233 19.537 10.021 29.504-0.134 43.195-44.077 86.449-88.090 129.706-132.118 1.21-1.233 2.572-2.322 5.135-4.624 5.491 5.893 11.895 10.924 15.961 17.406 19.452 30.944 22.608 64.83 17.073 100.25-14.253 91.080-97.188 175.638-197.712 190.123-39.977 5.764-79.372 2.562-118.067-9.031-5.898-1.775-11.541-4.629-17.538-5.829-12.47-2.474-23.872 0.366-32.74 9.877-30.921 33.168-61.674 66.484-92.474 99.758-0.73 0.805-1.349 1.718-0.181 1.099 8.992 10.006 17.354 20.662 27.061 29.94 81.064 77.54 164.91 151.986 250.882 224.063 9.936 8.347 10.274 15.695 1.040 25.1-42.338 43.068-84.689 86.111-127.059 129.154-9.413 9.575-16.846 9.152-25.291-1.295-76.686-94.78-156.8-186.609-239.707-276.002-1.334-1.453-2.562-3.029-4.257-5.042z"
|
||||
],
|
||||
"attrs": [
|
||||
{
|
||||
"opacity": 1,
|
||||
"visibility": false
|
||||
}
|
||||
],
|
||||
"width": 1105,
|
||||
"grid": 0,
|
||||
"tags": [
|
||||
"settings"
|
||||
]
|
||||
},
|
||||
"attrs": [
|
||||
{
|
||||
"opacity": 1,
|
||||
"visibility": false
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"order": 1,
|
||||
"id": 33,
|
||||
"prevSize": 32,
|
||||
"code": 58907,
|
||||
"name": "settings"
|
||||
},
|
||||
"setIdx": 0,
|
||||
"iconIdx": 0
|
||||
},
|
||||
{
|
||||
"icon": {
|
||||
"paths": [
|
||||
"M1223.129 242.783l-180.128 175.796v-217.716c0-74.673-59.512-135.496-132.599-135.496h-634.716c-73.084 0-132.596 60.823-132.596 135.496v609.237c0 74.673 59.512 135.496 132.596 135.496h634.716c73.084 0 132.599-60.82 132.599-135.496v-172.679l193.45 153.712c48.784 35.558 96.695-5.178 96.695-40.424v-483.533c-0.003-35.248-55.897-71.306-110.017-24.393zM601.169 760.065c-141.111 0-255.524-114.411-255.524-255.521s114.411-255.521 255.524-255.521c141.108 0 255.519 114.411 255.519 255.521-0 141.113-114.408 255.521-255.519 255.521z",
|
||||
"M599.045 359.751c-80.474 0-145.727 65.253-145.727 145.729 0 80.471 65.25 145.727 145.727 145.727s145.729-65.256 145.729-145.727c0-80.474-65.253-145.729-145.729-145.729z"
|
||||
],
|
||||
"width": 1334,
|
||||
"attrs": [
|
||||
{
|
||||
"opacity": 1,
|
||||
|
@ -17,11 +51,10 @@
|
|||
"visibility": false
|
||||
}
|
||||
],
|
||||
"width": 1334,
|
||||
"grid": 0,
|
||||
"tags": [
|
||||
"webCam"
|
||||
]
|
||||
],
|
||||
"grid": 0
|
||||
},
|
||||
"attrs": [
|
||||
{
|
||||
|
@ -714,7 +747,7 @@
|
|||
"ligatures": ""
|
||||
},
|
||||
"setIdx": 0,
|
||||
"iconIdx": 26
|
||||
"iconIdx": 25
|
||||
},
|
||||
{
|
||||
"icon": {
|
||||
|
@ -740,7 +773,7 @@
|
|||
"ligatures": ""
|
||||
},
|
||||
"setIdx": 0,
|
||||
"iconIdx": 27
|
||||
"iconIdx": 26
|
||||
},
|
||||
{
|
||||
"icon": {
|
||||
|
@ -765,7 +798,7 @@
|
|||
"ligatures": ""
|
||||
},
|
||||
"setIdx": 0,
|
||||
"iconIdx": 28
|
||||
"iconIdx": 27
|
||||
}
|
||||
],
|
||||
"height": 1024,
|
||||
|
@ -775,6 +808,7 @@
|
|||
"preferences": {
|
||||
"showGlyphs": true,
|
||||
"showQuickUse": true,
|
||||
"showQuickUse2": true,
|
||||
"showSVGs": true,
|
||||
"fontPref": {
|
||||
"prefix": "icon-",
|
||||
|
@ -791,7 +825,8 @@
|
|||
},
|
||||
"imagePref": {
|
||||
"prefix": "icon-",
|
||||
"png": true
|
||||
"png": true,
|
||||
"useClassSelector": true
|
||||
},
|
||||
"historySize": 100,
|
||||
"showCodes": true,
|
||||
|
|
49
index.html
49
index.html
|
@ -29,17 +29,18 @@
|
|||
<script src="libs/tooltip.js?v=1"></script><!-- bootstrap tooltip lib -->
|
||||
<script src="libs/popover.js?v=1"></script><!-- bootstrap tooltip lib -->
|
||||
<script src="libs/pako.bundle.js?v=1"></script><!-- zlib deflate -->
|
||||
<script src="interface_config.js?v=3"></script>
|
||||
<script src="libs/toastr.js?v=1"></script><!-- notifications lib -->
|
||||
<script src="muc.js?v=16"></script><!-- simple MUC library -->
|
||||
<script src="interface_config.js?v=4"></script>
|
||||
<script src="muc.js?v=17"></script><!-- simple MUC library -->
|
||||
<script src="estos_log.js?v=2"></script><!-- simple stanza logger -->
|
||||
<script src="desktopsharing.js?v=3"></script><!-- desktop sharing -->
|
||||
<script src="data_channels.js?v=3"></script><!-- data channels -->
|
||||
<script src="app.js?v=20"></script><!-- application logic -->
|
||||
<script src="app.js?v=21"></script><!-- application logic -->
|
||||
<script src="commands.js?v=1"></script><!-- application logic -->
|
||||
<script src="chat.js?v=14"></script><!-- chat logic -->
|
||||
<script src="contact_list.js?v=6"></script><!-- contact list logic -->
|
||||
<script src="util.js?v=6"></script><!-- utility functions -->
|
||||
<script src="chat.js?v=15"></script><!-- chat logic -->
|
||||
<script src="contact_list.js?v=7"></script><!-- contact list logic -->
|
||||
<script src="side_panel_toggler.js?v=1"></script>
|
||||
<script src="util.js?v=7"></script><!-- utility functions -->
|
||||
<script src="etherpad.js?v=9"></script><!-- etherpad plugin -->
|
||||
<script src="prezi.js?v=6"></script><!-- prezi plugin -->
|
||||
<script src="smileys.js?v=3"></script><!-- smiley images -->
|
||||
|
@ -48,14 +49,14 @@
|
|||
<script src="analytics.js?v=1"></script><!-- google analytics plugin -->
|
||||
<script src="rtp_sts.js?v=5"></script><!-- RTP stats processing -->
|
||||
<script src="local_sts.js?v=2"></script><!-- Local stats processing -->
|
||||
<script src="videolayout.js?v=28"></script><!-- video ui -->
|
||||
<script src="videolayout.js?v=29"></script><!-- video ui -->
|
||||
<script src="connectionquality.js?v=1"></script>
|
||||
<script src="toolbar.js?v=6"></script><!-- toolbar ui -->
|
||||
<script src="toolbar_toggler.js?v=2"></script>
|
||||
<script src="canvas_util.js?v=1"></script><!-- canvas drawing utils -->
|
||||
<script src="audio_levels.js?v=2"></script><!-- audio levels plugin -->
|
||||
<script src="media_stream.js?v=1"></script><!-- media stream -->
|
||||
<script src="bottom_toolbar.js?v=5"></script><!-- media stream -->
|
||||
<script src="media_stream.js?v=2"></script><!-- media stream -->
|
||||
<script src="bottom_toolbar.js?v=6"></script><!-- media stream -->
|
||||
<script src="moderator.js?v=1"></script><!-- media stream -->
|
||||
<script src="roomname_generator.js?v=1"></script><!-- generator for random room names -->
|
||||
<script src="keyboard_shortcut.js?v=3"></script>
|
||||
|
@ -64,19 +65,22 @@
|
|||
<script src="jitsipopover.js?v=3"></script>
|
||||
<script src="message_handler.js?v=2"></script>
|
||||
<script src="api_connector.js?v=2"></script>
|
||||
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="css/font.css?v=5"/>
|
||||
<script src="settings_menu.js?v=1"></script>
|
||||
<script src="avatar.js?v=1"></script><!-- avatars -->
|
||||
<link rel="stylesheet" href="css/font.css?v=6"/>
|
||||
<link rel="stylesheet" href="css/toastr.css?v=1">
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="css/main.css?v=29"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="css/videolayout_default.css?v=13" id="videolayout_default"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="css/main.css?v=30"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="css/videolayout_default.css?v=14" id="videolayout_default"/>
|
||||
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="css/jquery-impromptu.css?v=4">
|
||||
<link rel="stylesheet" href="css/modaldialog.css?v=3">
|
||||
<link rel="stylesheet" href="css/popup_menu.css?v=4">
|
||||
<link rel="stylesheet" href="css/popover.css?v=2">
|
||||
<link rel="stylesheet" href="css/jitsi_popover.css?v=2">
|
||||
<link rel="stylesheet" href="css/contact_list.css?v=3">
|
||||
<link rel="stylesheet" href="css/contact_list.css?v=4">
|
||||
<link rel="stylesheet" href="css/chat.css?v=5">
|
||||
<link rel="stylesheet" href="css/welcome_page.css?v=2">
|
||||
<link rel="stylesheet" href="css/settingsmenu.css?v=1">
|
||||
<!--
|
||||
Link used for inline installation of chrome desktop streaming extension,
|
||||
is updated automatically from the code with the value defined in config.js -->
|
||||
|
@ -230,6 +234,10 @@
|
|||
<i class="icon-telephone"></i></a>
|
||||
</span>
|
||||
<div class="header_button_separator"></div>
|
||||
<a class="button" data-container="body" data-toggle="popover" data-placement="bottom" content="Settings" onclick='PanelToggler.toggleSettingsMenu();'>
|
||||
<i id="settingsButton" class="icon-settings"></i>
|
||||
</a>
|
||||
<div class="header_button_separator"></div>
|
||||
<span id="hangup">
|
||||
<a class="button" data-container="body" data-toggle="popover" data-placement="bottom" content="Hang Up" onclick='hangup();'>
|
||||
<i class="icon-hangup" style="color:#ff0000;font-size: 1.4em;"></i>
|
||||
|
@ -256,6 +264,7 @@
|
|||
<a target="_new"><div class="watermark leftwatermark"></div></a>
|
||||
<a target="_new"><div class="watermark rightwatermark"></div></a>
|
||||
<a class="poweredby" href="http://jitsi.org" target="_new" >powered by jitsi.org</a>
|
||||
<img id="activeSpeakerAvatar" src=""/>
|
||||
<video id="largeVideo" autoplay oncontextmenu="return false;"></video>
|
||||
</div>
|
||||
<div id="remoteVideos">
|
||||
|
@ -299,7 +308,7 @@
|
|||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<div id="chatspace">
|
||||
<div id="chatspace" class="right-panel">
|
||||
<div id="nickname">
|
||||
Enter a nickname in the box below
|
||||
<form>
|
||||
|
@ -317,11 +326,19 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="contactlist">
|
||||
<div id="contactlist" class="right-panel">
|
||||
<ul>
|
||||
<li class="title"><i class="icon-contact-list"></i> CONTACT LIST</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="settingsmenu" class="right-panel">
|
||||
<div class="icon-settings"> SETTINGS</div>
|
||||
<img id="avatar" src="https://www.gravatar.com/avatar/87291c37c25be69a072a4514931b1749?d=retro&size=30"/>
|
||||
<div class="arrow-up"></div>
|
||||
<input type="text" id="setDisplayName" placeholder="Name">
|
||||
<input type="text" id="setEmail" placeholder="E-Mail">
|
||||
<button onclick="SettingsMenu.update()" id="updateSettings">Update</button>
|
||||
</div>
|
||||
<a id="downloadlog" onclick='dump(event.target);' data-container="body" data-toggle="popover" data-placement="right" data-content="Download logs" ><i class="fa fa-cloud-download"></i></a>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -6,11 +6,13 @@ var interfaceConfig = {
|
|||
TOOLBAR_TIMEOUT: 4000,
|
||||
DEFAULT_REMOTE_DISPLAY_NAME: "Fellow Jitster",
|
||||
DEFAULT_DOMINANT_SPEAKER_DISPLAY_NAME: "Speaker",
|
||||
DEFAULT_LOCAL_DISPLAY_NAME: "me",
|
||||
SHOW_JITSI_WATERMARK: true,
|
||||
JITSI_WATERMARK_LINK: "http://jitsi.org",
|
||||
SHOW_BRAND_WATERMARK: false,
|
||||
BRAND_WATERMARK_LINK: "",
|
||||
SHOW_POWERED_BY: false,
|
||||
GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,
|
||||
APP_NAME: "Jitsi Meet"
|
||||
APP_NAME: "Jitsi Meet",
|
||||
ACTIVE_SPEAKER_AVATAR_SIZE: 100
|
||||
};
|
||||
|
|
|
@ -16,15 +16,17 @@ var MediaStream = (function() {
|
|||
* @constructor
|
||||
*/
|
||||
function MediaStreamProto(data, sid, ssrc) {
|
||||
this.VIDEO_TYPE = "Video";
|
||||
this.AUDIO_TYPE = "Audio";
|
||||
this.stream = data.stream;
|
||||
this.peerjid = data.peerjid;
|
||||
this.ssrc = ssrc;
|
||||
this.session = connection.jingle.sessions[sid];
|
||||
this.type = (this.stream.getVideoTracks().length > 0)
|
||||
? this.VIDEO_TYPE : this.AUDIO_TYPE;
|
||||
? MediaStream.VIDEO_TYPE : MediaStream.AUDIO_TYPE;
|
||||
this.muted = false;
|
||||
}
|
||||
|
||||
return MediaStreamProto;
|
||||
})();
|
||||
})();
|
||||
|
||||
MediaStream.VIDEO_TYPE = 'Video';
|
||||
MediaStream.AUDIO_TYPE = 'Audio';
|
14
muc.js
14
muc.js
|
@ -357,6 +357,14 @@ Strophe.addConnectionPlugin('emuc', {
|
|||
pres.c('bridgeIsDown').up();
|
||||
}
|
||||
|
||||
if(this.presMap['email']) {
|
||||
pres.c('email').t(this.presMap['email']).up();
|
||||
}
|
||||
|
||||
if(this.presMap['userId']) {
|
||||
pres.c('userId').t(this.presMap['userId']).up();
|
||||
}
|
||||
|
||||
if (this.presMap['displayName']) {
|
||||
// XEP-0172
|
||||
pres.c('nick', {xmlns: 'http://jabber.org/protocol/nick'})
|
||||
|
@ -479,6 +487,12 @@ Strophe.addConnectionPlugin('emuc', {
|
|||
addBridgeIsDownToPresence: function() {
|
||||
this.presMap['bridgeIsDown'] = true;
|
||||
},
|
||||
addEmailToPresence: function(email) {
|
||||
this.presMap['email'] = email;
|
||||
},
|
||||
addUserIdToPresence: function(userId) {
|
||||
this.presMap['userId'] = userId;
|
||||
},
|
||||
isModerator: function() {
|
||||
return this.role === 'moderator';
|
||||
}
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
var SettingsMenu = (function(my) {
|
||||
|
||||
var email = '';
|
||||
var displayName = '';
|
||||
var userId;
|
||||
|
||||
if(supportsLocalStorage()) {
|
||||
if(!window.localStorage.jitsiMeetId) {
|
||||
window.localStorage.jitsiMeetId = generateUniqueId();
|
||||
console.log("generated id", window.localStorage.jitsiMeetId);
|
||||
}
|
||||
userId = window.localStorage.jitsiMeetId || '';
|
||||
email = window.localStorage.email || '';
|
||||
displayName = window.localStorage.displayname || '';
|
||||
} else {
|
||||
console.log("local storage is not supported");
|
||||
userId = generateUniqueId();
|
||||
}
|
||||
|
||||
my.update = function() {
|
||||
var newDisplayName = Util.escapeHtml($('#setDisplayName').get(0).value);
|
||||
if(newDisplayName) {
|
||||
displayName = newDisplayName;
|
||||
connection.emuc.addDisplayNameToPresence(displayName);
|
||||
window.localStorage.displayname = displayName;
|
||||
}
|
||||
|
||||
var newEmail = Util.escapeHtml($('#setEmail').get(0).value);
|
||||
connection.emuc.addEmailToPresence(newEmail);
|
||||
email = newEmail;
|
||||
window.localStorage.email = newEmail;
|
||||
|
||||
connection.emuc.sendPresence();
|
||||
Avatar.setUserAvatar(connection.emuc.myroomjid, email);
|
||||
};
|
||||
|
||||
my.isVisible = function() {
|
||||
return $('#settingsmenu').is(':visible');
|
||||
};
|
||||
|
||||
my.getUID = function() {
|
||||
return userId;
|
||||
};
|
||||
|
||||
my.getEmail = function() {
|
||||
return email;
|
||||
};
|
||||
|
||||
my.getDisplayName = function() {
|
||||
return displayName;
|
||||
};
|
||||
|
||||
my.setDisplayName = function(newDisplayName) {
|
||||
displayName = newDisplayName;
|
||||
window.localStorage.displayname = displayName;
|
||||
$('#setDisplayName').get(0).value = displayName;
|
||||
};
|
||||
|
||||
function supportsLocalStorage() {
|
||||
try {
|
||||
return 'localStorage' in window && window.localStorage !== null;
|
||||
} catch (e) {
|
||||
console.log("localstorage is not supported");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function generateUniqueId() {
|
||||
function _p8() {
|
||||
return (Math.random().toString(16)+"000000000").substr(2,8);
|
||||
}
|
||||
return _p8() + _p8() + _p8() + _p8();
|
||||
}
|
||||
|
||||
$(document).bind('displaynamechanged', function(event, peerJid, newDisplayName) {
|
||||
if(peerJid === 'localVideoContainer' ||
|
||||
peerJid === connection.emuc.myroomjid) {
|
||||
SettingsMenu.setDisplayName(newDisplayName);
|
||||
}
|
||||
});
|
||||
|
||||
return my;
|
||||
}(SettingsMenu || {}));
|
|
@ -0,0 +1,245 @@
|
|||
/**
|
||||
* Toggler for the chat, contact list, settings menu, etc..
|
||||
*/
|
||||
var PanelToggler = (function(my) {
|
||||
|
||||
var currentlyOpen = null;
|
||||
var buttons = {
|
||||
'#chatspace': '#chatBottomButton',
|
||||
'#contactlist': '#contactListButton',
|
||||
'#settingsmenu': '#settingsButton'
|
||||
};
|
||||
|
||||
/**
|
||||
* Resizes the video area
|
||||
* @param isClosing whether the side panel is going to be closed or is going to open / remain opened
|
||||
* @param completeFunction a function to be called when the video space is resized
|
||||
*/
|
||||
var resizeVideoArea = function(isClosing, completeFunction) {
|
||||
var videospace = $('#videospace');
|
||||
|
||||
var panelSize = isClosing ? [0, 0] : PanelToggler.getPanelSize();
|
||||
var videospaceWidth = window.innerWidth - panelSize[0];
|
||||
var videospaceHeight = window.innerHeight;
|
||||
var videoSize
|
||||
= getVideoSize(null, null, videospaceWidth, videospaceHeight);
|
||||
var videoWidth = videoSize[0];
|
||||
var videoHeight = videoSize[1];
|
||||
var videoPosition = getVideoPosition(videoWidth,
|
||||
videoHeight,
|
||||
videospaceWidth,
|
||||
videospaceHeight);
|
||||
var horizontalIndent = videoPosition[0];
|
||||
var verticalIndent = videoPosition[1];
|
||||
|
||||
var thumbnailSize = VideoLayout.calculateThumbnailSize(videospaceWidth);
|
||||
var thumbnailsWidth = thumbnailSize[0];
|
||||
var thumbnailsHeight = thumbnailSize[1];
|
||||
//for chat
|
||||
|
||||
videospace.animate({
|
||||
right: panelSize[0],
|
||||
width: videospaceWidth,
|
||||
height: videospaceHeight
|
||||
},
|
||||
{
|
||||
queue: false,
|
||||
duration: 500,
|
||||
complete: completeFunction
|
||||
});
|
||||
|
||||
$('#remoteVideos').animate({
|
||||
height: thumbnailsHeight
|
||||
},
|
||||
{
|
||||
queue: false,
|
||||
duration: 500
|
||||
});
|
||||
|
||||
$('#remoteVideos>span').animate({
|
||||
height: thumbnailsHeight,
|
||||
width: thumbnailsWidth
|
||||
},
|
||||
{
|
||||
queue: false,
|
||||
duration: 500,
|
||||
complete: function () {
|
||||
$(document).trigger(
|
||||
"remotevideo.resized",
|
||||
[thumbnailsWidth,
|
||||
thumbnailsHeight]);
|
||||
}
|
||||
});
|
||||
|
||||
$('#largeVideoContainer').animate({
|
||||
width: videospaceWidth,
|
||||
height: videospaceHeight
|
||||
},
|
||||
{
|
||||
queue: false,
|
||||
duration: 500
|
||||
});
|
||||
|
||||
$('#largeVideo').animate({
|
||||
width: videoWidth,
|
||||
height: videoHeight,
|
||||
top: verticalIndent,
|
||||
bottom: verticalIndent,
|
||||
left: horizontalIndent,
|
||||
right: horizontalIndent
|
||||
},
|
||||
{
|
||||
queue: false,
|
||||
duration: 500
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Toggles the windows in the side panel
|
||||
* @param object the window that should be shown
|
||||
* @param selector the selector for the element containing the panel
|
||||
* @param onOpenComplete function to be called when the panel is opened
|
||||
* @param onOpen function to be called if the window is going to be opened
|
||||
* @param onClose function to be called if the window is going to be closed
|
||||
*/
|
||||
var toggle = function(object, selector, onOpenComplete, onOpen, onClose) {
|
||||
buttonClick(buttons[selector], "active");
|
||||
|
||||
if (object.isVisible()) {
|
||||
$("#toast-container").animate({
|
||||
right: '5px'
|
||||
},
|
||||
{
|
||||
queue: false,
|
||||
duration: 500
|
||||
});
|
||||
$(selector).hide("slide", {
|
||||
direction: "right",
|
||||
queue: false,
|
||||
duration: 500
|
||||
});
|
||||
if(typeof onClose === "function") {
|
||||
onClose();
|
||||
}
|
||||
|
||||
currentlyOpen = null;
|
||||
}
|
||||
else {
|
||||
// Undock the toolbar when the chat is shown and if we're in a
|
||||
// video mode.
|
||||
if (VideoLayout.isLargeVideoVisible()) {
|
||||
ToolbarToggler.dockToolbar(false);
|
||||
}
|
||||
|
||||
if(currentlyOpen) {
|
||||
var current = $(currentlyOpen);
|
||||
buttonClick(buttons[currentlyOpen], "active");
|
||||
current.css('z-index', 4);
|
||||
setTimeout(function () {
|
||||
current.css('display', 'none');
|
||||
current.css('z-index', 5);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
$("#toast-container").animate({
|
||||
right: (PanelToggler.getPanelSize()[0] + 5) + 'px'
|
||||
},
|
||||
{
|
||||
queue: false,
|
||||
duration: 500
|
||||
});
|
||||
$(selector).show("slide", {
|
||||
direction: "right",
|
||||
queue: false,
|
||||
duration: 500,
|
||||
complete: onOpenComplete
|
||||
});
|
||||
if(typeof onOpen === "function") {
|
||||
onOpen();
|
||||
}
|
||||
|
||||
currentlyOpen = selector;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Opens / closes the chat area.
|
||||
*/
|
||||
my.toggleChat = function() {
|
||||
var chatCompleteFunction = Chat.isVisible() ?
|
||||
function() {} : function () {
|
||||
Chat.scrollChatToBottom();
|
||||
$('#chatspace').trigger('shown');
|
||||
};
|
||||
|
||||
resizeVideoArea(Chat.isVisible(), chatCompleteFunction);
|
||||
|
||||
toggle(Chat,
|
||||
'#chatspace',
|
||||
function () {
|
||||
// Request the focus in the nickname field or the chat input field.
|
||||
if ($('#nickname').css('visibility') === 'visible') {
|
||||
$('#nickinput').focus();
|
||||
} else {
|
||||
$('#usermsg').focus();
|
||||
}
|
||||
},
|
||||
null,
|
||||
Chat.resizeChat,
|
||||
null);
|
||||
};
|
||||
|
||||
/**
|
||||
* Opens / closes the contact list area.
|
||||
*/
|
||||
my.toggleContactList = function () {
|
||||
var completeFunction = ContactList.isVisible() ?
|
||||
function() {} : function () { $('#contactlist').trigger('shown');};
|
||||
resizeVideoArea(ContactList.isVisible(), completeFunction);
|
||||
|
||||
toggle(ContactList,
|
||||
'#contactlist',
|
||||
null,
|
||||
function() {
|
||||
ContactList.setVisualNotification(false);
|
||||
},
|
||||
null);
|
||||
};
|
||||
|
||||
/**
|
||||
* Opens / closes the settings menu
|
||||
*/
|
||||
my.toggleSettingsMenu = function() {
|
||||
resizeVideoArea(SettingsMenu.isVisible(), function (){});
|
||||
toggle(SettingsMenu,
|
||||
'#settingsmenu',
|
||||
null,
|
||||
function() {
|
||||
$('#setDisplayName').get(0).value = SettingsMenu.getDisplayName();
|
||||
$('#setEmail').get(0).value = SettingsMenu.getEmail();
|
||||
},
|
||||
null);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the size of the side panel.
|
||||
*/
|
||||
my.getPanelSize = function () {
|
||||
var availableHeight = window.innerHeight;
|
||||
var availableWidth = window.innerWidth;
|
||||
|
||||
var panelWidth = 200;
|
||||
if (availableWidth * 0.2 < 200) {
|
||||
panelWidth = availableWidth * 0.2;
|
||||
}
|
||||
|
||||
return [panelWidth, availableHeight];
|
||||
};
|
||||
|
||||
my.isVisible = function() {
|
||||
return (Chat.isVisible() || ContactList.isVisible() || SettingsMenu.isVisible());
|
||||
};
|
||||
|
||||
return my;
|
||||
|
||||
}(PanelToggler || {}));
|
8
util.js
8
util.js
|
@ -51,12 +51,10 @@ var Util = (function (my) {
|
|||
* Returns the available video width.
|
||||
*/
|
||||
my.getAvailableVideoWidth = function () {
|
||||
var chatspaceWidth
|
||||
= (Chat.isVisible() || ContactList.isVisible())
|
||||
? $('#chatspace').width()
|
||||
: 0;
|
||||
var rightPanelWidth
|
||||
= PanelToggler.isVisible() ? PanelToggler.getPanelSize()[0] : 0;
|
||||
|
||||
return window.innerWidth - chatspaceWidth;
|
||||
return window.innerWidth - rightPanelWidth;
|
||||
};
|
||||
|
||||
my.imageToGrayScale = function (canvas) {
|
||||
|
|
103
videolayout.js
103
videolayout.js
|
@ -11,6 +11,12 @@ var VideoLayout = (function (my) {
|
|||
};
|
||||
my.connectionIndicators = {};
|
||||
|
||||
my.isInLastN = function(resource) {
|
||||
return lastNCount < 0 // lastN is disabled, return true
|
||||
|| (lastNCount > 0 && lastNEndpointsCache.length == 0) // lastNEndpoints cache not built yet, return true
|
||||
|| (lastNEndpointsCache && lastNEndpointsCache.indexOf(resource) !== -1);
|
||||
};
|
||||
|
||||
my.changeLocalAudio = function(stream) {
|
||||
connection.jingle.localAudio = stream;
|
||||
|
||||
|
@ -127,6 +133,7 @@ var VideoLayout = (function (my) {
|
|||
|
||||
if ($('#largeVideo').attr('src') != newSrc) {
|
||||
|
||||
$('#activeSpeakerAvatar').css('visibility', 'hidden');
|
||||
// Due to the simulcast the localVideoSrc may have changed when the
|
||||
// fadeOut event triggers. In that case the getJidFromVideoSrc and
|
||||
// isVideoSrcDesktop methods will not function correctly.
|
||||
|
@ -159,6 +166,8 @@ var VideoLayout = (function (my) {
|
|||
|
||||
var doUpdate = function () {
|
||||
|
||||
Avatar.updateActiveSpeakerAvatarSrc(largeVideoState.userJid);
|
||||
|
||||
if (!userChanged && largeVideoState.preload
|
||||
&& largeVideoState.preload != null
|
||||
&& $(largeVideoState.preload).attr('src') == newSrc) {
|
||||
|
@ -231,6 +240,10 @@ var VideoLayout = (function (my) {
|
|||
$(this).fadeIn(300);
|
||||
}
|
||||
|
||||
if(userChanged) {
|
||||
Avatar.showUserAvatar(largeVideoState.oldJid);
|
||||
}
|
||||
|
||||
largeVideoState.updateInProgress = false;
|
||||
};
|
||||
|
||||
|
@ -372,29 +385,30 @@ var VideoLayout = (function (my) {
|
|||
* in the document and creates it eventually.
|
||||
*
|
||||
* @param peerJid peer Jid to check.
|
||||
* @param userId user email or id for setting the avatar
|
||||
*
|
||||
* @return Returns <tt>true</tt> if the peer container exists,
|
||||
* <tt>false</tt> - otherwise
|
||||
*/
|
||||
my.ensurePeerContainerExists = function(peerJid) {
|
||||
ContactList.ensureAddContact(peerJid);
|
||||
my.ensurePeerContainerExists = function(peerJid, userId) {
|
||||
ContactList.ensureAddContact(peerJid, userId);
|
||||
|
||||
var resourceJid = Strophe.getResourceFromJid(peerJid);
|
||||
|
||||
var videoSpanId = 'participant_' + resourceJid;
|
||||
|
||||
if ($('#' + videoSpanId).length > 0) {
|
||||
// If there's been a moderator change, make sure we add moderator
|
||||
// related interface!!
|
||||
if (Moderator.isModerator() &&
|
||||
$('#remote_popupmenu_' + resourceJid).length <= 0)
|
||||
// If there's been a focus change, make sure we add focus related
|
||||
// interface!!
|
||||
if (Moderator.isModerator() && $('#remote_popupmenu_' + resourceJid).length <= 0) {
|
||||
addRemoteVideoMenu(peerJid,
|
||||
document.getElementById(videoSpanId));
|
||||
document.getElementById(videoSpanId));
|
||||
}
|
||||
}
|
||||
else {
|
||||
var container
|
||||
= VideoLayout.addRemoteVideoContainer(peerJid, videoSpanId);
|
||||
|
||||
var container =
|
||||
VideoLayout.addRemoteVideoContainer(peerJid, videoSpanId, userId);
|
||||
Avatar.setUserAvatar(peerJid, userId);
|
||||
// Set default display name.
|
||||
setDisplayName(videoSpanId);
|
||||
|
||||
|
@ -473,8 +487,10 @@ var VideoLayout = (function (my) {
|
|||
var videoStream = simulcast.getReceivingVideoStream(stream);
|
||||
RTC.attachMediaStream(sel, videoStream);
|
||||
|
||||
if (isVideo)
|
||||
if (isVideo) {
|
||||
waitForRemoteVideo(sel, thessrc, stream);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
stream.onended = function () {
|
||||
|
@ -591,14 +607,17 @@ var VideoLayout = (function (my) {
|
|||
peerContainer.show();
|
||||
}
|
||||
|
||||
// TODO(gp) add proper avatars handling.
|
||||
if (state == 'show')
|
||||
{
|
||||
peerContainer.css('-webkit-filter', '');
|
||||
// peerContainer.css('-webkit-filter', '');
|
||||
var jid = connection.emuc.findJidFromResource(resourceJid);
|
||||
Avatar.showUserAvatar(jid, false);
|
||||
}
|
||||
else // if (state == 'avatar')
|
||||
{
|
||||
peerContainer.css('-webkit-filter', 'grayscale(100%)');
|
||||
// peerContainer.css('-webkit-filter', 'grayscale(100%)');
|
||||
var jid = connection.emuc.findJidFromResource(resourceJid);
|
||||
Avatar.showUserAvatar(jid, true);
|
||||
}
|
||||
}
|
||||
else if (peerContainer.is(':visible') && isHide)
|
||||
|
@ -624,7 +643,7 @@ var VideoLayout = (function (my) {
|
|||
*/
|
||||
function setDisplayName(videoSpanId, displayName) {
|
||||
var nameSpan = $('#' + videoSpanId + '>span.displayname');
|
||||
var defaultLocalDisplayName = "Me";
|
||||
var defaultLocalDisplayName = interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME;
|
||||
|
||||
// If we already have a display name for this video.
|
||||
if (nameSpan.length > 0) {
|
||||
|
@ -685,6 +704,7 @@ var VideoLayout = (function (my) {
|
|||
.bind("click", function (e) {
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$('#localDisplayName').hide();
|
||||
$('#editDisplayName').show();
|
||||
$('#editDisplayName').focus();
|
||||
|
@ -703,7 +723,7 @@ var VideoLayout = (function (my) {
|
|||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
my.inputDisplayNameHandler = function (name) {
|
||||
if (nickname !== name) {
|
||||
|
@ -720,7 +740,7 @@ var VideoLayout = (function (my) {
|
|||
$('#localDisplayName').text(nickname + " (me)");
|
||||
else
|
||||
$('#localDisplayName')
|
||||
.text(defaultLocalDisplayName);
|
||||
.text(interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME);
|
||||
$('#localDisplayName').show();
|
||||
}
|
||||
|
||||
|
@ -921,6 +941,10 @@ var VideoLayout = (function (my) {
|
|||
$('#largeVideoContainer').width(availableWidth);
|
||||
$('#largeVideoContainer').height(availableHeight);
|
||||
|
||||
|
||||
$('#activeSpeakerAvatar').css('top',
|
||||
(availableHeight - interfaceConfig.ACTIVE_SPEAKER_AVATAR_SIZE) / 2);
|
||||
|
||||
VideoLayout.resizeThumbnails();
|
||||
};
|
||||
|
||||
|
@ -940,6 +964,8 @@ var VideoLayout = (function (my) {
|
|||
$('#remoteVideos>span').width(width);
|
||||
$('#remoteVideos>span').height(height);
|
||||
|
||||
$('.userAvatar').css('left', (width - height) / 2);
|
||||
|
||||
$(document).trigger("remotevideo.resized", [width, height]);
|
||||
};
|
||||
|
||||
|
@ -1545,36 +1571,27 @@ var VideoLayout = (function (my) {
|
|||
if (!isVisible) {
|
||||
console.log("Add to last N", resourceJid);
|
||||
|
||||
mediaStreams.some(function (mediaStream) {
|
||||
if (mediaStream.peerjid
|
||||
&& Strophe.getResourceFromJid(mediaStream.peerjid)
|
||||
=== resourceJid
|
||||
&& mediaStream.type === mediaStream.VIDEO_TYPE) {
|
||||
var sel = $('#participant_' + resourceJid + '>video');
|
||||
var jid = connection.emuc.findJidFromResource(resourceJid);
|
||||
var mediaStream = mediaStreams[jid][MediaStream.VIDEO_TYPE];
|
||||
var sel = $('#participant_' + resourceJid + '>video');
|
||||
|
||||
var videoStream = simulcast.getReceivingVideoStream(mediaStream.stream);
|
||||
RTC.attachMediaStream(sel, videoStream);
|
||||
videoSrcToSsrc[sel.attr('src')] = mediaStream.ssrc;
|
||||
if (lastNPickupJid == mediaStream.peerjid) {
|
||||
// Clean up the lastN pickup jid.
|
||||
lastNPickupJid = null;
|
||||
var videoStream = simulcast.getReceivingVideoStream(
|
||||
mediaStream.stream);
|
||||
RTC.attachMediaStream(sel, videoStream);
|
||||
videoSrcToSsrc[sel.attr('src')] = mediaStream.ssrc;
|
||||
if (lastNPickupJid == mediaStream.peerjid) {
|
||||
// Clean up the lastN pickup jid.
|
||||
lastNPickupJid = null;
|
||||
|
||||
// Don't fire the events again, they've already
|
||||
// been fired in the contact list click handler.
|
||||
VideoLayout.handleVideoThumbClicked($(sel).attr('src'), false);
|
||||
// Don't fire the events again, they've already
|
||||
// been fired in the contact list click handler.
|
||||
VideoLayout.handleVideoThumbClicked($(sel).attr('src'), false);
|
||||
|
||||
updateLargeVideo = false;
|
||||
}
|
||||
|
||||
waitForRemoteVideo(
|
||||
sel,
|
||||
mediaStream.ssrc,
|
||||
mediaStream.stream);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
updateLargeVideo = false;
|
||||
}
|
||||
waitForRemoteVideo(sel, mediaStream.ssrc, mediaStream.stream);
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
// The endpoint that was being shown in the large video has dropped out
|
||||
|
|
Loading…
Reference in New Issue