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);
}
}
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);
}
}
}
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;
}
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);
}
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> (");
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;
}
Aggregations