/**
* Copyright (c) 2013, Redsolution LTD. All rights reserved.
*
* This file is part of Xabber project; you can redistribute it and/or
* modify it under the terms of the GNU General Public License, Version 3.
*
* Xabber is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License,
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.xabber.android.data.roster;
import android.database.Cursor;
import com.xabber.android.R;
import com.xabber.android.data.Application;
import com.xabber.android.data.log.LogManager;
import com.xabber.android.data.OnLoadListener;
import com.xabber.android.data.account.AccountItem;
import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.account.listeners.OnAccountRemovedListener;
import com.xabber.android.data.database.sqlite.GroupTable;
import com.xabber.android.data.entity.AccountJid;
import com.xabber.android.data.entity.NestedMap;
import com.xabber.android.data.entity.NestedMap.Entry;
import org.jxmpp.stringprep.XmppStringprepException;
public class GroupManager implements OnLoadListener, OnAccountRemovedListener,
GroupStateProvider {
/**
* Reserved group name for the rooms.
*/
public static final String IS_ROOM = "com.xabber.android.data.IS_ROOM";
/**
* Reserved group name for active chat group.
*/
public static final String ACTIVE_CHATS = "com.xabber.android.data.ACTIVE_CHATS";
/**
* Reserved group name to store information about group "out of groups".
*/
public static final String NO_GROUP = "com.xabber.android.data.NO_GROUP";
/**
* Group name used to store information about account itself.
*/
public static final String IS_ACCOUNT = "com.xabber.android.data.IS_ACCOUNT";
/**
* Account name used to store information that don't belong to any account.
*/
public static AccountJid NO_ACCOUNT;
private static GroupManager instance;
static {
try {
// TODO: looks ugly, comes from times, when account was string.
NO_ACCOUNT = AccountJid.from("com.xabber.android@data/NO_ACCOUNT");
} catch (XmppStringprepException e) {
LogManager.exception(GroupManager.class.getSimpleName(), e);
NO_ACCOUNT = null;
}
}
/**
* List of settings for roster groups in accounts.
*/
private final NestedMap<GroupConfiguration> groupConfigurations;
public static GroupManager getInstance() {
if (instance == null) {
instance = new GroupManager();
}
return instance;
}
private GroupManager() {
groupConfigurations = new NestedMap<>();
}
@Override
public void onLoad() {
final NestedMap<GroupConfiguration> groupConfigurations = new NestedMap<>();
Cursor cursor = GroupTable.getInstance().list();
try {
if (cursor.moveToFirst()) {
do {
GroupConfiguration rosterConfiguration = new GroupConfiguration();
rosterConfiguration.setExpanded(GroupTable
.isExpanded(cursor));
rosterConfiguration.setShowOfflineMode(GroupTable
.getShowOfflineMode(cursor));
groupConfigurations.put(GroupTable.getAccount(cursor),
GroupTable.getGroup(cursor), rosterConfiguration);
} while (cursor.moveToNext());
}
} finally {
cursor.close();
}
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
onLoaded(groupConfigurations);
}
});
}
private void onLoaded(NestedMap<GroupConfiguration> groupConfigurations) {
this.groupConfigurations.addAll(groupConfigurations);
}
@Override
public void onAccountRemoved(AccountItem accountItem) {
groupConfigurations.clear(accountItem.getAccount().toString());
}
/**
* @return Group's name to be display.
* @see {@link #IS_ROOM}, {@link #ACTIVE_CHATS}, {@link #NO_GROUP},
* {@link #IS_ACCOUNT}, {@link #NO_ACCOUNT}.
*/
public String getGroupName(AccountJid account, String group) {
if (GroupManager.NO_GROUP.equals(group)) {
return Application.getInstance().getString(R.string.group_none);
} else if (GroupManager.IS_ROOM.equals(group)) {
return Application.getInstance().getString(R.string.group_room);
} else if (GroupManager.ACTIVE_CHATS.equals(group)) {
return Application.getInstance().getString(R.string.group_active_chat);
} else if (GroupManager.IS_ACCOUNT.equals(group)) {
return AccountManager.getInstance().getVerboseName(account);
}
return group;
}
@Override
public boolean isExpanded(AccountJid account, String group) {
if (account == null) {
return true;
}
GroupConfiguration configuration = groupConfigurations.get(account.toString(), group);
if (configuration == null) {
return true;
}
return configuration.isExpanded();
}
@Override
public ShowOfflineMode getShowOfflineMode(AccountJid account, String group) {
if (account == null) {
return ShowOfflineMode.normal;
}
GroupConfiguration configuration = groupConfigurations.get(account.toString(), group);
if (configuration == null) {
return ShowOfflineMode.normal;
}
return configuration.getShowOfflineMode();
}
@Override
public void setExpanded(AccountJid account, String group, boolean expanded) {
GroupConfiguration configuration = groupConfigurations.get(account.toString(), group);
if (configuration == null) {
configuration = new GroupConfiguration();
groupConfigurations.put(account.toString(), group, configuration);
}
configuration.setExpanded(expanded);
requestToWriteGroup(account, group, configuration.isExpanded(),
configuration.getShowOfflineMode());
}
@Override
public void setShowOfflineMode(AccountJid account, String group,
ShowOfflineMode showOfflineMode) {
GroupConfiguration configuration = groupConfigurations.get(account.toString(), group);
if (configuration == null) {
configuration = new GroupConfiguration();
groupConfigurations.put(account.toString(), group, configuration);
}
configuration.setShowOfflineMode(showOfflineMode);
requestToWriteGroup(account, group, configuration.isExpanded(),
configuration.getShowOfflineMode());
}
/**
* Reset all show offline modes.
*/
public void resetShowOfflineModes() {
for (Entry<GroupConfiguration> entry : groupConfigurations) {
if (entry.getValue().getShowOfflineMode() != ShowOfflineMode.normal) {
try {
setShowOfflineMode(AccountJid.from(entry.getFirst()), entry.getSecond(),
ShowOfflineMode.normal);
} catch (XmppStringprepException e) {
LogManager.exception(this, e);
}
}
}
}
private void requestToWriteGroup(final AccountJid account, final String group,
final boolean expanded, final ShowOfflineMode showOfflineMode) {
Application.getInstance().runInBackgroundUserRequest(new Runnable() {
@Override
public void run() {
GroupTable.getInstance().write(account.toString(), group, expanded, showOfflineMode);
}
});
}
}