package xmpp.client.service.user;
import java.util.Collection;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.util.StringUtils;
import xmpp.client.service.MainService;
import xmpp.client.service.user.contact.Contact;
import xmpp.client.service.user.contact.ContactList;
import xmpp.client.service.user.group.GroupList;
import android.util.Log;
public class UserService implements RosterListener, UserServiceProvider {
private static final String TAG = UserService.class.getName();
private UserList mUserList;
private ContactList mContactList;
private Roster mRoster;
private final MainService service;
private User mUserMe;
public UserService(MainService service, User userMe) {
this.service = service;
mUserMe = userMe;
mRoster = service.getConnection().getRoster();
mRoster.addRosterListener(this);
mUserList = new UserList();
mContactList = new ContactList();
buildUserList();
}
public User addUser(String uid) {
return addUser(uid, uid);
}
public User addUser(String uid, String name) {
return addUser(uid, name, new String[] { getGroups().get(0) });
}
public User addUser(String uid, String name, String group) {
return addUser(uid, name, new String[] { group });
}
public User addUser(String uid, String name, String[] groups) {
try {
mRoster.createEntry(uid, name, groups);
} catch (final Exception e) {
Log.i(TAG, "addUser", e);
return null;
}
return getUser(uid, true);
}
public User addUser(String uid, String[] groups) {
return addUser(uid, uid, groups);
}
public void buildUserList() {
final Collection<RosterEntry> roster = mRoster.getEntries();
for (final RosterEntry rosterEntry : roster) {
getUser(rosterEntry.getUser(), true);
}
transportCheck();
}
public void destroy() {
mUserList.clear();
mUserList = null;
mContactList.clear();
mContactList = null;
mRoster.removeRosterListener(this);
mRoster = null;
mUserMe = null;
}
@Override
public void entriesAdded(Collection<String> addresses) {
for (final String uid : addresses) {
getUser(uid, true);
}
}
@Override
public void entriesDeleted(Collection<String> addresses) {
for (final String uid : addresses) {
final User user = getUser(uid, false);
mUserList.remove(user);
mContactList.removeUser(uid);
service.sendRosterDeleted(uid);
}
}
@Override
public void entriesUpdated(Collection<String> addresses) {
for (final String uid : addresses) {
final User user = getUser(uid, true);
final RosterEntry re = mRoster.getEntry(uid);
user.setUserName(re.getName());
user.setGroups(new GroupList(re.getGroups()));
service.sendRosterUpdated(user);
}
}
public Contact getContact(String uid, boolean addIfNotExists) {
return getContact(getUser(uid, addIfNotExists), addIfNotExists);
}
public Contact getContact(User user, boolean addIfNotExists) {
if (!mContactList.contains(user)) {
return new Contact(user);
}
return mContactList.get(user);
}
public ContactList getContactList() {
return new ContactList(mUserList);
}
GroupList getGroups() {
return new GroupList(mRoster.getGroups());
}
public User getUser(String uid, boolean addIfNotExists) {
return getUser(uid, addIfNotExists, true);
}
public User getUser(String uid, boolean addIfNotExists,
boolean setupIfNotExists) {
if (mUserMe.getUserLogin().equalsIgnoreCase(
StringUtils.parseBareAddress(uid))) {
return mUserMe;
}
User u = getUserByFullUserLogin(uid);
if (u != null) {
return u;
}
u = getUserByLogin(uid);
if (u != null) {
return u;
}
if (setupIfNotExists) {
return setupUser(uid, addIfNotExists);
} else {
return null;
}
}
public User getUserByFullUserLogin(String fullUserLogin) {
for (int i = 0; i < mUserList.size(); i++) {
final User user = mUserList.get(i);
if (user.getFullUserLogin().equalsIgnoreCase(fullUserLogin)) {
return user;
}
}
return null;
}
private User getUserByLogin(String userLogin) {
for (int i = 0; i < mUserList.size(); i++) {
final User user = mUserList.get(i);
if (user.getUserLogin().equalsIgnoreCase(
StringUtils.parseBareAddress(userLogin))) {
return user;
}
}
return null;
}
UserList getUserList() {
return mUserList;
}
public User getUserMe() {
return mUserMe;
}
@Override
public UserService getUserService() {
return this;
}
@Override
public void presenceChanged(Presence presence) {
final User user = getUser(presence.getFrom(), true, false);
if (user == null) {
return;
}
user.setUserState(new UserState(presence));
user.setAvatar(service.getAvatarService().getAvatar(user));
user.setRessource(StringUtils.parseResource(presence.getFrom()));
service.sendRosterUpdated(user);
}
public User setupUser(String uid, boolean addIfNotExists) {
final RosterEntry re = mRoster.getEntry(StringUtils
.parseBareAddress(uid));
if (re != null) {
final User user = new User(re, mRoster.getPresence(re.getUser()));
user.setAvatar(service.getAvatarService().getAvatar(user));
if (addIfNotExists) {
setupUser(user);
}
return user;
} else {
Log.w(TAG, "creating Invalid user for: " + uid);
final User u = new User();
u.setUserLogin(uid);
u.setUserState(UserState.Invalid);
return u;
}
}
public User setupUser(User user) {
final User user2 = getUserByFullUserLogin(user.getFullUserLogin());
if (user2 == null) {
mUserList.add(user);
mContactList.add(user);
service.sendRosterAdded(user);
return user;
} else {
user2.setUserState(user.getUserState());
service.sendRosterUpdated(user2);
return user2;
}
}
public void setUserMe(User user) {
mUserMe = user;
}
void transportCheck() {
final UserList transportList = new UserList();
for (final User user : mUserList) {
if (user.getTransportState() == User.TSTATE_IS_TRANSPORT) {
transportList.add(user);
}
}
for (final User user : mUserList) {
if (!transportList.contains(user)) {
for (final User transport : transportList) {
user.transportCheck(transport);
}
}
}
}
public void updateUser(User user) {
final User u = getUser(user.getUserLogin(), true);
u.setUserContact(user.getUserContact());
}
}