diff --git a/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java b/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java index 88c9db53c..4de7ba92b 100644 --- a/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java +++ b/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java @@ -71,9 +71,9 @@ public class CallHistorySourceContact implements SourceContact private final String displayDetails; /** - * Creates an instance of CallHistorySourceContact - * @param contactSource - * @param callRecord + * Creates an instance of CallHistorySourceContact + * @param contactSource the contact source + * @param callRecord the call record */ public CallHistorySourceContact(CallHistoryContactSource contactSource, CallRecord callRecord) @@ -129,8 +129,31 @@ private void initPeerDetails() = new Hashtable, ProtocolProviderService>(); - preferredProviders.put( OperationSetBasicTelephony.class, + OperationSetContactCapabilities opSetCaps = + preferredProvider.getOperationSet( + OperationSetContactCapabilities.class); + OperationSetPresence opSetPres = + preferredProvider.getOperationSet( + OperationSetPresence.class); + + if(opSetCaps != null && opSetPres != null) + { + Contact contact = opSetPres.findContactByID( + peerAddress); + if(contact != null && opSetCaps.getOperationSet( + contact, + OperationSetBasicTelephony.class) != null) + { + preferredProviders.put( + OperationSetBasicTelephony.class, + preferredProvider); + } + } + else + { + preferredProviders.put(OperationSetBasicTelephony.class, preferredProvider); + } contactDetail.setPreferredProviders(preferredProviders); } @@ -150,11 +173,18 @@ private void initPeerDetails() contactDetail.setPreferredProtocols(preferredProtocols); } - // Set supported operation sets. LinkedList> supportedOpSets = new LinkedList>(); - supportedOpSets.add(OperationSetBasicTelephony.class); + // if the contat supports call + if((preferredProviders != null && + preferredProviders.containsKey( + OperationSetBasicTelephony.class)) || + (preferredProtocols != null)) + { + supportedOpSets.add(OperationSetBasicTelephony.class); + } + contactDetail.setSupportedOpSets(supportedOpSets); contactDetails.add(contactDetail); @@ -267,7 +297,7 @@ public ContactDetail getPreferredContactDetail( /** * Returns the date string to show for the given date. - * + * * @param date the date to format * @return the date string to show for the given date */ diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java index 3f02971a1..e1331de9a 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java @@ -19,6 +19,7 @@ import net.java.sip.communicator.impl.gui.customcontrols.*; import net.java.sip.communicator.impl.gui.main.call.*; import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.service.contactsource.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.neomedia.*; import net.java.sip.communicator.service.neomedia.device.*; @@ -43,7 +44,13 @@ public class ContactListTreeCellRenderer Icon, Skinnable { + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + private static final Color glowOuterHigh = new Color(223, 238, 249, 100); + private static final Color glowOuterLow = new Color(219, 233, 243, 100); /** @@ -133,6 +140,9 @@ public class ContactListTreeCellRenderer */ protected final JLabel rightLabel = new JLabel(); + /** + * The message received image. + */ private Image msgReceivedImage; /** @@ -400,9 +410,9 @@ else if (value instanceof GroupNode) // We have no photo icon for groups. this.rightLabel.setIcon(null); - + if (groupItem.countChildContacts() >= 0) - this.rightLabel.setText( groupItem.countOnlineChildContacts() + this.rightLabel.setText( groupItem.countOnlineChildContacts() + "/" + groupItem.countChildContacts()); this.setToolTipText(groupItem.getDescriptor().toString()); @@ -614,7 +624,10 @@ private void initButtonsPanel(UIContact uiContact) = uiContact.getDefaultContactDetail( OperationSetBasicTelephony.class); - if (telephonyContact != null) + // for SourceContact in history that do not support telephony, we + // show the button but disabled + if (telephonyContact != null || + uiContact.getDescriptor() instanceof SourceContact) { constraints.anchor = GridBagConstraints.WEST; constraints.fill = GridBagConstraints.NONE; @@ -634,6 +647,7 @@ private void initButtonsPanel(UIContact uiContact) callButton.setBounds(x, nameLabel.getHeight() + statusMessageLabelHeight, 28, 28); + callButton.setEnabled(telephonyContact != null); } UIContactDetail videoContact @@ -727,7 +741,7 @@ public void paintIcon(Component c, Graphics g, int x, int y) getIconWidth() - 1, getIconHeight() - 1, 10, 10); - // Indent component content from the border. + // Indent component content from the border. g2.translate(x + 5, y + 5); super.paint(g2); diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java index 8299c515e..63b40f00e 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java @@ -25,7 +25,7 @@ /** * The right button menu for external contact sources. * @see ExternalContactSource - * + * * @author Yana Stamcheva * @author Adam Netocny */ @@ -33,6 +33,14 @@ public class SourceContactRightButtonMenu extends JPopupMenu implements Skinnable { + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + + /** + * The source contact. + */ private final SourceContact sourceContact; /** @@ -112,6 +120,8 @@ public void actionPerformed(ActionEvent e) CallManager.createCall(detail.getContactAddress()); } }); + callContactItem.setEnabled(detail.getSupportedOperationSets(). + contains(OperationSetBasicTelephony.class)); callContactMenu.add(callContactItem); } return callContactMenu; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetail.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetail.java index f9418762e..ad9ce3df1 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetail.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetail.java @@ -122,6 +122,7 @@ public String getPreferredProtocol(Class opSetClass) { return preferredProtocol; } + /** * Returns the PresenceStatus of this ContactDetail or * null if the detail doesn't support presence. diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java index 87cac63ce..a8b48bc0a 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java @@ -24,6 +24,9 @@ public class ExternalContactSource */ private final SourceUIGroup sourceUIGroup; + /** + * The contact source. + */ private final ContactSourceService contactSource; /** diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ContactGroupJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ContactGroupJabberImpl.java index 286436eeb..9bfc149cd 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ContactGroupJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ContactGroupJabberImpl.java @@ -9,7 +9,6 @@ import java.util.*; import org.jivesoftware.smack.*; -import org.jivesoftware.smack.packet.*; import net.java.sip.communicator.service.protocol.*; @@ -142,7 +141,6 @@ public class ContactGroupJabberImpl this.ssclCallback = ssclCallback; } - /** * Returns the number of Contact members of this * ContactGroup diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java index 262a4267a..d7ca13ed3 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java @@ -51,8 +51,8 @@ public class OperationSetPersistentPresenceJabberImpl private PresenceStatus currentStatus; /** - * A map containing bindings between SIP Communicator's jabber presence status - * instances and Jabber status codes + * A map containing bindings between SIP Communicator's jabber presence + * status instances and Jabber status codes */ private static Map scToJabberModesMappings = new Hashtable(); @@ -316,7 +316,8 @@ public void moveContactToGroup(Contact contactToMove, if( !(contactToMove instanceof ContactJabberImpl) ) throw new IllegalArgumentException( - "The specified contact is not an jabber contact." + contactToMove); + "The specified contact is not an jabber contact." + + contactToMove); if( !(newParent instanceof ContactGroupJabberImpl) ) throw new IllegalArgumentException( "The specified group is not an jabber contact group." @@ -529,9 +530,9 @@ public void setAuthorizationHandler(AuthorizationHandler handler) * subscribing fails due to errors experienced during network * communication */ - public void subscribe(ContactGroup parent, String contactIdentifier) throws - IllegalArgumentException, IllegalStateException, - OperationFailedException + public void subscribe(ContactGroup parent, String contactIdentifier) + throws IllegalArgumentException, IllegalStateException, + OperationFailedException { assertConnected(); @@ -647,7 +648,8 @@ else if(mode.equals(Presence.Mode.xa)) * @param status the jabberStatus * @return a PresenceStatus instance */ - public static Presence.Mode presenceStatusToJabberMode(PresenceStatus status) + public static Presence.Mode presenceStatusToJabberMode( + PresenceStatus status) { return scToJabberModesMappings.get(status .getStatusName()); @@ -906,7 +908,8 @@ void firePresenceStatusChanged(Presence presence) TreeSet userStats = statuses.get(userID); if(userStats == null) { - userStats = new TreeSet(new Comparator(){ + userStats = new TreeSet(new Comparator() + { public int compare(Presence o1, Presence o2) { int res = o1.getPriority() - o2.getPriority(); @@ -934,10 +937,12 @@ public int compare(Presence o1, Presence o2) } else { - String resource = StringUtils.parseResource(presence.getFrom()); + String resource = StringUtils.parseResource( + presence.getFrom()); // remove the status for this resource - // if we are online we will update its value with the new status + // if we are online we will update its value with the new + // status for (Iterator iter = userStats.iterator(); iter.hasNext();) { @@ -1114,7 +1119,8 @@ else if (presenceType == Presence.Type.unsubscribed) } catch(OperationFailedException e) { - logger.error("Cannot remove contact that unsubscribed."); + logger.error( + "Cannot remove contact that unsubscribed."); } } } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ServerStoredContactListJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ServerStoredContactListJabberImpl.java index 4243c12b7..02e6a5267 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ServerStoredContactListJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ServerStoredContactListJabberImpl.java @@ -13,6 +13,7 @@ import net.java.sip.communicator.util.*; import org.jivesoftware.smack.*; +import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.packet.*; import org.jivesoftware.smackx.packet.*; @@ -354,21 +355,21 @@ public ContactJabberImpl findContactById(String id) { Iterator contactGroups = rootGroup.subgroups(); ContactJabberImpl result = null; + String userId = StringUtils.parseBareAddress(id); while(contactGroups.hasNext()) { ContactGroupJabberImpl contactGroup = (ContactGroupJabberImpl)contactGroups.next(); - result = contactGroup.findContact(id); + result = contactGroup.findContact(userId); if (result != null) return result; - } //try the root group now - return rootGroup.findContact(id); + return rootGroup.findContact(userId); } /** diff --git a/src/net/java/sip/communicator/service/contactsource/ContactDetail.java b/src/net/java/sip/communicator/service/contactsource/ContactDetail.java index b014adcd4..4ac73c53e 100644 --- a/src/net/java/sip/communicator/service/contactsource/ContactDetail.java +++ b/src/net/java/sip/communicator/service/contactsource/ContactDetail.java @@ -55,7 +55,7 @@ public class ContactDetail private Map, String> preferredProtocols; /** - * A list of all supported OperatioSet classes. + * A list of all supported OperationSet classes. */ private List> supportedOpSets = null;