From 1f39583d80c7c7860bfe2b82209527ef371de7b4 Mon Sep 17 00:00:00 2001 From: Boris Grozev Date: Wed, 17 Jul 2013 12:51:19 +0300 Subject: [PATCH] Adds a CALL_PARTICIPANTS_CHANGE type for CallChangeEvent-s and fires events with this type when content-modify or content-remove is received. --- .../impl/callhistory/CallHistoryServiceImpl.java | 3 +++ .../impl/gui/main/call/CallManager.java | 3 +++ .../impl/protocol/jabber/CallJabberImpl.java | 7 ++++++- .../impl/protocol/jabber/CallPeerJabberImpl.java | 13 +++++++++---- .../sip/communicator/service/protocol/Call.java | 3 +-- .../service/protocol/CallConference.java | 4 +++- .../service/protocol/event/CallChangeEvent.java | 9 +++++++++ .../AbstractOperationSetTelephonyConferencing.java | 5 +++++ .../service/protocol/media/MediaAwareCall.java | 4 ++++ 9 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/net/java/sip/communicator/impl/callhistory/CallHistoryServiceImpl.java b/src/net/java/sip/communicator/impl/callhistory/CallHistoryServiceImpl.java index 263060ebf..43a0eb44e 100644 --- a/src/net/java/sip/communicator/impl/callhistory/CallHistoryServiceImpl.java +++ b/src/net/java/sip/communicator/impl/callhistory/CallHistoryServiceImpl.java @@ -1213,6 +1213,9 @@ public void callStateChanged(CallChangeEvent evt) // no such call if (callRecord == null) return; + if (!CallChangeEvent.CALL_STATE_CHANGE + .equals(evt.getPropertyName())) + return; if (evt.getNewValue().equals(CallState.CALL_ENDED)) { diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java index f5504392e..692ba3df6 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java @@ -136,6 +136,9 @@ public void run() }); return; } + if (!CallChangeEvent.CALL_STATE_CHANGE + .equals(ev.getPropertyName())) + return; // When the call state changes, we ensure here that the // received call notification dialog is closed. diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java index 919efda01..ea2c15ccd 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java @@ -620,8 +620,13 @@ public void modifyVideoContent() if (logger.isDebugEnabled()) logger.debug("Updating video content for " + this); + boolean change = false; for (CallPeerJabberImpl peer : getCallPeerList()) - peer.sendModifyVideoContent(); + change |= peer.sendModifyVideoContent(); + + if (change) + fireCallChangeEvent( + CallChangeEvent.CALL_PARTICIPANTS_CHANGE, null, null); } /** diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java index 3c97e21a1..80d406112 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java @@ -1131,8 +1131,10 @@ private MediaDirection getDirectionForJingle(MediaType mediaType) * CallPeer, or content-remove if we stop video and video is * enabled for the CallPeer. * + * @return true if a modification was done (a Jingle message was + * sent). */ - public void sendModifyVideoContent() + public boolean sendModifyVideoContent() { CallPeerMediaHandlerJabberImpl mediaHandler = getMediaHandler(); MediaDirection direction = getDirectionForJingle(MediaType.VIDEO); @@ -1145,7 +1147,7 @@ public void sendModifyVideoContent() if (direction == MediaDirection.INACTIVE) { // no video content, none needed - return; + return false; } else { @@ -1154,8 +1156,9 @@ public void sendModifyVideoContent() if (logger.isInfoEnabled()) logger.info("Adding video content for " + this); sendAddVideoContent(); + return true; } - return; + return false; } } else @@ -1165,7 +1168,7 @@ public void sendModifyVideoContent() // We could send a content-remove in this case, but instead // we just set senders=none //sendRemoveVideoContent(); - //return; + //return true; } } @@ -1219,6 +1222,8 @@ else if (MediaDirection.SENDONLY == direction) { logger.warn("Exception occurred during media reinitialization", e); } + + return true; } /** diff --git a/src/net/java/sip/communicator/service/protocol/Call.java b/src/net/java/sip/communicator/service/protocol/Call.java index a46ada219..9caf356ae 100644 --- a/src/net/java/sip/communicator/service/protocol/Call.java +++ b/src/net/java/sip/communicator/service/protocol/Call.java @@ -326,8 +326,7 @@ protected void fireCallChangeEvent( String type, new CallChangeListener[callListeners.size()]); } for (CallChangeListener listener : listeners) - if(type.equals(CallChangeEvent.CALL_STATE_CHANGE)) - listener.callStateChanged(event); + listener.callStateChanged(event); } /** diff --git a/src/net/java/sip/communicator/service/protocol/CallConference.java b/src/net/java/sip/communicator/service/protocol/CallConference.java index ef193f2a2..bc0cc1540 100644 --- a/src/net/java/sip/communicator/service/protocol/CallConference.java +++ b/src/net/java/sip/communicator/service/protocol/CallConference.java @@ -467,7 +467,9 @@ private void callStateChanged(CallChangeEvent ev) } finally { - if (CallState.CALL_ENDED.equals(ev.getNewValue())) + if (CallChangeEvent.CALL_STATE_CHANGE + .equals(ev.getPropertyName()) + && CallState.CALL_ENDED.equals(ev.getNewValue())) { /* * Should not be vital because Call will remove itself. diff --git a/src/net/java/sip/communicator/service/protocol/event/CallChangeEvent.java b/src/net/java/sip/communicator/service/protocol/event/CallChangeEvent.java index f50510363..5f5d9a0f3 100644 --- a/src/net/java/sip/communicator/service/protocol/event/CallChangeEvent.java +++ b/src/net/java/sip/communicator/service/protocol/event/CallChangeEvent.java @@ -27,6 +27,15 @@ public class CallChangeEvent */ public static final String CALL_STATE_CHANGE = "CallState"; + /** + * The type of CallChangeEvent which indicates that there was some + * kind of change in the participants in the associated Call (e.g. + * a CallPeer participating in the Call has enabled + * or disabled video) + */ + public static final String CALL_PARTICIPANTS_CHANGE + = "CallParticipantsChanged"; + /** * Serial version UID. */ diff --git a/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetTelephonyConferencing.java b/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetTelephonyConferencing.java index 21d91c1db..00a9d104b 100644 --- a/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetTelephonyConferencing.java +++ b/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetTelephonyConferencing.java @@ -308,6 +308,11 @@ private void callPeersChanged(CallPeerEvent event) */ public void callStateChanged(CallChangeEvent event) { + if (CallChangeEvent.CALL_PARTICIPANTS_CHANGE + .equals(event.getPropertyName())) + { + notifyAll(event.getSourceCall()); + } } /** diff --git a/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java b/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java index b79be4ee9..3b2f2563d 100644 --- a/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java +++ b/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java @@ -664,6 +664,10 @@ public void propertyChange(PropertyChangeEvent evt) */ public void callStateChanged(CallChangeEvent evt) { + if (!CallChangeEvent.CALL_STATE_CHANGE + .equals(evt.getPropertyName())) + return; + if (CallState.CALL_ENDED.equals(evt.getNewValue())) recorder.stop(); }