package com.xabber.android.ui.adapter.contactlist;
import com.xabber.android.data.entity.AccountJid;
import com.xabber.android.data.roster.AbstractContact;
import com.xabber.android.data.roster.Group;
import com.xabber.android.data.roster.GroupManager;
import com.xabber.android.data.roster.ShowOfflineMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
class ContactListGroupUtils {
/**
* List of groups used if contact has no groups.
*/
private static final Collection<Group> NO_GROUP_LIST;
static {
Collection<Group> groups = new ArrayList<>(1);
groups.add(new Group() {
@Override
public String getName() {
return GroupManager.NO_GROUP;
}
});
NO_GROUP_LIST = Collections.unmodifiableCollection(groups);
}
/**
* Gets or creates roster group in roster account.
*/
private static GroupConfiguration getGroupConfiguration(AccountConfiguration accountConfiguration, String name) {
GroupConfiguration groupConfiguration = accountConfiguration.getGroupConfiguration(name);
if (groupConfiguration != null) {
return groupConfiguration;
}
groupConfiguration = new GroupConfiguration(
accountConfiguration.getAccount(), name, GroupManager.getInstance());
accountConfiguration.addGroupConfiguration(groupConfiguration);
return groupConfiguration;
}
/**
* Gets or creates roster group in tree map.
*/
private static GroupConfiguration getGroupConfiguration(Map<String, GroupConfiguration> groups, String name) {
GroupConfiguration groupConfiguration = groups.get(name);
if (groupConfiguration != null) {
return groupConfiguration;
}
groupConfiguration = new GroupConfiguration(GroupManager.NO_ACCOUNT, name, GroupManager.getInstance());
groups.put(name, groupConfiguration);
return groupConfiguration;
}
/**
* Adds contact to specified group.
*/
static void addContact(AbstractContact abstractContact, String group, boolean online,
Map<AccountJid, AccountConfiguration> accounts, Map<String, GroupConfiguration> groups,
List<AbstractContact> contacts, boolean showAccounts, boolean showGroups) {
if (showAccounts) {
final AccountJid account = abstractContact.getAccount();
final AccountConfiguration accountConfiguration;
accountConfiguration = accounts.get(account);
if (accountConfiguration == null) {
return;
}
if (showGroups) {
GroupConfiguration groupConfiguration
= getGroupConfiguration(accountConfiguration, group);
if (accountConfiguration.isExpanded()) {
groupConfiguration.setNotEmpty();
if (groupConfiguration.isExpanded()) {
groupConfiguration.addAbstractContact(abstractContact);
}
}
groupConfiguration.increment(online);
} else {
if (accountConfiguration.isExpanded()) {
accountConfiguration.addAbstractContact(abstractContact);
}
}
accountConfiguration.increment(online);
} else {
if (showGroups) {
GroupConfiguration groupConfiguration = getGroupConfiguration(groups, group);
groupConfiguration.setNotEmpty();
if (groupConfiguration.isExpanded()) {
groupConfiguration.addAbstractContact(abstractContact);
}
groupConfiguration.increment(online);
} else {
contacts.add(abstractContact);
}
}
}
/**
* Adds contact to there groups.
* @return whether contact is visible.
*/
static boolean addContact(AbstractContact abstractContact,
boolean online, Map<AccountJid, AccountConfiguration> accounts,
Map<String, GroupConfiguration> groups,
List<AbstractContact> contacts, boolean showAccounts,
boolean showGroups, boolean showOffline) {
boolean hasVisible = false;
if (showAccounts) {
final AccountConfiguration accountConfiguration;
accountConfiguration = accounts.get(abstractContact.getAccount());
if (accountConfiguration == null) {
return false;
}
if (showGroups) {
Collection<? extends Group> abstractGroups = abstractContact.getGroups();
if (abstractGroups.size() == 0) {
abstractGroups = NO_GROUP_LIST;
}
for (Group abstractGroup : abstractGroups) {
GroupConfiguration groupConfiguration = getGroupConfiguration(
accountConfiguration, abstractGroup.getName());
if (online
|| (groupConfiguration.getShowOfflineMode() == ShowOfflineMode.always)
|| (accountConfiguration.getShowOfflineMode() == ShowOfflineMode.always && groupConfiguration
.getShowOfflineMode() == ShowOfflineMode.normal)
|| (accountConfiguration.getShowOfflineMode() == ShowOfflineMode.normal
&& groupConfiguration.getShowOfflineMode() == ShowOfflineMode.normal && showOffline)) {
// ............. group
// ......... | A | N | E
// ....... A | + | + | -
// account N | + | ? | -
// ....... E | + | - | -
hasVisible = true;
if (accountConfiguration.isExpanded()) {
groupConfiguration.setNotEmpty();
if (groupConfiguration.isExpanded()) {
groupConfiguration.addAbstractContact(abstractContact);
}
}
}
groupConfiguration.increment(online);
}
} else {
if (online || (accountConfiguration.getShowOfflineMode() == ShowOfflineMode.always)
|| (accountConfiguration.getShowOfflineMode() == ShowOfflineMode.normal && showOffline)) {
hasVisible = true;
if (accountConfiguration.isExpanded()) {
accountConfiguration.addAbstractContact(abstractContact);
}
}
}
accountConfiguration.increment(online);
} else {
if (showGroups) {
Collection<? extends Group> abstractGroups = abstractContact.getGroups();
if (abstractGroups.size() == 0) {
abstractGroups = NO_GROUP_LIST;
}
for (Group abstractGroup : abstractGroups) {
GroupConfiguration groupConfiguration
= getGroupConfiguration(groups, abstractGroup.getName());
if (online || (groupConfiguration.getShowOfflineMode() == ShowOfflineMode.always)
|| (groupConfiguration.getShowOfflineMode() == ShowOfflineMode.normal && showOffline)) {
groupConfiguration.setNotEmpty();
hasVisible = true;
if (groupConfiguration.isExpanded()) {
groupConfiguration.addAbstractContact(abstractContact);
}
}
groupConfiguration.increment(online);
}
} else {
if (online || showOffline) {
hasVisible = true;
contacts.add(abstractContact);
}
}
}
return hasVisible;
}
}