@Override public void presenceChanged(final org.jivesoftware.smack.packet.Presence presence) { String localJID; try { localJID = getLocalJid(); } catch (FriendException e) { localJID = null; } if (!presence.getFrom().equals(localJID)) { XMPPFriendImpl friend = getFriend(presence); if (friend != null) { LOG.debugf("presence from {0} changed to {1}", presence.getFrom(), presence.getType()); // synchronize to avoid updates or presences from being lost // better to replace that with a lock object private to this // connection class synchronized (friend) { if (presence.getType().equals(org.jivesoftware.smack.packet.Presence.Type.available)) { if (!friend.getPresences().containsKey(presence.getFrom())) { addNewPresence(friend, presence); } else { updatePresence(friend, presence); } } else if (presence .getType() .equals(org.jivesoftware.smack.packet.Presence.Type.unavailable)) { PresenceImpl p = (PresenceImpl) friend.getPresence(presence.getFrom()); if (p != null) { p.update(presence); friend.removePresense(p); } } } } else { LOG.debugf("no friend for presence {0}", presence.getFrom()); } } }