org.tweetalib.android.model.TwitterDirectMessages.java Source code

Java tutorial

Introduction

Here is the source code for org.tweetalib.android.model.TwitterDirectMessages.java

Source

/*
 * 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;
}