package com.quickblox.sample.chat.managers;
import android.os.Bundle;
import com.quickblox.chat.QBChatService;
import com.quickblox.chat.QBSystemMessagesManager;
import com.quickblox.chat.model.QBChatDialog;
import com.quickblox.chat.model.QBChatMessage;
import com.quickblox.chat.model.QBDialogType;
import com.quickblox.sample.chat.utils.chat.ChatHelper;
import com.quickblox.sample.chat.utils.qb.QbDialogHolder;
import com.quickblox.sample.chat.utils.qb.QbDialogUtils;
import com.quickblox.sample.chat.utils.qb.callback.QbEntityCallbackImpl;
import com.quickblox.users.model.QBUser;
import org.jivesoftware.smack.SmackException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
public class DialogsManager {
public static final String PROPERTY_OCCUPANTS_IDS = "occupants_ids";
public static final String PROPERTY_DIALOG_TYPE = "dialog_type";
public static final String PROPERTY_DIALOG_NAME = "dialog_name";
public static final String PROPERTY_NOTIFICATION_TYPE = "notification_type";
public static final String CREATING_DIALOG = "creating_dialog";
private Set<ManagingDialogsCallbacks> managingDialogsCallbackListener = new CopyOnWriteArraySet<>();
private boolean isMessageCreatingDialog(QBChatMessage systemMessage){
return CREATING_DIALOG.equals(systemMessage.getProperty(PROPERTY_NOTIFICATION_TYPE));
}
private QBChatMessage buildSystemMessageAboutCreatingGroupDialog(QBChatDialog dialog){
QBChatMessage qbChatMessage = new QBChatMessage();
qbChatMessage.setDialogId(dialog.getDialogId());
qbChatMessage.setProperty(PROPERTY_OCCUPANTS_IDS, QbDialogUtils.getOccupantsIdsStringFromList(dialog.getOccupants()));
qbChatMessage.setProperty(PROPERTY_DIALOG_TYPE, String.valueOf(dialog.getType().getCode()));
qbChatMessage.setProperty(PROPERTY_DIALOG_NAME, String.valueOf(dialog.getName()));
qbChatMessage.setProperty(PROPERTY_NOTIFICATION_TYPE, CREATING_DIALOG);
return qbChatMessage;
}
private QBChatDialog buildChatDialogFromSystemMessage(QBChatMessage qbChatMessage){
QBChatDialog chatDialog = new QBChatDialog();
chatDialog.setDialogId(qbChatMessage.getDialogId());
chatDialog.setOccupantsIds(QbDialogUtils.getOccupantsIdsListFromString((String) qbChatMessage.getProperty(PROPERTY_OCCUPANTS_IDS)));
chatDialog.setType(QBDialogType.parseByCode(Integer.parseInt(qbChatMessage.getProperty(PROPERTY_DIALOG_TYPE).toString())));
chatDialog.setName(qbChatMessage.getProperty(PROPERTY_DIALOG_NAME).toString());
chatDialog.setUnreadMessageCount(0);
return chatDialog;
}
public void sendSystemMessageAboutCreatingDialog(QBSystemMessagesManager systemMessagesManager, QBChatDialog dialog) {
QBChatMessage systemMessageCreatingDialog = buildSystemMessageAboutCreatingGroupDialog(dialog);
try {
for (Integer recipientId : dialog.getOccupants()) {
if (!recipientId.equals(QBChatService.getInstance().getUser().getId())) {
systemMessageCreatingDialog.setRecipientId(recipientId);
systemMessagesManager.sendSystemMessage(systemMessageCreatingDialog);
}
}
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
private void loadUsersFromDialog(QBChatDialog chatDialog){
ChatHelper.getInstance().getUsersFromDialog(chatDialog, new QbEntityCallbackImpl<ArrayList<QBUser>>());
}
public void onGlobalMessageReceived(String dialogId, QBChatMessage chatMessage){
if (chatMessage.getBody() != null && chatMessage.isMarkable()) { //for excluding status messages until will be released v.3.1
if (QbDialogHolder.getInstance().hasDialogWithId(dialogId)) {
QbDialogHolder.getInstance().updateDialog(dialogId, chatMessage);
notifyListenersDialogUpdated(dialogId);
} else {
ChatHelper.getInstance().getDialogById(dialogId, new QbEntityCallbackImpl<QBChatDialog>() {
@Override
public void onSuccess(QBChatDialog chatDialog, Bundle bundle) {
loadUsersFromDialog(chatDialog);
QbDialogHolder.getInstance().addDialog(chatDialog);
notifyListenersNewDialogLoaded(chatDialog);
}
});
}
}
}
public void onSystemMessageReceived(QBChatMessage systemMessage){
if (isMessageCreatingDialog(systemMessage)) {
QBChatDialog chatDialog = buildChatDialogFromSystemMessage(systemMessage);
chatDialog.initForChat(QBChatService.getInstance());
QbDialogHolder.getInstance().addDialog(chatDialog);
notifyListenersDialogCreated(chatDialog);
}
}
private void notifyListenersDialogCreated(final QBChatDialog chatDialog) {
for (ManagingDialogsCallbacks listener : getManagingDialogsCallbackListeners()) {
listener.onDialogCreated(chatDialog);
}
}
private void notifyListenersDialogUpdated(final String dialogId) {
for (ManagingDialogsCallbacks listener : getManagingDialogsCallbackListeners()) {
listener.onDialogUpdated(dialogId);
}
}
private void notifyListenersNewDialogLoaded(final QBChatDialog chatDialog) {
for (ManagingDialogsCallbacks listener : getManagingDialogsCallbackListeners()) {
listener.onNewDialogLoaded(chatDialog);
}
}
public void addManagingDialogsCallbackListener(ManagingDialogsCallbacks listener){
if (listener != null){
managingDialogsCallbackListener.add(listener);
}
}
public void removeManagingDialogsCallbackListener(ManagingDialogsCallbacks listener) {
managingDialogsCallbackListener.remove(listener);
}
public Collection<ManagingDialogsCallbacks> getManagingDialogsCallbackListeners() {
return Collections.unmodifiableCollection(managingDialogsCallbackListener);
}
public interface ManagingDialogsCallbacks{
void onDialogCreated(QBChatDialog chatDialog);
void onDialogUpdated(String chatDialog);
void onNewDialogLoaded(QBChatDialog chatDialog);
}
}