package xmpp.client.service.chat; import java.util.ArrayList; import org.jivesoftware.smack.ChatManager; import org.jivesoftware.smack.ChatManagerListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.Message; import xmpp.client.service.ConnectionProvider; import xmpp.client.service.bookmark.BookmarkService; import xmpp.client.service.bookmark.BookmarkServiceProvider; import xmpp.client.service.chat.multi.MultiChat; import xmpp.client.service.chat.single.SingleChat; import xmpp.client.service.user.UserService; import xmpp.client.service.user.UserServiceProvider; import android.util.Log; public class InternalChatManager implements ChatManagerListener, ChatCodes, BookmarkServiceProvider, UserServiceProvider, ChatServiceProvider, ConnectionProvider { private static final String TAG = InternalChatManager.class.getName(); private ChatManager mChatManager; private ArrayList<Chat> mChatList; private final UserServiceProvider mUserServiceProvider; private final ChatServiceProvider mChatServiceProvider; private final BookmarkServiceProvider mBookmarkServiceProvider; private final ConnectionProvider mConnectionProvider; public InternalChatManager(UserServiceProvider userServiceProvider, BookmarkServiceProvider bookmarkServiceProvider, ChatServiceProvider chatServiceProvider, ConnectionProvider connectionProvider) { mUserServiceProvider = userServiceProvider; mChatServiceProvider = chatServiceProvider; mBookmarkServiceProvider = bookmarkServiceProvider; mConnectionProvider = connectionProvider; mChatManager = getConnection().getChatManager(); mChatManager.addChatListener(this); mChatList = new ArrayList<Chat>(); } @Override public void chatCreated(org.jivesoftware.smack.Chat smackChat, boolean createdLocally) { if (createdLocally) { return; } final Chat chat = getChat(smackChat); getChatService().chatCreated(chat, createdLocally); } public void chatStateChanged(Chat chat) { getChatService().chatStateChanged(chat); } public void chatUpdated(Chat chat) { getChatService().chatUpdated(chat); } public Chat createChat(String id, int chatType) { switch (chatType) { case CHAT_SINGLE: final SingleChat singleChat = new SingleChat(mChatManager, id, this, getUserService().getUserMe()); insertEntry(singleChat); return singleChat; case CHAT_MULTI: final MultiChat multiChat = new MultiChat(this, getBookmarkService().getConferenceHandler() .getMultiUserChatInfo(id), this, this); insertEntry(multiChat); return multiChat; } return null; } public void destroy() { mChatManager.removeChatListener(this); mChatManager = null; for (final Chat chat : mChatList) { chat.close(); } mChatList.clear(); mChatList = null; } @Override public BookmarkService getBookmarkService() { return mBookmarkServiceProvider.getBookmarkService(); } public Chat getChat(org.jivesoftware.smack.Chat smackChat) { Chat c = null; final ArrayList<Chat> chats = new ArrayList<Chat>(); for (final Chat chat : mChatList) { if (chat instanceof SingleChat) { if (((SingleChat) chat).contains(smackChat)) { c = chat; } else if (((SingleChat) chat).nearly(smackChat)) { chats.add(chat); } } } for (final Chat chat : chats) { mChatList.remove(chat); } if (c != null) { return c; } return insertEntry(smackChat); } @Override public ChatService getChatService() { return mChatServiceProvider.getChatService(); } @Override public XMPPConnection getConnection() { return mConnectionProvider.getConnection(); } @Override public UserService getUserService() { return mUserServiceProvider.getUserService(); } public Chat insertEntry(Chat chat) { mChatList.add(chat); return chat; } public Chat insertEntry(org.jivesoftware.smack.Chat smackChat) { return insertEntry(new SingleChat(smackChat, this, getUserService() .getUserMe())); } public void processMessage(Chat chat, Message smackMessage) { try { if (smackMessage.getBody() != null) { final xmpp.client.service.chat.ChatMessage chatMessage = MessageCreator .getInstance(getUserService()).createMessage(chat, smackMessage); getChatService().processMessage(chat, chatMessage); } } catch (final Exception e) { Log.e(TAG, "processMessage", e); } } }