package org.limewire.facebook.service; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.json.JSONObject; import org.limewire.friend.api.FriendPresence; import org.limewire.friend.api.IncomingChatListener; import org.limewire.friend.api.MessageReader; import org.limewire.friend.api.MessageWriter; import org.limewire.friend.api.Network; import org.limewire.friend.api.feature.Feature; import org.limewire.friend.api.feature.FeatureRegistry; import org.limewire.friend.impl.AbstractFriend; import org.limewire.util.StringUtils; import com.google.inject.assistedinject.Assisted; import com.google.inject.Inject; public class FacebookFriend extends AbstractFriend { private final String id; private final JSONObject friend; private final Network network; private final Map<String, FacebookFriendPresence> presenceMap = new ConcurrentHashMap<String, FacebookFriendPresence>(); private final boolean hasLimeWireAppInstalled; private final FeatureRegistry featureRegistry; private final FacebookFriendConnection connection; @Inject public FacebookFriend(@Assisted String id, @Assisted JSONObject friend, @Assisted Network network, @Assisted boolean hasLimeWireAppInstalled, @Assisted FacebookFriendConnection connection, FeatureRegistry featureRegistry) { this.id = id; this.friend = friend; this.network = network; this.hasLimeWireAppInstalled = hasLimeWireAppInstalled; this.featureRegistry = featureRegistry; this.connection = connection; } @Override public String toString() { return StringUtils.toString(this); } @Override public String getId() { return id; } @Override public String getName() { return friend.optString("name", ""); } @Override public String getRenderName() { return getName(); } @Override public String getFirstName() { return friend.optString("first_name", ""); } @Override public MessageWriter createChat(MessageReader reader) { return connection.createChat(id, reader); } @Override public FriendPresence getActivePresence() { // ok to return null. fb only allows 1 presence at a time to be logged in return null; } @Override public Map<String, FriendPresence> getPresences() { return Collections.unmodifiableMap(new HashMap<String, FriendPresence>(presenceMap)); } @Override public Network getNetwork() { return network; } @Override public boolean hasActivePresence() { return false; } @Override public boolean isAnonymous() { return false; } @Override public boolean isSignedIn() { return !presenceMap.isEmpty(); } @Override public boolean isSubscribed() { return true; } @Override public void removeChatListener() { } @Override public void setChatListenerIfNecessary(IncomingChatListener listener) { connection.setIncomingChatListener(id, listener); } @Override public void setName(String name) { } void addPresence(FacebookFriendPresence presence) { presenceMap.put(presence.getPresenceId(), presence); } void removePresence(FacebookFriendPresence presence) { Collection<Feature> features = presence.getFeatures(); for(Feature feature : features) { featureRegistry.get(feature.getID()).removeFeature(presence); } presenceMap.remove(presence.getPresenceId()); } public boolean hasLimeWireAppInstalled() { return hasLimeWireAppInstalled; } public Locale getLocale() { String locale = friend.optString("locale"); if (locale == null) { return Locale.US; } else { int underscore = locale.indexOf('_'); return new Locale(locale.substring(0, underscore), locale.substring(underscore + 1, locale.length())); } } }