diff options
author | Damian Minkov <damencho@jitsi.org> | 2013-10-07 23:46:10 +0300 |
---|---|---|
committer | Damian Minkov <damencho@jitsi.org> | 2013-10-07 23:46:10 +0300 |
commit | b87a71cca09d25509b283ab2f9a572aa84c77a35 (patch) | |
tree | 831d55bdef9f96d39616cc9c7c87cbfce95c7bb2 | |
parent | d3978404507be5f34c9b7e665dd913db84c3ce48 (diff) | |
download | jitsi-b87a71cca09d25509b283ab2f9a572aa84c77a35.zip jitsi-b87a71cca09d25509b283ab2f9a572aa84c77a35.tar.gz jitsi-b87a71cca09d25509b283ab2f9a572aa84c77a35.tar.bz2 |
Fixes a problem with updating resource priorities. Updates contactlist items on resource change, even if presence status was not changed.
6 files changed, 93 insertions, 10 deletions
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java index 6d9cbdd..d048c4b 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java @@ -357,8 +357,11 @@ public class MetaContactListSource public void contactPresenceStatusChanged( ContactPresenceStatusChangeEvent evt) { - if (evt.getOldStatus() == evt.getNewStatus()) + if (evt.getOldStatus() == evt.getNewStatus() + && !evt.isResourceChanged()) + { return; + } final Contact sourceContact = evt.getSourceContact(); final MetaContact metaContact diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ContactResourceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ContactResourceJabberImpl.java index 8a9e737..58a6302 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ContactResourceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ContactResourceJabberImpl.java @@ -72,4 +72,13 @@ public class ContactResourceJabberImpl { this.mobile = isMobile; } + + /** + * Changes resource priority. + * @param priority the new priority + */ + public void setPriority(int priority) + { + this.priority = priority; + } } 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 9da6d7d..3e0d433 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java @@ -968,16 +968,18 @@ public class OperationSetPersistentPresenceJabberImpl * Updates the resources for the contact. * @param contact the contact which resources to update. * @param removeUnavailable whether to remove unavailable resources. + * @return whether resource has been updated */ - private void updateResources(ContactJabberImpl contact, + private boolean updateResources(ContactJabberImpl contact, boolean removeUnavailable) { if (!contact.isResolved() || (contact instanceof VolatileContactJabberImpl && ((VolatileContactJabberImpl)contact) .isPrivateMessagingContact())) - return; + return false; + boolean eventFired = false; Map<String, ContactResourceJabberImpl> resources = contact.getResourcesMap(); @@ -1021,33 +1023,45 @@ public class OperationSetPersistentPresenceJabberImpl contact.fireContactResourceEvent( new ContactResourceEvent(contact, contactResource, ContactResourceEvent.RESOURCE_ADDED)); + eventFired = true; } else { boolean oldIndicator = contactResource.isMobile(); boolean newIndicator = mobileIndicator.isMobileResource(resource, fullJid); + int oldPriority = contactResource.getPriority(); // update mobile indicator, as cabs maybe added after // creating the resource for the contact contactResource.setMobile(newIndicator); + contactResource.setPriority(presence.getPriority()); + if(oldPriority != contactResource.getPriority()) + { + // priority has been updated so update and the + // mobile indicator before firing an event + mobileIndicator.resourcesUpdated(contact); + } + if (contactResource.getPresenceStatus().getStatus() != newPresenceStatus.getStatus() - || (oldIndicator != newIndicator)) + || (oldIndicator != newIndicator) + || (oldPriority != contactResource.getPriority())) { contactResource.setPresenceStatus(newPresenceStatus); contact.fireContactResourceEvent( new ContactResourceEvent(contact, contactResource, ContactResourceEvent.RESOURCE_MODIFIED)); + eventFired = true; } } } } if(!removeUnavailable) - return; + return eventFired; Iterator<String> resourceIter = resources.keySet().iterator(); while (resourceIter.hasNext()) @@ -1066,9 +1080,12 @@ public class OperationSetPersistentPresenceJabberImpl contact.fireContactResourceEvent( new ContactResourceEvent(contact, removedResource, ContactResourceEvent.RESOURCE_REMOVED)); + eventFired = true; } } } + + return eventFired; } /** @@ -1276,7 +1293,8 @@ public class OperationSetPersistentPresenceJabberImpl // When status changes this may be related to a change in the // available resources. - updateResources(sourceContact, true); + boolean oldMobileIndicator = sourceContact.isMobile(); + boolean resourceUpdated = updateResources(sourceContact, true); mobileIndicator.resourcesUpdated(sourceContact); PresenceStatus oldStatus @@ -1288,8 +1306,11 @@ public class OperationSetPersistentPresenceJabberImpl // when old and new status are the same do nothing // no change - if(oldStatus.equals(newStatus)) + if(oldStatus.equals(newStatus) + && oldMobileIndicator == sourceContact.isMobile()) + { return; + } sourceContact.updatePresenceStatus(newStatus); @@ -1299,7 +1320,7 @@ public class OperationSetPersistentPresenceJabberImpl if (logger.isDebugEnabled()) logger.debug("Will Dispatch the contact status event."); fireContactPresenceStatusChangeEvent(sourceContact, parent, - oldStatus, newStatus); + oldStatus, newStatus, resourceUpdated); } catch (IllegalStateException ex) { diff --git a/src/net/java/sip/communicator/service/protocol/AbstractOperationSetPersistentPresence.java b/src/net/java/sip/communicator/service/protocol/AbstractOperationSetPersistentPresence.java index 0d27616..ad4eb6d 100644 --- a/src/net/java/sip/communicator/service/protocol/AbstractOperationSetPersistentPresence.java +++ b/src/net/java/sip/communicator/service/protocol/AbstractOperationSetPersistentPresence.java @@ -166,13 +166,24 @@ public abstract class AbstractOperationSetPersistentPresence<T extends ProtocolP PresenceStatus oldValue, PresenceStatus newValue) { + this.fireContactPresenceStatusChangeEvent( + source, parentGroup, oldValue, newValue, false); + } + + public void fireContactPresenceStatusChangeEvent(Contact source, + ContactGroup parentGroup, + PresenceStatus oldValue, + PresenceStatus newValue, + boolean isResourceChange) + { ContactPresenceStatusChangeEvent evt = new ContactPresenceStatusChangeEvent( source, parentProvider, parentGroup, oldValue, - newValue); + newValue, + isResourceChange); Collection<ContactPresenceStatusListener> listeners; synchronized (contactPresenceStatusListeners) diff --git a/src/net/java/sip/communicator/service/protocol/ContactResource.java b/src/net/java/sip/communicator/service/protocol/ContactResource.java index 954a66e..3a766b6 100644 --- a/src/net/java/sip/communicator/service/protocol/ContactResource.java +++ b/src/net/java/sip/communicator/service/protocol/ContactResource.java @@ -41,7 +41,7 @@ public class ContactResource /** * The priority of this contact source. */ - private int priority; + protected int priority; /** * Whether this contact resource is a mobile one. diff --git a/src/net/java/sip/communicator/service/protocol/event/ContactPresenceStatusChangeEvent.java b/src/net/java/sip/communicator/service/protocol/event/ContactPresenceStatusChangeEvent.java index dd12e47..80f0832 100644 --- a/src/net/java/sip/communicator/service/protocol/event/ContactPresenceStatusChangeEvent.java +++ b/src/net/java/sip/communicator/service/protocol/event/ContactPresenceStatusChangeEvent.java @@ -33,6 +33,12 @@ public class ContactPresenceStatusChangeEvent extends PropertyChangeEvent private ContactGroup parentGroup = null; /** + * When not the status but just the resource of the contact has changed, + * for those protocols that support resources. + */ + private boolean resourceChanged = false; + + /** * Creates an event instance indicating that the specified source contact * has changed status from <tt>oldValue</tt> to <tt>newValue</tt>. * @param source the provider that generated the event @@ -50,12 +56,35 @@ public class ContactPresenceStatusChangeEvent extends PropertyChangeEvent PresenceStatus oldValue, PresenceStatus newValue) { + this(source, sourceProvider, parentGroup, oldValue, newValue, false); + } + + /** + * Creates an event instance indicating that the specified source contact + * has changed status from <tt>oldValue</tt> to <tt>newValue</tt>. + * @param source the provider that generated the event + * @param sourceProvider the protocol provider that the contact belongs to. + * @param parentGroup the group containing the contact that caused this + * event (to be set as null in cases where groups are not supported); + * @param oldValue the status the source countact was in before enetering + * the new state. + * @param newValue the status the source contact is currently in. + */ + public ContactPresenceStatusChangeEvent( + Contact source, + ProtocolProviderService sourceProvider, + ContactGroup parentGroup, + PresenceStatus oldValue, + PresenceStatus newValue, + boolean resourceChanged) + { super( source, ContactPresenceStatusChangeEvent.class.getName(), oldValue, newValue); this.sourceProvider = sourceProvider; this.parentGroup = parentGroup; + this.resourceChanged = resourceChanged; } /** @@ -127,4 +156,14 @@ public class ContactPresenceStatusChangeEvent extends PropertyChangeEvent .append(", NewStatus=").append(getNewStatus()).append("]").toString(); } + /** + * When the event fired is change in the resource of the contact will + * return <tt>true</tt>. + * @return the event fired is only for change in the resource of + * the contact. + */ + public boolean isResourceChanged() + { + return resourceChanged; + } } |