From 0c738e5334cd9eac5540ee8de0abb1d6b9f5a63a Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Mon, 21 Apr 2014 18:15:27 +0200 Subject: [PATCH 1/3] get camera on demand, accept calls on cam accept --- clientapp/app.js | 4 ---- clientapp/helpers/xmppEventHandlers.js | 11 ++++++++--- package.json | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/clientapp/app.js b/clientapp/app.js index 396c5ab..f825f62 100644 --- a/clientapp/app.js +++ b/clientapp/app.js @@ -67,10 +67,6 @@ module.exports = { client.use(pushNotifications); xmppEventHandlers(self.api, self); - if (self.api.jingle.capabilities.length > 1) { - self.api.jingle.startLocalMedia(); - } - self.api.once('session:started', function () { app.state.hasConnected = true; cb(); diff --git a/clientapp/helpers/xmppEventHandlers.js b/clientapp/helpers/xmppEventHandlers.js index 3c6be47..6deed5c 100644 --- a/clientapp/helpers/xmppEventHandlers.js +++ b/clientapp/helpers/xmppEventHandlers.js @@ -409,7 +409,13 @@ module.exports = function (client, app) { state: 'incoming', jingleSession: session }); - session.accept(); + if (!client.jingle.localStream) { + client.jingle.startLocalMedia(null, function (err) { + session.accept(); + }); + } else { + session.accept(); + } contact.jingleCall = call; me.calls.add(call); }); @@ -449,11 +455,10 @@ module.exports = function (client, app) { client.on('jingle:remotestream:added', function (session) { var contact = me.getContact(session.peer); if (!contact) { - contact = new Contact({jid: client.JID(session.peer).bare}); contact.resources.add({id: session.peer}); me.contacts.add(contact); } - contact.stream = session.stream; + contact.stream = session.streams[0]; }); client.on('jingle:remotestream:removed', function (session) { diff --git a/package.json b/package.json index 06a0ec4..39f1f4a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "oembed": "0.1.0", "semi-static": "0.0.4", "sound-effect-manager": "0.0.5", - "stanza.io": "3.2.4", + "stanza.io": "3.6.x", "staydown": "1.0.3", "templatizer": "0.1.2", "underscore": "1.5.1", From 4b04d706fe09c7d6c8f243245330a0c279366c4f Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Tue, 22 Apr 2014 09:59:28 +0200 Subject: [PATCH 2/3] make it possible to accept / reject calls --- clientapp/helpers/xmppEventHandlers.js | 10 +++------ clientapp/pages/chat.js | 31 +++++++++++++++++++++++++- clientapp/templates.js | 2 +- clientapp/templates/pages/chat.jade | 3 ++- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/clientapp/helpers/xmppEventHandlers.js b/clientapp/helpers/xmppEventHandlers.js index 6deed5c..1c1853b 100644 --- a/clientapp/helpers/xmppEventHandlers.js +++ b/clientapp/helpers/xmppEventHandlers.js @@ -409,15 +409,10 @@ module.exports = function (client, app) { state: 'incoming', jingleSession: session }); - if (!client.jingle.localStream) { - client.jingle.startLocalMedia(null, function (err) { - session.accept(); - }); - } else { - session.accept(); - } contact.jingleCall = call; + contact.callState = 'incoming'; me.calls.add(call); + // FIXME: send directed presence if not on roster }); client.on('jingle:outgoing', function (session) { @@ -441,6 +436,7 @@ module.exports = function (client, app) { client.on('jingle:accepted', function (session) { var contact = me.getContact(session.peer); contact.callState = 'activeCall'; + console.log('jingle accepted...'); contact.onCall = true; }); diff --git a/clientapp/pages/chat.js b/clientapp/pages/chat.js index a70cb5f..7be10f3 100644 --- a/clientapp/pages/chat.js +++ b/clientapp/pages/chat.js @@ -30,6 +30,7 @@ module.exports = BasePage.extend({ 'keydown textarea': 'handleKeyDown', 'keyup textarea': 'handleKeyUp', 'click .call': 'handleCallClick', + 'click .accept': 'handleAcceptClick', 'click .end': 'handleEndClick', 'click .mute': 'handleMuteClick' }, @@ -226,10 +227,38 @@ module.exports = BasePage.extend({ embedIt(newEl); this.lastModel = model; }, + handleAcceptClick: function (e) { + e.preventDefault(); + var self = this; + + //if (!(this.model.jingleCall && this.model.jingleCall.jingleSession)) return; + this.$('button.accept').prop('disabled', true); + if (this.model.jingleCall.jingleSession.state == 'pending') { + if (!client.jingle.localStream) { + client.jingle.startLocalMedia(null, function (err) { + if (err) { + this.model.jingleCall.end({ + condition: 'decline' + }); + } else { + self.model.jingleCall.jingleSession.accept(); + } + }); + } else { + this.model.jingleCall.jingleSession.accept(); + } + } + return false; + }, handleEndClick: function (e) { e.preventDefault(); + var condition = 'success'; + if (this.model.jingleCall && this.model.jingleCall.jingleSession && + this.model.jingleCall.jingleSession.state == 'pending') { + condition = 'decline'; + } this.model.jingleCall.end({ - condition: 'success' + condition: condition }); return false; }, diff --git a/clientapp/templates.js b/clientapp/templates.js index a1f41da..0b89c44 100644 --- a/clientapp/templates.js +++ b/clientapp/templates.js @@ -470,7 +470,7 @@ exports.misc.growlMessage = function anonymous(locals) { exports.pages.chat = function anonymous(locals) { var buf = []; with (locals || {}) { - buf.push('

    '); + buf.push('

      '); } return buf.join(""); }; diff --git a/clientapp/templates/pages/chat.jade b/clientapp/templates/pages/chat.jade index 081516d..76a1cac 100644 --- a/clientapp/templates/pages/chat.jade +++ b/clientapp/templates/pages/chat.jade @@ -10,7 +10,8 @@ section.page.chat video.remote(autoplay) video.local(autoplay, muted) aside.button-wrap - button.end.primary End + button.accept.primary Accept + button.end.secondary End .button-group.outlined button.mute Mute button.unmute Unmute From 9f6f45eb30682ace7587adebc8b0309f2b7ad506 Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Tue, 22 Apr 2014 11:16:10 +0200 Subject: [PATCH 3/3] refine, send directed presence before session-accept --- clientapp/helpers/xmppEventHandlers.js | 5 ++++- clientapp/pages/chat.js | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/clientapp/helpers/xmppEventHandlers.js b/clientapp/helpers/xmppEventHandlers.js index 1c1853b..a875954 100644 --- a/clientapp/helpers/xmppEventHandlers.js +++ b/clientapp/helpers/xmppEventHandlers.js @@ -431,12 +431,15 @@ module.exports = function (client, app) { contact.callState = ''; contact.jingleCall = null; contact.onCall = false; + if (me.calls.length == 1) { // this is the last call + client.jingle.stopLocalMedia(); + client.jingle.localStream = null; + } }); client.on('jingle:accepted', function (session) { var contact = me.getContact(session.peer); contact.callState = 'activeCall'; - console.log('jingle accepted...'); contact.onCall = true; }); diff --git a/clientapp/pages/chat.js b/clientapp/pages/chat.js index 7be10f3..b17cafc 100644 --- a/clientapp/pages/chat.js +++ b/clientapp/pages/chat.js @@ -231,20 +231,21 @@ module.exports = BasePage.extend({ e.preventDefault(); var self = this; - //if (!(this.model.jingleCall && this.model.jingleCall.jingleSession)) return; this.$('button.accept').prop('disabled', true); if (this.model.jingleCall.jingleSession.state == 'pending') { if (!client.jingle.localStream) { client.jingle.startLocalMedia(null, function (err) { if (err) { - this.model.jingleCall.end({ + self.model.jingleCall.end({ condition: 'decline' }); } else { + client.sendPresence({to: client.JID(self.model.jingleCall.jingleSession.peer) }); self.model.jingleCall.jingleSession.accept(); } }); } else { + client.sendPresence({to: client.JID(this.model.jingleCall.jingleSession.peer) }); this.model.jingleCall.jingleSession.accept(); } } @@ -253,13 +254,14 @@ module.exports = BasePage.extend({ handleEndClick: function (e) { e.preventDefault(); var condition = 'success'; - if (this.model.jingleCall && this.model.jingleCall.jingleSession && - this.model.jingleCall.jingleSession.state == 'pending') { - condition = 'decline'; + if (this.model.jingleCall) { + if (this.model.jingleCall.jingleSession && this.model.jingleCall.jingleSession.state == 'pending') { + condition = 'decline'; + } + this.model.jingleCall.end({ + condition: condition + }); } - this.model.jingleCall.end({ - condition: condition - }); return false; }, handleMuteClick: function (e) {