package xmpp.client.service.user.contact; import java.util.ArrayList; import java.util.Collections; import xmpp.client.service.user.User; import xmpp.client.service.user.UserList; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; public class ContactList extends ArrayList<Contact> implements Parcelable { /** * */ private static final long serialVersionUID = 1L; private final boolean mHideTransports = true; public static final Parcelable.Creator<ContactList> CREATOR = new Parcelable.Creator<ContactList>() { @Override public ContactList createFromParcel(Parcel in) { return new ContactList(in); } @Override public ContactList[] newArray(int size) { return new ContactList[size]; } }; public ContactList() { super(); } private ContactList(Parcel in) { super(); final int size = in.readInt(); for (int i = 0; i < size; i++) { add((Contact) in.readParcelable(Contact.class.getClassLoader())); } } public ContactList(UserList userList) { this(); for (final User user : userList) { add(user); } } public synchronized void add(User user) { Log.d("ContactProvider", user.getFullUserLogin() + ":" + user.getDisplayName()); for (final Contact contact : this) { if (contact.getUserName().equalsIgnoreCase(user.getDisplayName())) { if (user.isMUCUser()) { Log.d("ContactProvider", user.getDisplayName() + "=" + contact.getUserName()); } contact.add(user); return; } if (user.isMUCUser()) { final String jid = user.getAdditionalInformation(0); if (jid != null && contact.contains(jid, false)) { if (user.isMUCUser()) { Log.d("ContactProvider", user.getDisplayName() + "=" + contact.getUserName()); } contact.add(user); return; } } } Log.d("ContactProvider", user.getDisplayName() + "=new"); add(new Contact(user)); } @Deprecated public synchronized boolean contains(String uid) { for (final Contact contact : this) { if (contact.contains(uid, false)) { return true; } } return false; } public synchronized boolean contains(User user) { for (final Contact contact : this) { if (contact.contains(user)) { return true; } } return false; } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Deprecated public synchronized Contact get(String uid) { for (final Contact contact : this) { if (contact.contains(uid, false)) { return contact; } } return null; } public synchronized Contact get(User user) { for (final Contact contact : this) { if (contact.contains(user)) { return contact; } } return null; } private synchronized ContactList getGroup(CharSequence activeGroup) { final ContactList list = new ContactList(); for (final Contact contact : this) { for (final User user : contact.getUsers()) { if (user.getGroups().contains(activeGroup)) { list.add(contact); break; } } } return list; } public synchronized Contact getInGroup(CharSequence activeGroup, int position) { return getGroup(activeGroup).get(position); } public synchronized Contact getOnline(int i) { int c = 0; for (int j = 0; j < size(); j++) { if (get(j).getUserState().isOnline()) { if (c == i) { return get(j); } else { c++; } } } return null; } public synchronized int groupSize(CharSequence activeGroup) { return getGroup(activeGroup).sizeVisible(); } public synchronized void removeUser(String address) { for (final Contact contact : this) { if (contact.contains(address, false)) { contact.remove(address); return; } } } public synchronized int sizeOffline() { return sizeVisible() - sizeOnline(); } public synchronized int sizeOnline() { int num = 0; for (final Contact contact : this) { if (contact.getUser().isInvisible()) { continue; } if (contact.getUserState().isOnline()) { num++; } } return num; } public synchronized int sizeVisible() { if (mHideTransports) { int i = 0; for (final Contact contact : this) { if (!contact.getUser().isInvisible()) { i++; } } return i; } else { return size(); } } public synchronized void sort() { Collections.sort(this); } @Override public synchronized void writeToParcel(Parcel dest, int flags) { dest.writeInt(size()); for (int i = 0; i < size(); i++) { dest.writeParcelable(get(i), flags); } } }