Conversation.java revision c1fb9a9c2730178105977fca629e80951bfc3cdc
1732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang/** 2732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * Copyright (c) 2012, Google Inc. 3732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * 4732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * Licensed under the Apache License, Version 2.0 (the "License"); 5732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * you may not use this file except in compliance with the License. 6732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * You may obtain a copy of the License at 7732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * 8732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * http://www.apache.org/licenses/LICENSE-2.0 9732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * 10732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * Unless required by applicable law or agreed to in writing, software 11732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * distributed under the License is distributed on an "AS IS" BASIS, 12732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * See the License for the specific language governing permissions and 14732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang * limitations under the License. 15732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang */ 16732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 17732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpackage com.android.mail.providers; 18732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 19bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereiraimport android.content.Context; 20732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.database.Cursor; 21732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.net.Uri; 22732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcel; 23732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcelable; 24e623a0f6e3caa9cafec913cf826e946628833517Andy Huangimport android.provider.BaseColumns; 25bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereiraimport android.text.SpannableStringBuilder; 265c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereiraimport android.text.TextUtils; 27732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 28bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereiraimport com.android.mail.R; 29ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereiraimport com.android.mail.providers.UIProvider.ConversationColumns; 30a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blankimport com.google.common.collect.ImmutableList; 31a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank 3200ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereiraimport java.util.ArrayList; 33440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collection; 34440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections; 35b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huangimport java.util.List; 36440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 37732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable { 38f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public static final int NO_POSITION = -1; 39732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 40820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook private static final String EMPTY_STRING = ""; 41820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook 42e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 43e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see BaseColumns#_ID 44e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 45732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long id; 46e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 47e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#URI 48e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 49c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank public Uri uri; 50e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 51e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SUBJECT 52e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 53732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String subject; 54e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 55e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#DATE_RECEIVED_MS 56e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 57732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public long dateMs; 58e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 59e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SNIPPET 60e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 61aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira @Deprecated 62732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String snippet; 63e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 64e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#HAS_ATTACHMENTS 65e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 66732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public boolean hasAttachments; 67e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 68e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#MESSAGE_LIST_URI 69e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 70cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri messageListUri; 71e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 72e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SENDER_INFO 73e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 74648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira @Deprecated 754db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public String senders; 76e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 77e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#NUM_MESSAGES 78e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 790972e0793cc321670391d063348aecb5031b2677Mindy Pereira private int numMessages; 80e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 81e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#NUM_DRAFTS 82e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 830972e0793cc321670391d063348aecb5031b2677Mindy Pereira private int numDrafts; 84e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 85e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SENDING_STATE 86e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 874db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int sendingState; 88e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 89e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#PRIORITY 90e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 914db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int priority; 92e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 93e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#READ 94e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 95c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean read; 96e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 97e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#STARRED 98e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 99c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean starred; 100e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 101e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#RAW_FOLDERS 102e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 103b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang private FolderList rawFolders; 104e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 105e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#FLAGS 106e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 10722657529437c160dec072115c5982409306c1313Mindy Pereira public int convFlags; 108e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 109e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#PERSONAL_LEVEL 110e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 11122657529437c160dec072115c5982409306c1313Mindy Pereira public int personalLevel; 112e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 113e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SPAM 114e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 115863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira public boolean spam; 116e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 117e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#MUTED 118e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 119863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira public boolean muted; 120e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 12176b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook * @see UIProvider.ConversationColumns#PHISHING 12276b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook */ 12376b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook public boolean phishing; 12476b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook /** 125e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#COLOR 126e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 12792939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank public int color; 128e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 129e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#ACCOUNT_URI 130e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 131a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank public Uri accountUri; 132648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira /** 133648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * @see UIProvider.ConversationColumns#CONVERSATION_INFO 134648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira */ 135648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira public ConversationInfo conversationInfo; 13641dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook /** 137cebcc64fbd69618ff89f9fac0bfe9b9e7d7ce104Paul Westbrook * @see UIProvider.ConversationColumns#CONVERSATION_BASE_URI 13841dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook */ 13941dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook public Uri conversationBaseUri; 140f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang /** 141f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang * @see UIProvider.ConversationColumns#REMOTE 142f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang */ 143f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang public boolean isRemote; 14422657529437c160dec072115c5982409306c1313Mindy Pereira 145ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank // Used within the UI to indicate the adapter position of this conversation 146f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public transient int position; 147648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Used within the UI to indicate that a Conversation should be removed from 148648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // the ConversationCursor when executing an update, e.g. the the 149648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Conversation is no longer in the ConversationList for the current folder, 150648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // that is it's now in some other folder(s) 151ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public transient boolean localDeleteOnUpdate; 152732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 153cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang private transient boolean viewed; 154cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang 15585c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira private ArrayList<Folder> cachedDisplayableFolders; 15600ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira 1573bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp private static String sSendersDelimeter; 1583bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp 1592909b7442130800d6c6c20c1227d65295262f03emindyp private static String sSubjectAndSnippet; 1602909b7442130800d6c6c20c1227d65295262f03emindyp 161e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank // Constituents of convFlags below 162648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Flag indicating that the item has been deleted, but will continue being 163648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // shown in the list Delete/Archive of a mostly-dead item will NOT propagate 164648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // the delete/archive, but WILL remove the item from the cursor 165e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public static final int FLAG_MOSTLY_DEAD = 1 << 0; 166e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 167440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** An immutable, empty conversation list */ 168440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal public static final Collection<Conversation> EMPTY = Collections.emptyList(); 169440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 170732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 171732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public int describeContents() { 172732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return 0; 173732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 174732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 175732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 176732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public void writeToParcel(Parcel dest, int flags) { 177732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(id); 178c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank dest.writeParcelable(uri, flags); 179732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeString(subject); 180732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(dateMs); 181732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeString(snippet); 182f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(hasAttachments ? 1 : 0); 183cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(messageListUri, 0); 1844db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeString(senders); 1854db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(numMessages); 1864db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(numDrafts); 1874db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(sendingState); 1884db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(priority); 189f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(read ? 1 : 0); 190f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(starred ? 1 : 0); 191b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang dest.writeParcelable(rawFolders, 0); 19222657529437c160dec072115c5982409306c1313Mindy Pereira dest.writeInt(convFlags); 19322657529437c160dec072115c5982409306c1313Mindy Pereira dest.writeInt(personalLevel); 194863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira dest.writeInt(spam ? 1 : 0); 19576b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook dest.writeInt(phishing ? 1 : 0); 196863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira dest.writeInt(muted ? 1 : 0); 19792939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank dest.writeInt(color); 198a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank dest.writeParcelable(accountUri, 0); 199351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang dest.writeParcelable(conversationInfo, 0); 20041dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook dest.writeParcelable(conversationBaseUri, 0); 201f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(isRemote ? 1 : 0); 202732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 203732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 204351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang private Conversation(Parcel in, ClassLoader loader) { 205732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = in.readLong(); 206c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = in.readParcelable(null); 207732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = in.readString(); 208732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = in.readLong(); 209732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang snippet = in.readString(); 210f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang hasAttachments = (in.readInt() != 0); 211cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira messageListUri = in.readParcelable(null); 212820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook senders = emptyIfNull(in.readString()); 2134db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numMessages = in.readInt(); 2144db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira numDrafts = in.readInt(); 2154db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = in.readInt(); 2164db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = in.readInt(); 217f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang read = (in.readInt() != 0); 218f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang starred = (in.readInt() != 0); 219b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang rawFolders = in.readParcelable(loader); 22022657529437c160dec072115c5982409306c1313Mindy Pereira convFlags = in.readInt(); 22122657529437c160dec072115c5982409306c1313Mindy Pereira personalLevel = in.readInt(); 222863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira spam = in.readInt() != 0; 22376b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook phishing = in.readInt() != 0; 224863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira muted = in.readInt() != 0; 22592939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank color = in.readInt(); 226a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank accountUri = in.readParcelable(null); 227f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 228ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 229351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang conversationInfo = in.readParcelable(loader); 23041dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook conversationBaseUri = in.readParcelable(null); 231f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang isRemote = in.readInt() != 0; 232732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 233732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 234732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 235732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String toString() { 2367dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal return "[conversation id=" + id + ", subject =" + subject + "]"; 237732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 238732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 239351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public static final ClassLoaderCreator<Conversation> CREATOR = 240351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang new ClassLoaderCreator<Conversation>() { 241732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 242732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 243732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation createFromParcel(Parcel source) { 244351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang return new Conversation(source, null); 245351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang } 246351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang 247351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang @Override 248351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public Conversation createFromParcel(Parcel source, ClassLoader loader) { 249351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang return new Conversation(source, loader); 250732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 251732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 252732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 253732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation[] newArray(int size) { 254732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation[size]; 255732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 256732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 257732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang }; 258732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 259acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations"); 260acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira 261ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira /** 262ae7e6a0786a2d890b77c783d7ac39a90523b8154mindyp * The column that needs to be updated to change the folders for a conversation. 263ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira */ 26400ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira public static final String UPDATE_FOLDER_COLUMN = ConversationColumns.RAW_FOLDERS; 265ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira 266a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira public Conversation(Cursor cursor) { 267732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang if (cursor != null) { 268732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN); 269c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN)); 270732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN); 271732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN); 272374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank // Don't allow null subject 273374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank if (subject == null) { 274374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank subject = ""; 275374863eeb0ee37f1ca7d57840e6f02aaa052e284Marc Blank } 27687d535fe423d782c3a0343c649330d309976f655Mindy Pereira hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0; 277648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira String messageList = cursor.getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN); 2785c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereira messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null; 2794db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN); 2804db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN); 28187d535fe423d782c3a0343c649330d309976f655Mindy Pereira read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0; 28287d535fe423d782c3a0343c649330d309976f655Mindy Pereira starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0; 283b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang rawFolders = FolderList.fromBlob( 284b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang cursor.getBlob(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN)); 28522657529437c160dec072115c5982409306c1313Mindy Pereira convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN); 28622657529437c160dec072115c5982409306c1313Mindy Pereira personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN); 287863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0; 28876b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook phishing = cursor.getInt(UIProvider.CONVERSATION_IS_PHISHING_COLUMN) != 0; 289863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0; 29092939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN); 291a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank String account = cursor.getString(UIProvider.CONVERSATION_ACCOUNT_URI_COLUMN); 292a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank accountUri = !TextUtils.isEmpty(account) ? Uri.parse(account) : null; 293f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 294ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 295351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang conversationInfo = ConversationInfo.fromBlob( 296351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang cursor.getBlob(UIProvider.CONVERSATION_INFO_COLUMN)); 29741dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook final String conversationBase = 29841dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook cursor.getString(UIProvider.CONVERSATION_BASE_URI_COLUMN); 29941dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook conversationBaseUri = !TextUtils.isEmpty(conversationBase) ? 30041dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook Uri.parse(conversationBase) : null; 301e8a3eecf0a481665c5e886ebfb4a6184b5125f78Mindy Pereira if (conversationInfo == null) { 302e8a3eecf0a481665c5e886ebfb4a6184b5125f78Mindy Pereira snippet = cursor.getString(UIProvider.CONVERSATION_SNIPPET_COLUMN); 303820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook senders = emptyIfNull(cursor.getString(UIProvider.CONVERSATION_SENDER_INFO_COLUMN)); 3040972e0793cc321670391d063348aecb5031b2677Mindy Pereira numMessages = cursor.getInt(UIProvider.CONVERSATION_NUM_MESSAGES_COLUMN); 3050972e0793cc321670391d063348aecb5031b2677Mindy Pereira numDrafts = cursor.getInt(UIProvider.CONVERSATION_NUM_DRAFTS_COLUMN); 306e8a3eecf0a481665c5e886ebfb4a6184b5125f78Mindy Pereira } 307f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang isRemote = cursor.getInt(UIProvider.CONVERSATION_REMOTE_COLUMN) != 0; 308732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 309732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 310732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 311bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook public Conversation() { 312ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook } 313ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 314863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira public static Conversation create(long id, Uri uri, String subject, long dateMs, 315863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira String snippet, boolean hasAttachment, Uri messageListUri, String senders, 316863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira int numMessages, int numDrafts, int sendingState, int priority, boolean read, 317b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang boolean starred, FolderList rawFolders, int convFlags, int personalLevel, boolean spam, 31841dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook boolean phishing, boolean muted, Uri accountUri, ConversationInfo conversationInfo, 319b8361c9f8938b74977316319885998aae09aab77Paul Westbrook Uri conversationBase, boolean isRemote) { 320ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 321ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook final Conversation conversation = new Conversation(); 322ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 323ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.id = id; 324ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.uri = uri; 325ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.subject = subject; 326ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.dateMs = dateMs; 327ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.snippet = snippet; 328ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.hasAttachments = hasAttachment; 329ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.messageListUri = messageListUri; 330820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook conversation.senders = emptyIfNull(senders); 331ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.numMessages = numMessages; 332ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.numDrafts = numDrafts; 333ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.sendingState = sendingState; 334ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.priority = priority; 335ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.read = read; 336ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.starred = starred; 337ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.rawFolders = rawFolders; 338ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.convFlags = convFlags; 339ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook conversation.personalLevel = personalLevel; 340863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira conversation.spam = spam; 34176b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook conversation.phishing = phishing; 342863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira conversation.muted = muted; 34392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank conversation.color = 0; 344a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank conversation.accountUri = accountUri; 3457e854f52f0890b9621846ac7fe201a5681e65666Andy Huang conversation.conversationInfo = conversationInfo; 34641dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook conversation.conversationBaseUri = conversationBase; 347f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang conversation.isRemote = isRemote; 348ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook return conversation; 349ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook } 350ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 351b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang /** 352b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * Get the <strong>immutable</strong> list of {@link Folder}s for this conversation. To modify 353b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * this list, make a new {@link FolderList} and use {@link #setRawFolders(FolderList)}. 354b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * 355b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * @return <strong>Immutable</strong> list of {@link Folder}s. 356b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang */ 357b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang public List<Folder> getRawFolders() { 358b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang return rawFolders.folders; 35900ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira } 36000ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira 361b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang public void setRawFolders(FolderList folders) { 36285c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira clearCachedFolders(); 363b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang rawFolders = folders; 36485c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira } 36585c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira 36685c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira private void clearCachedFolders() { 36785c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira cachedDisplayableFolders = null; 36885c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira } 36985c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira 37085c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira public ArrayList<Folder> getRawFoldersForDisplay(Folder ignoreFolder) { 37185c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira if (cachedDisplayableFolders == null) { 37285c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira cachedDisplayableFolders = new ArrayList<Folder>(); 373b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang for (Folder folder : rawFolders.folders) { 3748eca4db9069941d2b8afbe6f75e3af75a4310f27Andy Huang // skip the ignoreFolder 3758eca4db9069941d2b8afbe6f75e3af75a4310f27Andy Huang if (ignoreFolder != null && ignoreFolder.equals(folder)) { 37685c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira continue; 37785c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira } 37885c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira cachedDisplayableFolders.add(folder); 37985c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira } 38085c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira } 38185c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira return cachedDisplayableFolders; 38285c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira } 38385c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira 384e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank @Override 385e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public boolean equals(Object o) { 3863c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank if (o instanceof Conversation) { 387648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira Conversation conv = (Conversation) o; 3883c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank return conv.uri.equals(uri); 3893c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank } 3903c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank return false; 391e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 392e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 393e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank @Override 394e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public int hashCode() { 395e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank return uri.hashCode(); 396e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 397e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 3987f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira /** 3997f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira * Get if this conversation is marked as high priority. 4007f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira */ 4017f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira public boolean isImportant() { 40222657529437c160dec072115c5982409306c1313Mindy Pereira return priority == UIProvider.ConversationPriority.IMPORTANT; 4037f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira } 4047f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira 405e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank /** 406e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank * Get if this conversation is mostly dead 407e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank */ 408e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public boolean isMostlyDead() { 409e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank return (convFlags & FLAG_MOSTLY_DEAD) != 0; 410e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 411440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 412440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** 413648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Returns true if the URI of the conversation specified as the needle was 414648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * found in the collection of conversations specified as the haystack. False 415192fac189e6aed434556a4e37bd3c5c29ef02f29Vikram Aggarwal * otherwise. This method is safe to call with null arguments. 416f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang * 417d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @param haystack 418d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @param needle 419d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @return true if the needle was found in the haystack, false otherwise. 420d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal */ 421d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal public final static boolean contains(Collection<Conversation> haystack, Conversation needle) { 422d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal // If the haystack is empty, it cannot contain anything. 423d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal if (haystack == null || haystack.size() <= 0) { 424d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return false; 425d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 426d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal // The null folder exists everywhere. 427d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal if (needle == null) { 428d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return true; 429d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 4307dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final long toFind = needle.id; 431d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal for (final Conversation c : haystack) { 4327dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal if (toFind == c.id) { 433d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return true; 434d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 435d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 436d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return false; 437d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 438d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal 439d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal /** 440648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Returns a collection of a single conversation. This method always returns 441648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * a valid collection even if the input conversation is null. 442f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang * 443440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal * @param in a conversation, possibly null. 444440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal * @return a collection of the conversation. 445440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal */ 446440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal public static Collection<Conversation> listOf(Conversation in) { 447440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in); 448440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal return target; 449440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal } 4507dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal 4517dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal /** 452aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira * Get the snippet for this conversation. Masks that it may come from 453aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira * conversation info or the original deprecated snippet string. 454aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira */ 455aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira public String getSnippet() { 456d97782206889a5508279b75cce19d7c0fb8a3bcaMindy Pereira return conversationInfo != null && !TextUtils.isEmpty(conversationInfo.firstSnippet) ? 457d97782206889a5508279b75cce19d7c0fb8a3bcaMindy Pereira conversationInfo.firstSnippet : snippet; 458aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira } 459aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira 4603bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp public String getSenders(Context context) { 4613bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp if (conversationInfo != null) { 4623bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp ArrayList<String> senders = new ArrayList<String>(); 4633bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp for (MessageInfo m : this.conversationInfo.messageInfos) { 4643bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp senders.add(m.sender); 4653bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp } 4663bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp return TextUtils.join(getSendersDelimeter(context), senders); 4673bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp } else { 4683bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp return senders; 4693bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp } 4703bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp } 4713bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp 4723bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp private String getSendersDelimeter(Context context) { 4733bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp if (sSendersDelimeter == null) { 4743bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp sSendersDelimeter = context.getResources().getString(R.string.senders_split_token); 4753bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp } 4763bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp return sSendersDelimeter; 4773bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp } 4783bcf180f8104bc27319086a9a6ece5a3c2917c37mindyp 479aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira /** 4800972e0793cc321670391d063348aecb5031b2677Mindy Pereira * Get the number of messages for this conversation. 4810972e0793cc321670391d063348aecb5031b2677Mindy Pereira */ 4820972e0793cc321670391d063348aecb5031b2677Mindy Pereira public int getNumMessages() { 4830972e0793cc321670391d063348aecb5031b2677Mindy Pereira return conversationInfo != null ? conversationInfo.messageCount : numMessages; 4840972e0793cc321670391d063348aecb5031b2677Mindy Pereira } 4850972e0793cc321670391d063348aecb5031b2677Mindy Pereira 4860972e0793cc321670391d063348aecb5031b2677Mindy Pereira /** 4870972e0793cc321670391d063348aecb5031b2677Mindy Pereira * Get the number of drafts for this conversation. 4880972e0793cc321670391d063348aecb5031b2677Mindy Pereira */ 4890972e0793cc321670391d063348aecb5031b2677Mindy Pereira public int numDrafts() { 4900972e0793cc321670391d063348aecb5031b2677Mindy Pereira return conversationInfo != null ? conversationInfo.draftCount : numDrafts; 4910972e0793cc321670391d063348aecb5031b2677Mindy Pereira } 4920972e0793cc321670391d063348aecb5031b2677Mindy Pereira 493cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang public boolean isViewed() { 494cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang return viewed; 495cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang } 496cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang 497cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang public void markViewed() { 498cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang viewed = true; 499cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang } 500cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang 501c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public String getBaseUri(String defaultValue) { 502c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return conversationBaseUri != null ? conversationBaseUri.toString() : defaultValue; 503c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 504c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 5050972e0793cc321670391d063348aecb5031b2677Mindy Pereira /** 5067dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * Create a human-readable string of all the conversations 5077dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @param collection Any collection of conversations 5087dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @return string with a human readable representation of the conversations. 5097dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal */ 5107dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal public static String toString(Collection<Conversation> collection) { 5117dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final StringBuilder out = new StringBuilder(collection.size() + " conversations:"); 5127dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal int count = 0; 5137dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal for (final Conversation c : collection) { 5147dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal count++; 515648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Indent the conversations to make them easy to read in debug 516648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // output. 5177dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal out.append(" " + count + ": " + c.toString() + "\n"); 5187dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal } 5197dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal return out.toString(); 5207dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal } 521820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook 522820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook /** 523820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook * Returns an empty string if the specified string is null 524820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook */ 525820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook private static String emptyIfNull(String in) { 526820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook return in != null ? in : EMPTY_STRING; 527820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook } 528bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira 529bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira /** 530f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * Get the properly formatted subject and snippet string for display a 531f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * conversation. 532f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * 533f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * @param context 534f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * @param filteredSubject 535f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * @param snippet 536bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira */ 537c046e4a310462aa6998a34ff50439eb5e2508d85mindyp public static String getSubjectAndSnippetForDisplay(Context context, 538c046e4a310462aa6998a34ff50439eb5e2508d85mindyp String filteredSubject, String snippet) { 5392909b7442130800d6c6c20c1227d65295262f03emindyp if (sSubjectAndSnippet == null) { 5402909b7442130800d6c6c20c1227d65295262f03emindyp sSubjectAndSnippet = context.getString(R.string.subject_and_snippet); 5412909b7442130800d6c6c20c1227d65295262f03emindyp } 542c046e4a310462aa6998a34ff50439eb5e2508d85mindyp return (!TextUtils.isEmpty(snippet)) ? 5432909b7442130800d6c6c20c1227d65295262f03emindyp String.format(sSubjectAndSnippet, filteredSubject, snippet) 544f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp : filteredSubject; 545bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira } 546648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira} 547