Search in sources :

Example 1 with GroupConfiguration

use of com.xabber.android.ui.adapter.contactlist.GroupConfiguration in project xabber-android by redsolution.

the class ContactListPresenter method createContactListWithGroups.

private void createContactListWithGroups(List<IFlexible> items, boolean showEmptyGroups, Map<String, GroupConfiguration> groups, Comparator<AbstractContact> comparator) {
    for (GroupConfiguration rosterConfiguration : groups.values()) {
        if (showEmptyGroups || !rosterConfiguration.isEmpty()) {
            GroupVO group = GroupVO.convert(rosterConfiguration, false, this);
            rosterConfiguration.sortAbstractContacts(comparator);
            for (AbstractContact contact : rosterConfiguration.getAbstractContacts()) {
                group.addSubItem(SettingsManager.contactsShowMessages() ? ExtContactVO.convert(contact, this) : ContactVO.convert(contact, this));
            }
            items.add(group);
        }
    }
}
Also used : GroupConfiguration(com.xabber.android.ui.adapter.contactlist.GroupConfiguration) AbstractContact(com.xabber.android.data.roster.AbstractContact) GroupVO(com.xabber.android.presentation.ui.contactlist.viewobjects.GroupVO)

Example 2 with GroupConfiguration

use of com.xabber.android.ui.adapter.contactlist.GroupConfiguration in project xabber-android by redsolution.

the class ContactListPresenter method getChatsGroup.

/**
 * @param chats which must be filtered
 * @param state for which you want to filter
 * @return GroupConfiguration that may contains recent, unread or archived chats.
 */
private GroupConfiguration getChatsGroup(Collection<AbstractChat> chats, ChatListState state) {
    GroupConfiguration chatsGroup = new GroupConfiguration(GroupManager.NO_ACCOUNT, GroupVO.RECENT_CHATS_TITLE, GroupManager.getInstance());
    List<AbstractChat> newChats = new ArrayList<>();
    int unreadMessageCount = 0;
    for (AbstractChat abstractChat : chats) {
        MessageItem lastMessage = abstractChat.getLastMessage();
        if (lastMessage != null && !TextUtils.isEmpty(lastMessage.getText())) {
            AccountItem accountItem = AccountManager.getInstance().getAccount(abstractChat.getAccount());
            if (accountItem != null && accountItem.isEnabled()) {
                int unread = abstractChat.getUnreadMessageCount();
                if (abstractChat.notifyAboutMessage())
                    unreadMessageCount = unreadMessageCount + unread;
                switch(state) {
                    case unread:
                        if (!abstractChat.isArchived() && unread > 0)
                            newChats.add(abstractChat);
                        break;
                    case archived:
                        if (abstractChat.isArchived())
                            newChats.add(abstractChat);
                        break;
                    default:
                        // recent
                        if (!abstractChat.isArchived())
                            newChats.add(abstractChat);
                        break;
                }
            }
        }
    }
    EventBus.getDefault().post(new UpdateUnreadCountEvent(unreadMessageCount));
    Collections.sort(newChats, ChatComparator.CHAT_COMPARATOR);
    chatsGroup.setNotEmpty();
    int itemsCount = 0;
    for (AbstractChat chat : newChats) {
        if (itemsCount < MAX_RECENT_ITEMS || state != ChatListState.recent) {
            chatsGroup.addAbstractContact(RosterManager.getInstance().getBestContact(chat.getAccount(), chat.getUser()));
            chatsGroup.increment(true);
            itemsCount++;
        } else
            break;
    }
    return chatsGroup;
}
Also used : MessageItem(com.xabber.android.data.database.messagerealm.MessageItem) AccountItem(com.xabber.android.data.account.AccountItem) AbstractChat(com.xabber.android.data.message.AbstractChat) ArrayList(java.util.ArrayList) GroupConfiguration(com.xabber.android.ui.adapter.contactlist.GroupConfiguration)

Example 3 with GroupConfiguration

use of com.xabber.android.ui.adapter.contactlist.GroupConfiguration in project xabber-android by redsolution.

the class ContactListPresenter method buildStructure.

/**
 * Do not call directly. Only from Structure Builder
 */
void buildStructure() {
    // listener.hidePlaceholder();
    List<IFlexible> items = new ArrayList<>();
    final Collection<RosterContact> allRosterContacts = RosterManager.getInstance().getAllContacts();
    Map<AccountJid, Collection<UserJid>> blockedContacts = new TreeMap<>();
    for (AccountJid account : AccountManager.getInstance().getEnabledAccounts()) {
        blockedContacts.put(account, BlockingManager.getInstance().getCachedBlockedContacts(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 = false;
    final boolean stayActiveChats = true;
    final boolean showAccounts = SettingsManager.contactsShowAccounts();
    final Comparator<AbstractContact> comparator = SettingsManager.contactsOrder();
    final CommonState commonState = AccountManager.getInstance().getCommonState();
    final AccountJid selectedAccount = AccountManager.getInstance().getSelectedAccount();
    /**
     * Groups.
     */
    final Map<String, GroupConfiguration> groups;
    /**
     * Contacts.
     */
    final List<AbstractContact> contacts;
    /**
     * Chat list on top of contact list.
     */
    final GroupConfiguration chatsGroup;
    /**
     * Whether there is at least one contact.
     */
    boolean hasContacts = false;
    /**
     * Whether there is at least one visible contact.
     */
    boolean hasVisibleContacts = false;
    final Map<AccountJid, AccountConfiguration> accounts = new TreeMap<>();
    for (AccountJid account : AccountManager.getInstance().getEnabledAccounts()) {
        accounts.put(account, null);
    }
    /**
     * List of rooms and active chats grouped by users inside accounts.
     */
    final Map<AccountJid, Map<UserJid, AbstractChat>> abstractChats = new TreeMap<>();
    for (AbstractChat abstractChat : MessageManager.getInstance().getChats()) {
        if ((abstractChat instanceof RoomChat || abstractChat.isActive()) && accounts.containsKey(abstractChat.getAccount())) {
            final AccountJid account = abstractChat.getAccount();
            Map<UserJid, AbstractChat> users = abstractChats.get(account);
            if (users == null) {
                users = new TreeMap<>();
                abstractChats.put(account, users);
            }
            users.put(abstractChat.getUser(), abstractChat);
        }
    }
    if (filterString == null || filterString.isEmpty()) {
        // Create arrays.
        if (showAccounts) {
            groups = null;
            contacts = null;
            for (Map.Entry<AccountJid, 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<>();
            }
        }
        // chats on top
        Collection<AbstractChat> chats = MessageManager.getInstance().getChatsOfEnabledAccount();
        chatsGroup = getChatsGroup(chats, currentChatsState);
        // Build structure.
        for (RosterContact rosterContact : rosterContacts) {
            if (!rosterContact.isEnabled()) {
                continue;
            }
            hasContacts = true;
            final boolean online = rosterContact.getStatusMode().isOnline();
            final AccountJid account = rosterContact.getAccount();
            final Map<UserJid, AbstractChat> users = abstractChats.get(account);
            final AbstractChat abstractChat;
            if (users == null) {
                abstractChat = null;
            } else {
                abstractChat = users.remove(rosterContact.getUser());
            }
            if (selectedAccount != null && !selectedAccount.equals(account)) {
                continue;
            }
            if (ContactListGroupUtils.addContact(rosterContact, online, accounts, groups, contacts, showAccounts, showGroups, showOffline)) {
                hasVisibleContacts = true;
            }
        }
        for (Map<UserJid, 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 (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;
            ContactListGroupUtils.addContact(abstractContact, group, online, accounts, groups, contacts, showAccounts, showGroups);
        }
        // BUILD STRUCTURE //
        // Remove empty groups, sort and apply structure.
        items.clear();
        items.add(new ToolbarVO(context, this));
        if (hasVisibleContacts) {
            if (currentChatsState == ChatListState.recent) {
                // add recent chats
                int i = 0;
                for (AbstractContact contact : chatsGroup.getAbstractContacts()) {
                    if (i == MAX_RECENT_ITEMS - 1) {
                        if (getAllChatsSize() > MAX_RECENT_ITEMS)
                            items.add(ChatWithButtonVO.convert(contact, this));
                        else
                            items.add(ChatVO.convert(contact, this, null));
                    } else
                        items.add(ChatVO.convert(contact, this, null));
                    i++;
                }
                if (showAccounts) {
                    // boolean isFirst = items.isEmpty();
                    for (AccountConfiguration rosterAccount : accounts.values()) {
                        if (rosterAccount.getTotal() != 0) {
                            if (showGroups) {
                                createContactListWithAccountsAndGroups(items, rosterAccount, showEmptyGroups, comparator);
                            } else {
                                createContactListWithAccounts(items, rosterAccount, comparator);
                            }
                        } else {
                            AccountWithButtonsVO account = AccountWithButtonsVO.convert(rosterAccount, this);
                            ButtonVO button = ButtonVO.convert(rosterAccount, context.getString(R.string.contact_add), ButtonVO.ACTION_ADD_CONTACT);
                            account.addSubItem(button);
                            items.add(account);
                        }
                    }
                } else {
                    if (showGroups) {
                        createContactListWithGroups(items, showEmptyGroups, groups, comparator);
                    } else {
                        createContactList(items, contacts, comparator);
                    }
                }
            } else
                items.addAll(ChatVO.convert(chatsGroup.getAbstractContacts(), this, null));
        }
    } else {
        // Search
        final ArrayList<AbstractContact> baseEntities = getSearchResults(rosterContacts, comparator, abstractChats);
        items.clear();
        items.add(new CategoryVO(context.getString(R.string.category_title_contacts)));
        items.addAll(SettingsManager.contactsShowMessages() ? ExtContactVO.convert(baseEntities, this) : ContactVO.convert(baseEntities, this));
        hasVisibleContacts = baseEntities.size() > 0;
    }
    if (view != null)
        view.onContactListChanged(commonState, hasContacts, hasVisibleContacts, filterString != null);
    if (view != null) {
        if (items.size() == 1 && (filterString == null || filterString.isEmpty())) {
            if (currentChatsState == ChatListState.unread)
                view.showPlaceholder(context.getString(R.string.placeholder_no_unread));
            if (currentChatsState == ChatListState.archived)
                view.showPlaceholder(context.getString(R.string.placeholder_no_archived));
        } else
            view.hidePlaceholder();
        view.updateItems(items);
    }
}
Also used : CommonState(com.xabber.android.data.account.CommonState) RosterContact(com.xabber.android.data.roster.RosterContact) ChatWithButtonVO(com.xabber.android.presentation.ui.contactlist.viewobjects.ChatWithButtonVO) ButtonVO(com.xabber.android.presentation.ui.contactlist.viewobjects.ButtonVO) ArrayList(java.util.ArrayList) RoomChat(com.xabber.android.data.extension.muc.RoomChat) CategoryVO(com.xabber.android.presentation.ui.contactlist.viewobjects.CategoryVO) AccountJid(com.xabber.android.data.entity.AccountJid) ToolbarVO(com.xabber.android.presentation.ui.contactlist.viewobjects.ToolbarVO) ChatContact(com.xabber.android.data.message.ChatContact) AbstractChat(com.xabber.android.data.message.AbstractChat) IFlexible(eu.davidea.flexibleadapter.items.IFlexible) UserJid(com.xabber.android.data.entity.UserJid) GroupConfiguration(com.xabber.android.ui.adapter.contactlist.GroupConfiguration) TreeMap(java.util.TreeMap) AbstractContact(com.xabber.android.data.roster.AbstractContact) RoomContact(com.xabber.android.data.extension.muc.RoomContact) Collection(java.util.Collection) AccountConfiguration(com.xabber.android.ui.adapter.contactlist.AccountConfiguration) AccountWithButtonsVO(com.xabber.android.presentation.ui.contactlist.viewobjects.AccountWithButtonsVO) Map(java.util.Map) TreeMap(java.util.TreeMap)

Example 4 with GroupConfiguration

use of com.xabber.android.ui.adapter.contactlist.GroupConfiguration in project xabber-android by redsolution.

the class ContactListPresenter method getAllChatsSize.

public int getAllChatsSize() {
    Collection<AbstractChat> chats = MessageManager.getInstance().getChatsOfEnabledAccount();
    GroupConfiguration chatsGroup = getChatsGroup(chats, ChatListState.all);
    return chatsGroup.getTotal();
}
Also used : AbstractChat(com.xabber.android.data.message.AbstractChat) GroupConfiguration(com.xabber.android.ui.adapter.contactlist.GroupConfiguration)

Example 5 with GroupConfiguration

use of com.xabber.android.ui.adapter.contactlist.GroupConfiguration in project xabber-android by redsolution.

the class ContactListPresenter method createContactListWithAccountsAndGroups.

private void createContactListWithAccountsAndGroups(List<IFlexible> items, AccountConfiguration rosterAccount, boolean showEmptyGroups, Comparator<AbstractContact> comparator) {
    AccountWithGroupsVO account = AccountWithGroupsVO.convert(rosterAccount, this);
    boolean firstGroupInAccount = true;
    for (GroupConfiguration rosterConfiguration : rosterAccount.getSortedGroupConfigurations()) {
        if (showEmptyGroups || !rosterConfiguration.isEmpty()) {
            GroupVO group = GroupVO.convert(rosterConfiguration, firstGroupInAccount, this);
            firstGroupInAccount = false;
            rosterConfiguration.sortAbstractContacts(comparator);
            for (AbstractContact contact : rosterConfiguration.getAbstractContacts()) {
                group.addSubItem(SettingsManager.contactsShowMessages() ? ExtContactVO.convert(contact, this) : ContactVO.convert(contact, this));
            }
            account.addSubItem(group);
        }
    }
    items.add(account);
}
Also used : AccountWithGroupsVO(com.xabber.android.presentation.ui.contactlist.viewobjects.AccountWithGroupsVO) GroupConfiguration(com.xabber.android.ui.adapter.contactlist.GroupConfiguration) AbstractContact(com.xabber.android.data.roster.AbstractContact) GroupVO(com.xabber.android.presentation.ui.contactlist.viewobjects.GroupVO)

Aggregations

GroupConfiguration (com.xabber.android.ui.adapter.contactlist.GroupConfiguration)6 AbstractChat (com.xabber.android.data.message.AbstractChat)4 AbstractContact (com.xabber.android.data.roster.AbstractContact)4 ArrayList (java.util.ArrayList)3 GroupVO (com.xabber.android.presentation.ui.contactlist.viewobjects.GroupVO)2 IFlexible (eu.davidea.flexibleadapter.items.IFlexible)2 AccountItem (com.xabber.android.data.account.AccountItem)1 CommonState (com.xabber.android.data.account.CommonState)1 MessageItem (com.xabber.android.data.database.messagerealm.MessageItem)1 AccountJid (com.xabber.android.data.entity.AccountJid)1 UserJid (com.xabber.android.data.entity.UserJid)1 RoomChat (com.xabber.android.data.extension.muc.RoomChat)1 RoomContact (com.xabber.android.data.extension.muc.RoomContact)1 ChatContact (com.xabber.android.data.message.ChatContact)1 RosterContact (com.xabber.android.data.roster.RosterContact)1 AccountWithButtonsVO (com.xabber.android.presentation.ui.contactlist.viewobjects.AccountWithButtonsVO)1 AccountWithGroupsVO (com.xabber.android.presentation.ui.contactlist.viewobjects.AccountWithGroupsVO)1 ButtonVO (com.xabber.android.presentation.ui.contactlist.viewobjects.ButtonVO)1 CategoryVO (com.xabber.android.presentation.ui.contactlist.viewobjects.CategoryVO)1 ChatWithButtonVO (com.xabber.android.presentation.ui.contactlist.viewobjects.ChatWithButtonVO)1