aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamian Minkov <damencho@jitsi.org>2013-10-07 23:46:10 +0300
committerDamian Minkov <damencho@jitsi.org>2013-10-07 23:46:10 +0300
commitb87a71cca09d25509b283ab2f9a572aa84c77a35 (patch)
tree831d55bdef9f96d39616cc9c7c87cbfce95c7bb2
parentd3978404507be5f34c9b7e665dd913db84c3ce48 (diff)
downloadjitsi-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.
-rw-r--r--src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java5
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/ContactResourceJabberImpl.java9
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java35
-rw-r--r--src/net/java/sip/communicator/service/protocol/AbstractOperationSetPersistentPresence.java13
-rw-r--r--src/net/java/sip/communicator/service/protocol/ContactResource.java2
-rw-r--r--src/net/java/sip/communicator/service/protocol/event/ContactPresenceStatusChangeEvent.java39
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;
+ }
}