package xmpp.client.service.chat.single; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManager; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smackx.ChatState; import org.jivesoftware.smackx.ChatStateListener; import xmpp.client.service.chat.InternalChatManager; import xmpp.client.service.user.User; public class SingleChat extends xmpp.client.service.chat.Chat implements MessageListener, ChatStateListener { @SuppressWarnings("unused") private static final String TAG = SingleChat.class.getName(); Chat mChat; InternalChatManager mInternalManager; User mUser; public SingleChat(ChatManager chatManager, String jid, InternalChatManager internalManager, User user) { this(chatManager.createChat(jid, null), internalManager, user); } public SingleChat(org.jivesoftware.smack.Chat smackChat, InternalChatManager internalManager, User user) { mChat = smackChat; mInternalManager = internalManager; mUser = user; mChat.addMessageListener(this); } @Override public void close() { mChat.removeMessageListener(this); } public boolean contains(Chat chat) { if (mChat.equals(chat)) { return true; } return false; } public boolean equals(SingleChat o) { return o.contains(mChat); } @Override public int getChatType() { return CHAT_SINGLE; } @Override public String getIdentifier() { return mChat.getParticipant(); } public Chat getInternalChat() { return mChat; } @Override public String getThreadID() { return mChat.getThreadID(); } @Override public boolean isMe(String from) { if (!from.equalsIgnoreCase(getIdentifier())) { return true; } return false; } public boolean nearly(Chat chat) { if (chat.getParticipant().equalsIgnoreCase(mChat.getParticipant())) { return true; } return false; } public boolean nearly(SingleChat chat) { return chat.nearly(mChat); } @Override public void processMessage(org.jivesoftware.smack.Chat smackChat, Message smackMessage) { mInternalManager.processMessage(this, smackMessage); } @Override public void sendMessage(String participant, String text) { if (getIdentifier().equalsIgnoreCase(participant)) { try { mChat.sendMessage(text); final Message msg = new Message(participant); msg.setBody(text); msg.setFrom(mUser.getFullUserLogin()); mInternalManager.processMessage(this, msg); } catch (final XMPPException e) { throw new RuntimeException(e); } } } @Override public void stateChanged(org.jivesoftware.smack.Chat smackChat, ChatState state) { int s = CHATSTATE_UNKNOWN; switch (state) { case active: s = CHATSTATE_ACTIVE; break; case composing: s = CHATSTATE_COMPOSING; break; case inactive: s = CHATSTATE_INACTIVE; break; case gone: s = CHATSTATE_GONE; break; case paused: s = CHATSTATE_PAUSED; break; } updateChatState(s); mInternalManager.chatStateChanged(this); } }