Search in sources :

Example 1 with CommonState

use of com.xabber.android.data.account.CommonState in project xabber-android by redsolution.

the class ContactListAdapter method onChange.

@Override
public void onChange() {
    synchronized (refreshLock) {
        refreshRequested = false;
        refreshInProgress = true;
        handler.removeCallbacks(this);
    }
    final Collection<RosterContact> allRosterContacts = RosterManager.getInstance().getContacts();
    Map<String, Collection<String>> blockedContacts = new TreeMap<>();
    for (String account : AccountManager.getInstance().getAccounts()) {
        blockedContacts.put(account, BlockingManager.getInstance().getBlockedContacts(account));
    }
    final Collection<RosterContact> rosterContacts = new ArrayList<>();
    for (RosterContact contact : allRosterContacts) {
        if (blockedContacts.containsKey(contact.getAccount())) {
            if (!blockedContacts.get(contact.getAccount()).contains(contact.getUser())) {
                rosterContacts.add(contact);
            }
        }
    }
    final boolean showOffline = SettingsManager.contactsShowOffline();
    final boolean showGroups = SettingsManager.contactsShowGroups();
    final boolean showEmptyGroups = SettingsManager.contactsShowEmptyGroups();
    final boolean showActiveChats = SettingsManager.contactsShowActiveChats();
    final boolean stayActiveChats = SettingsManager.contactsStayActiveChats();
    final boolean showAccounts = SettingsManager.contactsShowAccounts();
    final Comparator<AbstractContact> comparator = SettingsManager.contactsOrder();
    final CommonState commonState = AccountManager.getInstance().getCommonState();
    final String selectedAccount = AccountManager.getInstance().getSelectedAccount();
    /**
         * Groups.
         */
    final Map<String, GroupConfiguration> groups;
    /**
         * Contacts.
         */
    final List<AbstractContact> contacts;
    /**
         * List of active chats.
         */
    final GroupConfiguration activeChats;
    /**
         * Whether there is at least one contact.
         */
    boolean hasContacts = false;
    /**
         * Whether there is at least one visible contact.
         */
    boolean hasVisibleContacts = false;
    final Map<String, AccountConfiguration> accounts = new TreeMap<>();
    for (String account : AccountManager.getInstance().getAccounts()) {
        accounts.put(account, null);
    }
    /**
         * List of rooms and active chats grouped by users inside accounts.
         */
    final Map<String, Map<String, AbstractChat>> abstractChats = new TreeMap<>();
    for (AbstractChat abstractChat : MessageManager.getInstance().getChats()) {
        if ((abstractChat instanceof RoomChat || abstractChat.isActive()) && accounts.containsKey(abstractChat.getAccount())) {
            final String account = abstractChat.getAccount();
            Map<String, AbstractChat> users = abstractChats.get(account);
            if (users == null) {
                users = new TreeMap<>();
                abstractChats.put(account, users);
            }
            users.put(abstractChat.getUser(), abstractChat);
        }
    }
    if (filterString == null) {
        // Create arrays.
        if (showAccounts) {
            groups = null;
            contacts = null;
            for (Entry<String, AccountConfiguration> entry : accounts.entrySet()) {
                entry.setValue(new AccountConfiguration(entry.getKey(), GroupManager.IS_ACCOUNT, GroupManager.getInstance()));
            }
        } else {
            if (showGroups) {
                groups = new TreeMap<>();
                contacts = null;
            } else {
                groups = null;
                contacts = new ArrayList<>();
            }
        }
        if (showActiveChats) {
            activeChats = new GroupConfiguration(GroupManager.NO_ACCOUNT, GroupManager.ACTIVE_CHATS, GroupManager.getInstance());
        } else {
            activeChats = null;
        }
        // Build structure.
        for (RosterContact rosterContact : rosterContacts) {
            if (!rosterContact.isEnabled()) {
                continue;
            }
            hasContacts = true;
            final boolean online = rosterContact.getStatusMode().isOnline();
            final String account = rosterContact.getAccount();
            final Map<String, AbstractChat> users = abstractChats.get(account);
            final AbstractChat abstractChat;
            if (users == null) {
                abstractChat = null;
            } else {
                abstractChat = users.remove(rosterContact.getUser());
            }
            if (showActiveChats && abstractChat != null && abstractChat.isActive()) {
                activeChats.setNotEmpty();
                hasVisibleContacts = true;
                if (activeChats.isExpanded()) {
                    activeChats.addAbstractContact(rosterContact);
                }
                activeChats.increment(online);
                if (!stayActiveChats || (!showAccounts && !showGroups)) {
                    continue;
                }
            }
            if (selectedAccount != null && !selectedAccount.equals(account)) {
                continue;
            }
            if (addContact(rosterContact, online, accounts, groups, contacts, showAccounts, showGroups, showOffline)) {
                hasVisibleContacts = true;
            }
        }
        for (Map<String, AbstractChat> users : abstractChats.values()) {
            for (AbstractChat abstractChat : users.values()) {
                final AbstractContact abstractContact;
                if (abstractChat instanceof RoomChat) {
                    abstractContact = new RoomContact((RoomChat) abstractChat);
                } else {
                    abstractContact = new ChatContact(abstractChat);
                }
                if (showActiveChats && abstractChat.isActive()) {
                    activeChats.setNotEmpty();
                    hasVisibleContacts = true;
                    if (activeChats.isExpanded()) {
                        activeChats.addAbstractContact(abstractContact);
                    }
                    activeChats.increment(false);
                    if (!stayActiveChats || (!showAccounts && !showGroups)) {
                        continue;
                    }
                }
                if (selectedAccount != null && !selectedAccount.equals(abstractChat.getAccount())) {
                    continue;
                }
                final String group;
                final boolean online;
                if (abstractChat instanceof RoomChat) {
                    group = GroupManager.IS_ROOM;
                    online = abstractContact.getStatusMode().isOnline();
                } else if (MUCManager.getInstance().isMucPrivateChat(abstractChat.getAccount(), abstractChat.getUser())) {
                    group = GroupManager.IS_ROOM;
                    online = abstractContact.getStatusMode().isOnline();
                } else {
                    group = GroupManager.NO_GROUP;
                    online = false;
                }
                hasVisibleContacts = true;
                addContact(abstractContact, group, online, accounts, groups, contacts, showAccounts, showGroups);
            }
        }
        hasActiveChats = activeChats != null && activeChats.getTotal() > 0;
        // Remove empty groups, sort and apply structure.
        baseEntities.clear();
        if (hasVisibleContacts) {
            if (showActiveChats) {
                if (!activeChats.isEmpty()) {
                    if (showAccounts || showGroups) {
                        baseEntities.add(activeChats);
                    }
                    activeChats.sortAbstractContacts(ComparatorByChat.COMPARATOR_BY_CHAT);
                    baseEntities.addAll(activeChats.getAbstractContacts());
                }
            }
            if (showAccounts) {
                boolean isFirst = baseEntities.isEmpty();
                for (AccountConfiguration rosterAccount : accounts.values()) {
                    if (isFirst) {
                        isFirst = false;
                    } else {
                        baseEntities.add(new AccountTopSeparator(null, null));
                    }
                    baseEntities.add(rosterAccount);
                    if (showGroups) {
                        if (rosterAccount.isExpanded()) {
                            for (GroupConfiguration rosterConfiguration : rosterAccount.getSortedGroupConfigurations()) {
                                if (showEmptyGroups || !rosterConfiguration.isEmpty()) {
                                    baseEntities.add(rosterConfiguration);
                                    rosterConfiguration.sortAbstractContacts(comparator);
                                    baseEntities.addAll(rosterConfiguration.getAbstractContacts());
                                }
                            }
                        }
                    } else {
                        rosterAccount.sortAbstractContacts(comparator);
                        baseEntities.addAll(rosterAccount.getAbstractContacts());
                    }
                    if (rosterAccount.getTotal() > 0 && !rosterAccount.isExpanded()) {
                        baseEntities.add(new AccountBottomSeparator(rosterAccount.getAccount(), null));
                    }
                }
            } else {
                if (showGroups) {
                    for (GroupConfiguration rosterConfiguration : groups.values()) {
                        if (showEmptyGroups || !rosterConfiguration.isEmpty()) {
                            baseEntities.add(rosterConfiguration);
                            rosterConfiguration.sortAbstractContacts(comparator);
                            baseEntities.addAll(rosterConfiguration.getAbstractContacts());
                        }
                    }
                } else {
                    Collections.sort(contacts, comparator);
                    baseEntities.addAll(contacts);
                }
            }
        }
    } else {
        // Search
        final ArrayList<AbstractContact> baseEntities = getSearchResults(rosterContacts, comparator, abstractChats);
        this.baseEntities.clear();
        this.baseEntities.addAll(baseEntities);
        hasVisibleContacts = baseEntities.size() > 0;
    }
    super.onChange();
    listener.onContactListChanged(commonState, hasContacts, hasVisibleContacts, filterString != null);
    synchronized (refreshLock) {
        nextRefresh = new Date(new Date().getTime() + REFRESH_INTERVAL);
        refreshInProgress = false;
        // Just to be sure.
        handler.removeCallbacks(this);
        if (refreshRequested) {
            handler.postDelayed(this, REFRESH_INTERVAL);
        }
    }
}
Also used : CommonState(com.xabber.android.data.account.CommonState) RosterContact(com.xabber.android.data.roster.RosterContact) ArrayList(java.util.ArrayList) RoomChat(com.xabber.android.data.extension.muc.RoomChat) ChatContact(com.xabber.android.data.message.ChatContact) AbstractChat(com.xabber.android.data.message.AbstractChat) TreeMap(java.util.TreeMap) AbstractContact(com.xabber.android.data.roster.AbstractContact) Date(java.util.Date) RoomContact(com.xabber.android.data.extension.muc.RoomContact) Collection(java.util.Collection) Map(java.util.Map) TreeMap(java.util.TreeMap)

Aggregations

CommonState (com.xabber.android.data.account.CommonState)1 RoomChat (com.xabber.android.data.extension.muc.RoomChat)1 RoomContact (com.xabber.android.data.extension.muc.RoomContact)1 AbstractChat (com.xabber.android.data.message.AbstractChat)1 ChatContact (com.xabber.android.data.message.ChatContact)1 AbstractContact (com.xabber.android.data.roster.AbstractContact)1 RosterContact (com.xabber.android.data.roster.RosterContact)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Date (java.util.Date)1 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1