Search in sources :

Example 11 with RoomChat

use of com.xabber.android.data.extension.muc.RoomChat in project xabber-android by redsolution.

the class ChatViewerFragment method setUpOptionsMenu.

private void setUpOptionsMenu(Menu menu) {
    AbstractChat abstractChat = MessageManager.getInstance().getChat(account, user);
    if (abstractChat instanceof RoomChat) {
        RoomState chatState = ((RoomChat) abstractChat).getState();
        if (chatState == RoomState.available) {
            menu.findItem(R.id.action_list_of_occupants).setVisible(true);
        }
        if (chatState == RoomState.unavailable) {
            menu.findItem(R.id.action_join_conference).setVisible(true);
        } else {
            menu.findItem(R.id.action_invite_to_chat).setVisible(true);
            if (chatState == RoomState.error) {
                menu.findItem(R.id.action_authorization_settings).setVisible(true);
            } else {
                menu.findItem(R.id.action_leave_conference).setVisible(true);
            }
        }
    }
    if (abstractChat instanceof RegularChat) {
        menu.findItem(R.id.action_view_contact).setVisible(true);
        menu.findItem(R.id.action_close_chat).setVisible(true);
        menu.findItem(R.id.action_block_contact).setVisible(true);
    }
}
Also used : AbstractChat(com.xabber.android.data.message.AbstractChat) RoomChat(com.xabber.android.data.extension.muc.RoomChat) RegularChat(com.xabber.android.data.message.RegularChat) RoomState(com.xabber.android.data.extension.muc.RoomState)

Example 12 with RoomChat

use of com.xabber.android.data.extension.muc.RoomChat 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)

Example 13 with RoomChat

use of com.xabber.android.data.extension.muc.RoomChat in project xabber-android by redsolution.

the class ContactListAdapter method getSearchResults.

private ArrayList<AbstractContact> getSearchResults(Collection<RosterContact> rosterContacts, Comparator<AbstractContact> comparator, Map<String, Map<String, AbstractChat>> abstractChats) {
    final ArrayList<AbstractContact> baseEntities = new ArrayList<>();
    // Build structure.
    for (RosterContact rosterContact : rosterContacts) {
        if (!rosterContact.isEnabled()) {
            continue;
        }
        final String account = rosterContact.getAccount();
        final Map<String, AbstractChat> users = abstractChats.get(account);
        if (users != null) {
            users.remove(rosterContact.getUser());
        }
        if (rosterContact.getName().toLowerCase(locale).contains(filterString)) {
            baseEntities.add(rosterContact);
        }
    }
    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 (abstractContact.getName().toLowerCase(locale).contains(filterString)) {
                baseEntities.add(abstractContact);
            }
        }
    }
    Collections.sort(baseEntities, comparator);
    return baseEntities;
}
Also used : RoomContact(com.xabber.android.data.extension.muc.RoomContact) RosterContact(com.xabber.android.data.roster.RosterContact) AbstractChat(com.xabber.android.data.message.AbstractChat) ArrayList(java.util.ArrayList) AbstractContact(com.xabber.android.data.roster.AbstractContact) RoomChat(com.xabber.android.data.extension.muc.RoomChat) ChatContact(com.xabber.android.data.message.ChatContact)

Example 14 with RoomChat

use of com.xabber.android.data.extension.muc.RoomChat in project xabber-android by redsolution.

the class MessageManager method onSettingsChanged.

/**
     * Called on action settings change.
     */
public void onSettingsChanged() {
    ChatsShowStatusChange showStatusChange = SettingsManager.chatsShowStatusChange();
    Collection<BaseEntity> changedEntities = new ArrayList<>();
    for (AbstractChat chat : chats.values()) {
        if ((chat instanceof RegularChat && showStatusChange != ChatsShowStatusChange.always) || (chat instanceof RoomChat && showStatusChange == ChatsShowStatusChange.never)) {
            // Remove actions with status change.
            ArrayList<MessageItem> remove = new ArrayList<>();
            for (MessageItem messageItem : chat.getMessages()) {
                if (messageItem.getAction() != null && messageItem.getAction().isStatusChage()) {
                    remove.add(messageItem);
                }
            }
            if (remove.isEmpty()) {
                continue;
            }
            for (MessageItem messageItem : remove) {
                chat.removeMessage(messageItem);
            }
            changedEntities.add(chat);
        }
    }
    RosterManager.getInstance().onContactsChanged(changedEntities);
}
Also used : ChatsShowStatusChange(com.xabber.android.data.SettingsManager.ChatsShowStatusChange) ArrayList(java.util.ArrayList) BaseEntity(com.xabber.android.data.entity.BaseEntity) RoomChat(com.xabber.android.data.extension.muc.RoomChat)

Example 15 with RoomChat

use of com.xabber.android.data.extension.muc.RoomChat in project xabber-android by redsolution.

the class MessageManager method exportChat.

/**
     * Export chat to file with specified name.
     *
     * @param account
     * @param user
     * @param fileName
     * @throws NetworkException
     */
public File exportChat(String account, String user, String fileName) throws NetworkException {
    final File file = new File(Environment.getExternalStorageDirectory(), fileName);
    try {
        BufferedWriter out = new BufferedWriter(new FileWriter(file));
        final String titleName = RosterManager.getInstance().getName(account, user) + " (" + user + ")";
        out.write("<html><head><title>");
        out.write(StringUtils.escapeHtml(titleName));
        out.write("</title></head><body>");
        final AbstractChat abstractChat = getChat(account, user);
        if (abstractChat != null) {
            final boolean isMUC = abstractChat instanceof RoomChat;
            final String accountName = AccountManager.getInstance().getNickName(account);
            final String userName = RosterManager.getInstance().getName(account, user);
            for (MessageItem messageItem : abstractChat.getMessages()) {
                if (messageItem.getAction() != null) {
                    continue;
                }
                final String name;
                if (isMUC) {
                    name = messageItem.getResource();
                } else {
                    if (messageItem.isIncoming()) {
                        name = userName;
                    } else {
                        name = accountName;
                    }
                }
                out.write("<b>");
                out.write(StringUtils.escapeHtml(name));
                out.write("</b>&nbsp;(");
                out.write(StringUtils.getDateTimeText(messageItem.getTimestamp()));
                out.write(")<br />\n<p>");
                out.write(StringUtils.escapeHtml(messageItem.getText()));
                out.write("</p><hr />\n");
            }
        }
        out.write("</body></html>");
        out.close();
    } catch (IOException e) {
        throw new NetworkException(R.string.FILE_NOT_FOUND);
    }
    return file;
}
Also used : FileWriter(java.io.FileWriter) IOException(java.io.IOException) File(java.io.File) RoomChat(com.xabber.android.data.extension.muc.RoomChat) NetworkException(com.xabber.android.data.NetworkException) BufferedWriter(java.io.BufferedWriter)

Aggregations

RoomChat (com.xabber.android.data.extension.muc.RoomChat)19 AbstractChat (com.xabber.android.data.message.AbstractChat)12 RoomContact (com.xabber.android.data.extension.muc.RoomContact)7 ChatContact (com.xabber.android.data.message.ChatContact)7 RosterContact (com.xabber.android.data.roster.RosterContact)6 ArrayList (java.util.ArrayList)6 UserJid (com.xabber.android.data.entity.UserJid)5 AbstractContact (com.xabber.android.data.roster.AbstractContact)5 AccountJid (com.xabber.android.data.entity.AccountJid)4 RoomState (com.xabber.android.data.extension.muc.RoomState)4 CommonState (com.xabber.android.data.account.CommonState)3 File (java.io.File)3 Collection (java.util.Collection)3 Date (java.util.Date)3 Map (java.util.Map)3 TreeMap (java.util.TreeMap)3 NetworkException (com.xabber.android.data.NetworkException)2 MessageItem (com.xabber.android.data.database.messagerealm.MessageItem)2 RegularChat (com.xabber.android.data.message.RegularChat)2 AccountWithButtonsVO (com.xabber.android.presentation.ui.contactlist.viewobjects.AccountWithButtonsVO)2