/* * Copyright (C) 2013 Chris Lacy * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.tweetalib.android.model; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import twitter4j.DirectMessage; import twitter4j.ResponseList; import twitter4j.User; public class TwitterDirectMessages { public ArrayList<TwitterDirectMessage> getRawReceivedMessages() { ArrayList<TwitterDirectMessage> list = new ArrayList<TwitterDirectMessage>(); for (Conversation c : mConversations) { for (TwitterDirectMessage message : c.getMessages()) { if (message.getMessageType() == TwitterDirectMessage.MessageType.RECEIVED) list.add(message); } } return list; } public void insert(TwitterDirectMessages directMessages) { ArrayList<TwitterDirectMessage> newMessages = directMessages.getAllMessages(); for (int i = 0; i < newMessages.size(); i++) { TwitterDirectMessage message = newMessages.get(i); add(message); } if (newMessages.size() > 0) { sort(); } } class Conversation implements Comparable<Conversation> { /* * */ public Conversation(Long otherUserId) { mMessages = new ArrayList<TwitterDirectMessage>(); mOtherUserId = otherUserId; } /* * */ void add(TwitterDirectMessage message) { mMessages.add(message); } /* * */ public TwitterDirectMessage getNewest() { if (mMessages != null && mMessages.size() > 0) { return mMessages.get(0); } return null; } /* * */ public TwitterDirectMessage getOldest() { if (mMessages != null && mMessages.size() > 0) { return mMessages.get(mMessages.size() - 1); } return null; } /* * (non-Javadoc) * * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(Conversation other) { TwitterDirectMessage thisMostRecent = getNewest(); TwitterDirectMessage otherMostRecent = other.getNewest(); if (thisMostRecent != null && otherMostRecent != null && thisMostRecent.getCreatedAt().before( otherMostRecent.getCreatedAt())) { return 1; } return -1; } /* * */ void sort() { Collections.sort(mMessages); } /* * */ void removeDuplicates() { sort(); int size = mMessages.size(); if (size > 1) { TwitterDirectMessage previous = null; for (Iterator<TwitterDirectMessage> it = mMessages.iterator(); it .hasNext(); ) { TwitterDirectMessage current = it.next(); if (previous != null && current.getId() == previous.getId()) { it.remove(); } else { previous = current; } } } } /* * */ public ArrayList<TwitterDirectMessage> getMessages() { return mMessages; } /* * */ private final ArrayList<TwitterDirectMessage> mMessages; final Long mOtherUserId; public void remove(ArrayList<TwitterDirectMessage> searchMessages) { for (TwitterDirectMessage message : searchMessages) { TwitterDirectMessage toRemove = null; for (TwitterDirectMessage conversationMessage : getMessages()) { if (conversationMessage.getId() == message.getId()) { toRemove = conversationMessage; break; } } if (toRemove != null) { mMessages.remove(toRemove); } } } } /* * */ public interface AddUserCallback { public void addUser(User user); } /* * */ public TwitterDirectMessages(long messageOwnerId) { mConversations = new ArrayList<Conversation>(); mConversationHandle = new TwitterDirectMessagesHandle(messageOwnerId, null); mMessageOwnerId = messageOwnerId; } /* * */ public void add(ResponseList<DirectMessage> sentDirectMessages, ResponseList<DirectMessage> receivedDirectMessages, AddUserCallback addUserCallback) { for (int i = 0; i < 2; i++) { ResponseList<DirectMessage> directMessages = i == 0 ? sentDirectMessages : receivedDirectMessages; if (directMessages != null) { for (DirectMessage directMessage : directMessages) { User otherUser = getOtherParty(directMessage); if (otherUser != null) { if (addUserCallback != null) { if (otherUser != null) { addUserCallback.addUser(otherUser); } } add(new TwitterDirectMessage(directMessage, otherUser)); } } } } // Sort the messages in the conversation first up for (Conversation conversation : mConversations) { conversation.removeDuplicates(); } sort(); } /* * */ public void add(DirectMessage directMessage) { User otherUser = getOtherParty(directMessage); if (otherUser != null) { add(new TwitterDirectMessage(directMessage, otherUser)); } } /* * */ public void add(TwitterDirectMessage message) { Conversation conversation = getConversationForMessage(message); if (conversation == null) { conversation = new Conversation(message.getOtherUserId()); mConversations.add(conversation); } conversation.add(message); conversation.removeDuplicates(); // Log.d("TweetALib", "Message type: " + (message.getMessageType() == // MessageType.SENT ? // "Sent" : "received") + ", message: " + message.getText()); } public void add(TwitterDirectMessages directMessages) { for (TwitterDirectMessage message : directMessages.getAllMessages()) { add(message); } } public void remove(TwitterDirectMessages directMessages) { ArrayList<Conversation> removeConversations = new ArrayList<Conversation>(); for (Conversation conversation : mConversations) { conversation.remove(directMessages.getAllMessages()); if (conversation.mMessages.size() == 0) { removeConversations.add(conversation); } } for (Conversation conversation : removeConversations) { mConversations.remove(conversation); } } /* * */ Conversation getConversationForMessage(TwitterDirectMessage message) { Conversation result = null; for (Conversation conversation : mConversations) { TwitterDirectMessage mostRecent = conversation.getNewest(); if (mostRecent != null) { if (mostRecent.getOtherUserId() == message.getOtherUserId()) { result = conversation; break; } } } return result; } public ArrayList<TwitterDirectMessage> getAllMessagesInConversation(TwitterDirectMessage message) { Conversation fullConvo = getConversationForMessage(message); ArrayList<TwitterDirectMessage> allMessages = new ArrayList<TwitterDirectMessage>(); if (fullConvo != null) { allMessages = fullConvo.mMessages; } return allMessages; } /* * */ private User getOtherParty(DirectMessage directMessage) { if (mMessageOwnerId != directMessage.getRecipientId()) { return directMessage.getRecipient(); } return directMessage.getSender(); } /* * */ public ArrayList<TwitterDirectMessage> getList( TwitterDirectMessagesHandle handle) { if (handle.getKey().equals(mConversationHandle.getKey()) && handle.mOtherUserId == null) { ArrayList<TwitterDirectMessage> topMessages = new ArrayList<TwitterDirectMessage>(); for (int i = 0; i < mConversations.size(); i++) { TwitterDirectMessage message = mConversations.get(i) .getNewest(); if (message != null) { topMessages.add(message); } } return topMessages; } for (Conversation conversation : mConversations) { if (conversation.mOtherUserId.longValue() == handle.mOtherUserId .longValue()) { return conversation.getMessages(); } } return null; } public ArrayList<TwitterDirectMessage> getAllMessages() { ArrayList<TwitterDirectMessage> messages = new ArrayList<TwitterDirectMessage>(); for (Conversation conversation : mConversations) { messages.addAll(conversation.getMessages()); } return messages; } public ArrayList<TwitterDirectMessage> getAllConversation(long otherUserId) { ArrayList<TwitterDirectMessage> messages = new ArrayList<TwitterDirectMessage>(); for (Conversation conversation : mConversations) { if (conversation.mOtherUserId == otherUserId) { messages.addAll(conversation.getMessages()); } } return messages; } /* * */ public int getConversationCount() { if (mConversations != null) { return mConversations.size(); } return 0; } /* * */ public Long getNewestDirectMessageId() { if (mConversations != null && mConversations.size() > 0) { return mConversations.get(0).getNewest().getId(); } return null; } /* * */ public Long getOldestDirectMessageId() { if (mConversations != null && mConversations.size() > 0) { return mConversations.get(mConversations.size() - 1).getOldest() .getId(); } return null; } /* * */ void sort() { Collections.sort(mConversations); } /* * */ private final long mMessageOwnerId; private final ArrayList<Conversation> mConversations; private final TwitterDirectMessagesHandle mConversationHandle; }