package org.limewire.friend.impl; import java.util.Collection; import org.limewire.friend.api.Friend; import org.limewire.friend.api.FriendPresence; import org.limewire.friend.api.FriendPresenceEvent; import org.limewire.friend.api.MutableFriendManager; import org.limewire.friend.api.PresenceEvent; import org.limewire.friend.api.RosterEvent; import org.limewire.inject.EagerSingleton; import org.limewire.listener.EventBroadcaster; import org.limewire.listener.EventListener; import org.limewire.listener.ListenerSupport; import com.google.inject.Inject; @EagerSingleton class FriendListListeners { private final PresenceListener presenceListener = new PresenceListener(); private final MutableFriendManager friendManager; private final EventBroadcaster<FriendPresenceEvent> friendPresenceBroadcaster; @Inject FriendListListeners(MutableFriendManager friendManager, EventBroadcaster<FriendPresenceEvent> friendPresenceBroadcaster) { this.friendManager = friendManager; this.friendPresenceBroadcaster = friendPresenceBroadcaster; } @Inject void register(ListenerSupport<RosterEvent> rosterListeners) { rosterListeners.addListener(new EventListener<RosterEvent>() { @Override public void handleEvent(RosterEvent event) { Collection<Friend> friends = event.getData(); switch(event.getType()) { case FRIENDS_ADDED: addKnownFriends(friends); break; case FRIENDS_UPDATED: updateFriends(friends); break; case FRIENDS_DELETED: removeKnownFriends(friends); break; } } }); } private void addKnownFriends(Collection<Friend> friends) { for (Friend friend : friends) { addKnownFriend(friend); } } private void addKnownFriend(Friend friend) { if (friend.isSubscribed()) { friend.addPresenceListener(presenceListener); friendManager.addKnownFriend(friend); } } private void updateFriends(Collection<Friend> friends) { for (Friend friend : friends) { if (friend.isSubscribed()) { addKnownFriend(friend); } else { friendManager.removeKnownFriend(friend, true); } } } private void removeKnownFriends(Collection<Friend> friends) { for (Friend friend : friends) { friendManager.removeKnownFriend(friend, true); } } private void updatePresence(FriendPresence presence) { friendPresenceBroadcaster.broadcast(new FriendPresenceEvent(presence, FriendPresenceEvent.Type.UPDATE)); } private void addPresence(FriendPresence presence) { Friend friend = presence.getFriend(); if(friend.getPresences().size() == 1) { friendManager.addAvailableFriend(friend); } friendPresenceBroadcaster.broadcast(new FriendPresenceEvent(presence, FriendPresenceEvent.Type.ADDED)); } private void removePresence(FriendPresence presence) { Friend friend = presence.getFriend(); if(!friend.isSignedIn()) { friendManager.removeAvailableFriend(friend); } friendPresenceBroadcaster.broadcast(new FriendPresenceEvent(presence, FriendPresenceEvent.Type.REMOVED)); } private class PresenceListener implements EventListener<PresenceEvent> { @Override public void handleEvent(PresenceEvent event) { switch (event.getData().getType()) { case available: switch (event.getType()) { case PRESENCE_NEW: addPresence(event.getData()); break; case PRESENCE_UPDATE: updatePresence(event.getData()); break; } break; case unavailable: removePresence(event.getData()); break; } } } }