package xmpp.client.ui.provider;
import xmpp.client.Constants;
import xmpp.client.service.chat.Chat;
import xmpp.client.service.chat.ChatCodes;
import xmpp.client.service.chat.ChatMessage;
import xmpp.client.service.chat.ChatSession;
import xmpp.client.service.chat.multi.MultiChatSession;
import xmpp.client.service.chat.single.SingleChatSession;
import xmpp.client.service.handlers.SimpleMessageHandler;
import xmpp.client.service.handlers.SimpleMessageHandlerClient;
import xmpp.client.service.user.UserList;
import xmpp.client.service.user.contact.Contact;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
public class ChatProvider implements SimpleMessageHandlerClient, Constants,
ChatCodes {
private static final String TAG = ChatProvider.class.getName();
private ChatSession mChatSession;
private Contact mMeContact;
private final ChatProviderListener mListener;
public ChatProvider(Contact meContact, ChatSession chatSession,
ChatProviderListener listener, SimpleMessageHandler messageHandler) {
mChatSession = chatSession;
mMeContact = meContact;
mListener = listener;
messageHandler.addClient(this);
}
public void chatSessionUpdated(ChatSession newSession) {
if (newSession.getIdentifier().equals(mChatSession.getIdentifier())) {
mChatSession = newSession;
}
}
public Contact getMeContact() {
return mMeContact;
}
public xmpp.client.service.chat.ChatMessage getMessage(int position) {
return mChatSession.getMessageList().get(position);
}
public UserList getUsers() {
if (mChatSession.isMUC() && (mChatSession instanceof MultiChatSession)) {
return ((MultiChatSession) mChatSession).getUsers();
}
final UserList u = new UserList();
if (mChatSession instanceof SingleChatSession) {
u.add(((SingleChatSession) mChatSession).getUser());
}
return u;
}
@Override
public void handleMessage(Message msg) {
try {
final Bundle b = msg.getData();
switch (msg.what) {
case SIG_MESSAGE_SENT:
case SIG_MESSAGE_GOT:
b.setClassLoader(xmpp.client.service.chat.ChatMessage.class
.getClassLoader());
final xmpp.client.service.chat.ChatMessage chatMessage = b
.getParcelable(FIELD_MESSAGE);
processMessage(null, chatMessage);
if (mListener.isReady()) {
mListener.chatProviderChanged(this);
}
break;
case SIG_CHAT_SESSION_UPDATE:
b.setClassLoader(ChatSession.class.getClassLoader());
final ChatSession newSession = b
.getParcelable(FIELD_CHAT_SESSION);
chatSessionUpdated(newSession);
if (mListener.isReady()) {
mListener.chatProviderChanged(this);
}
break;
}
} catch (final Exception e) {
Log.e(TAG, "handleMessage", e);
}
}
public boolean isMUC() {
return mChatSession.isMUC();
}
@Override
public boolean isReady() {
return true;
}
public void processMessage(Chat chat, ChatMessage chatMessage) {
mChatSession.addMessage(chatMessage);
}
public void setMeContact(Contact contact) {
mMeContact = contact;
}
public void setSession(ChatSession mSession) {
mChatSession = mSession;
}
public int size() {
return mChatSession.getMessageList().size();
}
}