package ru.denull.wire.model; import java.util.*; import javax.swing.AbstractListModel; import javax.swing.JList; import javax.swing.SwingUtilities; import ru.denull.mtproto.DataService; import ru.denull.mtproto.Server; import ru.denull.mtproto.Server.RPCCallback; import ru.denull.wire.Utils; import tl.*; import tl.TMessage; import tl.contacts.*; import tl.messages.*; public class ContactListModel extends AbstractListModel { private static final long serialVersionUID = 4456613715657495764L; private DataService service; private JList list; boolean loading = false, loadingFromCache = false; boolean initializing = false; boolean cachedData = true; int total = -1; int loaded = 0; int first_id = 0; ArrayList<Integer> items = new ArrayList<Integer>(); ArrayList<Integer> filtered = null; String filterQuery = null; String missingText = "<html><center>У вас нет ни одного контакта.<br/>Вы можете импортировать их в меню «Контакты».</center></html>"; public ContactListModel(DataService service, JList list) { this.service = service; this.list = list; //peer_id = Utils.getPeerID(peer, service.me); //reloadDialogs(); } public void setMissingText(String text) { missingText = text; } public Object getElementAt(int index) { return (filtered == null) ? (index < items.size() ? items.get(index) : missingText) : (index < filtered.size() ? filtered.get(index) : "Никого не найдено"); } public int getSize() { return Math.max(1, (filtered == null) ? items.size() : filtered.size()); } public boolean isEmpty() { return (filtered == null) ? items.isEmpty() : filtered.isEmpty(); } public void filter(String query) { filter(query, false); } public void filter(String query, boolean force) { if (query != null) { query = query.trim().toLowerCase(); } if (!force && filterQuery != null && filterQuery.equals(query)) { return; } if (query == null || query.length() == 0) { filtered = null; filterQuery = null; fireContentsChanged(this, 0, getSize() - 1); return; } filtered = new ArrayList<Integer>(); for (Integer user_id : items) { TUser user = service.userManager.get(user_id); boolean matches = (user.first_name + " " + user.last_name).toLowerCase().indexOf(query) >= 0 || (user.last_name + " " + user.first_name).toLowerCase().indexOf(query) >= 0; if (matches) { filtered.add(user_id); } } filterQuery = query; fireContentsChanged(this, 0, getSize() - 1); } public void updateContents() { fireContentsChanged(this, 0, getSize() - 1); } public void updateContents(int user_id) { if (isEmpty()) return; for (int i = 0; i < getSize(); i++) { if ((Integer) getElementAt(i) == user_id) { fireContentsChanged(this, i, i); return; } } } public void add(int user_id, boolean unique) { if (unique) { for (Integer id : items) { if (id == user_id) { return; } } } service.contactManager.store(user_id, -user_id, false); items.add(user_id); sort(); filter(filterQuery, true); } public boolean contains(int user_id) { for (Integer id : items) { if (id == user_id) { return true; } } return false; } public void add(TChatParticipant[] participants) { if (participants == null) return; for (TChatParticipant part : participants) { items.add(part.user_id); service.contactManager.store(part.user_id, -part.user_id, false); } sort(); filter(filterQuery, true); } public void add(ImportedContacts result) { service.userManager.store(result.users); for (TImportedContact contact : result.imported) { boolean unique = true; for (Integer id : items) { if (id == contact.user_id) { unique = false; break; } } if (unique) { items.add(contact.user_id); service.contactManager.store(contact.user_id, -contact.user_id, false); } } sort(); filter(filterQuery, true); } public void remove(int index) { items.remove(index); sort(); filter(filterQuery, true); } public void removeUser(int user_id) { items.remove((Integer) user_id); sort(); filter(filterQuery, true); } public void reload() { boolean force = true; final boolean cachedData = false; if (service.mainServer == null/* || !service.mainServer.transport.isConnected()*/){ //Log.i(TAG, "Not yet connected, stop"); return; } //Log.i(TAG, "loading = " + service.dialogManager.loading); if (service.contactManager.loading) return; service.mainServer.call(new GetContacts(service.contactManager.updateHash()), new RPCCallback<TContacts>() { public void done(TContacts result) { if (result instanceof Contacts) { items.clear(); for (TContact contact : ((Contacts) result).contacts) { service.contactManager.store( ((Contact) contact).user_id, -((Contact) contact).user_id, ((Contact) contact).mutual); items.add(contact.user_id); } service.userManager.store(((Contacts) result).users); } sort(); filter(filterQuery, true); } public void error(int code, String message) { //Log.e(TAG, "Unable to get contacts"); } }); } public void sort() { Collections.sort(items, new Comparator<Integer>() { public int compare(Integer a, Integer b) { TUser userA = service.userManager.get(a); TUser userB = service.userManager.get(b); return (userA.last_name + " " + userA.first_name).compareTo(userB.last_name + " " + userB.first_name); } }); } }