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 3f052c674..5c1460707 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 @@ -100,7 +100,7 @@ public void run() .hasEnabledVideoFormat(sourceCall.getProtocolProvider()); final ReceivedCallDialog receivedCallDialog = new ReceivedCallDialog(sourceCall, isVideoCall, - (CallManager.getActiveCalls().size() > 0)); + (CallManager.getInProgressCalls().size() > 0)); receivedCallDialog.setVisible(true); @@ -279,7 +279,7 @@ private static void answerCall(Call call, Call existingCall, boolean video) public static void answerCallInFirstExistingCall(Call call) { // Find the first existing call. - Iterator existingCallIter = getActiveCalls().iterator(); + Iterator existingCallIter = getInProgressCalls().iterator(); Call existingCall = existingCallIter.hasNext() ? existingCallIter.next() : null; @@ -1107,6 +1107,31 @@ public static Collection getActiveCalls() return activeCalls.keySet(); } + /** + * Returns a collection of all currently in progress calls. + * + * @return a collection of all currently in progress calls. + */ + public static Collection getInProgressCalls() + { + Set calls = activeCalls.keySet(); + ArrayList inProgressCalls = new ArrayList(calls.size()); + Iterator it = calls.iterator(); + Call tmpCall; + + while(it.hasNext()) + { + tmpCall = it.next(); + if(tmpCall.getCallState() == CallState.CALL_IN_PROGRESS) + { + inProgressCalls.add(tmpCall); + } + } + + //return calls; + return inProgressCalls; + } + /** * Returns the CallContainer corresponding to the given * call. If the call has been finished and no active diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java index ce8689810..ae759a4a4 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java @@ -337,6 +337,12 @@ public CallPanel(Call call, CallContainer callWindow) // Adds a CallChangeListener that would receive events when a peer is // added or removed, or the state of the call has changed. call.addCallChangeListener(this); + Iterator calls = CallManager.getActiveCalls().iterator(); + while(calls.hasNext()) + { + calls.next().addCallChangeListener(this); + } + // Adds the CallPeerConferenceListener that would listen for changes in // the focus state of each call peer. @@ -495,7 +501,7 @@ public void actionPerformed(ActionEvent evt) if (buttonName.equals(MERGE_BUTTON)) { - Collection calls = CallManager.getActiveCalls(); + Collection calls = CallManager.getInProgressCalls(); CallManager.mergeExistingCall(call, calls); } @@ -922,7 +928,9 @@ public void callPeerRemoved(CallPeerEvent evt) } public void callStateChanged(CallChangeEvent evt) - {} + { + updateMergeButtonState(); + } /** * Updates CallPeer related components to fit the new focus state. @@ -1699,6 +1707,7 @@ public void disposeCallInfoFrame() public void incomingCallReceived(CallEvent event) { updateMergeButtonState(); + event.getSourceCall().addCallChangeListener(this); } /** @@ -1707,6 +1716,7 @@ public void incomingCallReceived(CallEvent event) public void outgoingCallCreated(CallEvent event) { updateMergeButtonState(); + event.getSourceCall().addCallChangeListener(this); } /** @@ -1715,6 +1725,16 @@ public void outgoingCallCreated(CallEvent event) public void callEnded(CallEvent event) { updateMergeButtonState(); + Call evtCall = event.getSourceCall(); + evtCall.removeCallChangeListener(this); + if(evtCall.equals(this.call)) + { + Iterator calls = CallManager.getActiveCalls().iterator(); + while(calls.hasNext()) + { + calls.next().removeCallChangeListener(this); + } + } } /** @@ -1723,7 +1743,7 @@ public void callEnded(CallEvent event) public void updateMergeButtonState() { Collection calls - = new ArrayList(CallManager.getActiveCalls()); + = new ArrayList(CallManager.getInProgressCalls()); if (calls.size() == 1) { diff --git a/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java b/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java index 126c6e505..48288720b 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java @@ -394,7 +394,7 @@ private synchronized void startSendingDtmfTone(DTMFToneInfo info) } else { - Collection activeCalls = CallManager.getActiveCalls(); + Collection activeCalls = CallManager.getInProgressCalls(); if (activeCalls != null) { @@ -459,7 +459,7 @@ public synchronized void stopSendingDtmfTone() } else { - Collection activeCalls = CallManager.getActiveCalls(); + Collection activeCalls = CallManager.getInProgressCalls(); if (activeCalls != null) { diff --git a/src/net/java/sip/communicator/impl/gui/main/call/TransferCallButton.java b/src/net/java/sip/communicator/impl/gui/main/call/TransferCallButton.java index 6f31bec20..4174c0d2a 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/TransferCallButton.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/TransferCallButton.java @@ -107,7 +107,8 @@ private void transferCall() private Collection getTransferCallPeers() { Collection transferCalls = null; - Iterator activeCalls = CallManager.getActiveCalls().iterator(); + Iterator activeCalls + = CallManager.getInProgressCalls().iterator(); while (activeCalls.hasNext()) { Call activeCall = activeCalls.next();