Conversation.java revision edd6c1a2807d2ade930dfd4622707298dc470d64
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 191bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huangimport android.content.ContentValues; 20bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereiraimport android.content.Context; 21732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.database.Cursor; 22732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.net.Uri; 237f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huangimport android.os.Bundle; 24732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcel; 25732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangimport android.os.Parcelable; 26e623a0f6e3caa9cafec913cf826e946628833517Andy Huangimport android.provider.BaseColumns; 275c765b9c5dd8a9a9421260ba8b46d06073391c73Mindy Pereiraimport android.text.TextUtils; 28732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 29bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereiraimport com.android.mail.R; 305f578144cc01738d5f9988d61674a643df19fdaeScott Kennedyimport com.android.mail.browse.ConversationCursor; 315f578144cc01738d5f9988d61674a643df19fdaeScott Kennedyimport com.android.mail.content.CursorCreator; 32ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereiraimport com.android.mail.providers.UIProvider.ConversationColumns; 331367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrookimport com.android.mail.providers.UIProvider.ConversationCursorCommand; 345f578144cc01738d5f9988d61674a643df19fdaeScott Kennedyimport com.android.mail.ui.ConversationCursorLoader; 359e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huangimport com.android.mail.utils.LogTag; 369e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huangimport com.android.mail.utils.LogUtils; 37a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blankimport com.google.common.collect.ImmutableList; 38d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Weiimport com.google.common.collect.Lists; 39a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank 4000ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereiraimport java.util.ArrayList; 41440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collection; 42440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections; 43b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huangimport java.util.List; 44440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 45732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huangpublic class Conversation implements Parcelable { 46f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public static final int NO_POSITION = -1; 47732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 489e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang private static final String LOG_TAG = LogTag.getLogTag(); 499e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang 50820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook private static final String EMPTY_STRING = ""; 51820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook 52e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 53e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see BaseColumns#_ID 54e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 55edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final long id; 56e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 57e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#URI 58e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 59edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final Uri uri; 60e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 61e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SUBJECT 62e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 63edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final String subject; 64e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 65e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#DATE_RECEIVED_MS 66e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 67edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final long dateMs; 68e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 69e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#HAS_ATTACHMENTS 70e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 71edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final boolean hasAttachments; 72e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 73479505d71969e26b0785d8e0e1b81108731cf827Mark Wei * Union of attachmentPreviewUri0 and attachmentPreviewUri1 74479505d71969e26b0785d8e0e1b81108731cf827Mark Wei */ 75479505d71969e26b0785d8e0e1b81108731cf827Mark Wei public transient ArrayList<String> attachmentPreviews; 76479505d71969e26b0785d8e0e1b81108731cf827Mark Wei /** 77479505d71969e26b0785d8e0e1b81108731cf827Mark Wei * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEW_URI0 78479505d71969e26b0785d8e0e1b81108731cf827Mark Wei */ 79479505d71969e26b0785d8e0e1b81108731cf827Mark Wei public String attachmentPreviewUri0; 80479505d71969e26b0785d8e0e1b81108731cf827Mark Wei /** 81479505d71969e26b0785d8e0e1b81108731cf827Mark Wei * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEW_URI1 82479505d71969e26b0785d8e0e1b81108731cf827Mark Wei */ 83479505d71969e26b0785d8e0e1b81108731cf827Mark Wei public String attachmentPreviewUri1; 84479505d71969e26b0785d8e0e1b81108731cf827Mark Wei /** 85479505d71969e26b0785d8e0e1b81108731cf827Mark Wei * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEW_STATES 86479505d71969e26b0785d8e0e1b81108731cf827Mark Wei */ 87edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final int attachmentPreviewStates; 88479505d71969e26b0785d8e0e1b81108731cf827Mark Wei /** 89479505d71969e26b0785d8e0e1b81108731cf827Mark Wei * @see UIProvider.ConversationColumns#ATTACHMENT_PREVIEWS_COUNT 90479505d71969e26b0785d8e0e1b81108731cf827Mark Wei */ 91edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final int attachmentPreviewsCount; 92479505d71969e26b0785d8e0e1b81108731cf827Mark Wei /** 93e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#MESSAGE_LIST_URI 94e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 95edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final Uri messageListUri; 96e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 97e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SENDING_STATE 98e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 99edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final int sendingState; 100e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 101e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#PRIORITY 102e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 1034db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira public int priority; 104e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 105e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#READ 106e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 107c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean read; 108e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 109d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy * @see UIProvider.ConversationColumns#SEEN 110d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy */ 111d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy public boolean seen; 112d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy /** 113e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#STARRED 114e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 115c8a994227b9c686d88ee05840544162711a85712Marc Blank public boolean starred; 116e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 117e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#RAW_FOLDERS 118e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 119b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang private FolderList rawFolders; 120e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 121e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#FLAGS 122e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 12322657529437c160dec072115c5982409306c1313Mindy Pereira public int convFlags; 124e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 125e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#PERSONAL_LEVEL 126e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 127edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final int personalLevel; 128e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 129e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#SPAM 130e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 131edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final boolean spam; 132e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 133e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#MUTED 134e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 135edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final boolean muted; 136e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 13776b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook * @see UIProvider.ConversationColumns#PHISHING 13876b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook */ 139edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final boolean phishing; 14076b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook /** 141e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#COLOR 142e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 143edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final int color; 144e623a0f6e3caa9cafec913cf826e946628833517Andy Huang /** 145e623a0f6e3caa9cafec913cf826e946628833517Andy Huang * @see UIProvider.ConversationColumns#ACCOUNT_URI 146e623a0f6e3caa9cafec913cf826e946628833517Andy Huang */ 147edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final Uri accountUri; 148648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira /** 149648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * @see UIProvider.ConversationColumns#CONVERSATION_INFO 150648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira */ 151edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final ConversationInfo conversationInfo; 15241dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook /** 153cebcc64fbd69618ff89f9fac0bfe9b9e7d7ce104Paul Westbrook * @see UIProvider.ConversationColumns#CONVERSATION_BASE_URI 15441dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook */ 155edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final Uri conversationBaseUri; 156f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang /** 157f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang * @see UIProvider.ConversationColumns#REMOTE 158f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang */ 159edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public final boolean isRemote; 16022657529437c160dec072115c5982409306c1313Mindy Pereira 161dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy /** 162dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy * Used within the UI to indicate the adapter position of this conversation 163dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy * 164dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy * @deprecated Keeping this in sync with the desired value is a not always done properly, is a 165dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy * source of bugs, and is a bad idea in general. Do not trust this value. Try to 166dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy * migrate code away from using it. 167dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy */ 168dbb587f15c723ae80edb33f65c29cc2b6c15eba0Scott Kennedy @Deprecated 169f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank public transient int position; 170648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Used within the UI to indicate that a Conversation should be removed from 171648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // the ConversationCursor when executing an update, e.g. the the 172648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Conversation is no longer in the ConversationList for the current folder, 173648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // that is it's now in some other folder(s) 174ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank public transient boolean localDeleteOnUpdate; 175732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 176cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang private transient boolean viewed; 177cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang 1782909b7442130800d6c6c20c1227d65295262f03emindyp private static String sSubjectAndSnippet; 1792909b7442130800d6c6c20c1227d65295262f03emindyp 180e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank // Constituents of convFlags below 181648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Flag indicating that the item has been deleted, but will continue being 182648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // shown in the list Delete/Archive of a mostly-dead item will NOT propagate 183648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // the delete/archive, but WILL remove the item from the cursor 184e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public static final int FLAG_MOSTLY_DEAD = 1 << 0; 185e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 186440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** An immutable, empty conversation list */ 187440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal public static final Collection<Conversation> EMPTY = Collections.emptyList(); 188440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 189732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 190732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public int describeContents() { 191732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return 0; 192732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 193732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 194732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 195732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public void writeToParcel(Parcel dest, int flags) { 196732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(id); 197c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank dest.writeParcelable(uri, flags); 198732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeString(subject); 199732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dest.writeLong(dateMs); 200f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(hasAttachments ? 1 : 0); 201cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(messageListUri, 0); 2024db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(sendingState); 2034db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira dest.writeInt(priority); 204f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(read ? 1 : 0); 205d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy dest.writeInt(seen ? 1 : 0); 206f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(starred ? 1 : 0); 207b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang dest.writeParcelable(rawFolders, 0); 20822657529437c160dec072115c5982409306c1313Mindy Pereira dest.writeInt(convFlags); 20922657529437c160dec072115c5982409306c1313Mindy Pereira dest.writeInt(personalLevel); 210863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira dest.writeInt(spam ? 1 : 0); 21176b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook dest.writeInt(phishing ? 1 : 0); 212863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira dest.writeInt(muted ? 1 : 0); 21392939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank dest.writeInt(color); 214a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank dest.writeParcelable(accountUri, 0); 215351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang dest.writeParcelable(conversationInfo, 0); 21641dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook dest.writeParcelable(conversationBaseUri, 0); 217f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang dest.writeInt(isRemote ? 1 : 0); 218479505d71969e26b0785d8e0e1b81108731cf827Mark Wei dest.writeString(attachmentPreviewUri0); 219479505d71969e26b0785d8e0e1b81108731cf827Mark Wei dest.writeString(attachmentPreviewUri1); 220479505d71969e26b0785d8e0e1b81108731cf827Mark Wei dest.writeInt(attachmentPreviewStates); 221479505d71969e26b0785d8e0e1b81108731cf827Mark Wei dest.writeInt(attachmentPreviewsCount); 222732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 223732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 224351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang private Conversation(Parcel in, ClassLoader loader) { 225732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang id = in.readLong(); 226c43bc0a606e41144a780c4f873b5450e0ede0c91Marc Blank uri = in.readParcelable(null); 227732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang subject = in.readString(); 228732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang dateMs = in.readLong(); 229f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang hasAttachments = (in.readInt() != 0); 230cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira messageListUri = in.readParcelable(null); 2314db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira sendingState = in.readInt(); 2324db59c58c0af9f44d95a12dbe21322bed58cc518Mindy Pereira priority = in.readInt(); 233f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang read = (in.readInt() != 0); 234d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy seen = (in.readInt() != 0); 235f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang starred = (in.readInt() != 0); 236b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang rawFolders = in.readParcelable(loader); 23722657529437c160dec072115c5982409306c1313Mindy Pereira convFlags = in.readInt(); 23822657529437c160dec072115c5982409306c1313Mindy Pereira personalLevel = in.readInt(); 239863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira spam = in.readInt() != 0; 24076b2062b8c6d18a7b3a05292c385b47b0fcbd09fPaul Westbrook phishing = in.readInt() != 0; 241863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira muted = in.readInt() != 0; 24292939fc7b40a56e17fb0d2fde987133ca1614e29Marc Blank color = in.readInt(); 243a6b671dd9f5ba358a05888b3ab3bf1c5cb5cf493Marc Blank accountUri = in.readParcelable(null); 244f892f0a57d5c24b09fdc805f0fe2007ecd0d0e91Marc Blank position = NO_POSITION; 245ce53818e1e185a845bd2f7f601c20e7085b40725Marc Blank localDeleteOnUpdate = false; 246351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang conversationInfo = in.readParcelable(loader); 24741dca185f7683b36bdafd9520c0648c897a95834Paul Westbrook conversationBaseUri = in.readParcelable(null); 248f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang isRemote = in.readInt() != 0; 249479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviews = null; 250479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewUri0 = in.readString(); 251479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewUri1 = in.readString(); 252479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewStates = in.readInt(); 253479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewsCount = in.readInt(); 254732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 255732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 256732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 257732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public String toString() { 2589e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang // log extra info at DEBUG level or finer 2599e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang final StringBuilder sb = new StringBuilder("[conversation id="); 2609e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append(id); 2619e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) { 2629e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append(", subject="); 2639e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append(subject); 2649e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang } 2659e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append("]"); 2669e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang return sb.toString(); 267732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 268732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 269351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public static final ClassLoaderCreator<Conversation> CREATOR = 270351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang new ClassLoaderCreator<Conversation>() { 271732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 272732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 273732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation createFromParcel(Parcel source) { 274351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang return new Conversation(source, null); 275351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang } 276351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang 277351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang @Override 278351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang public Conversation createFromParcel(Parcel source, ClassLoader loader) { 279351ad4e87e0b0b98df9ca88266a8a63541dc5a81Andy Huang return new Conversation(source, loader); 280732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 281732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 282732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang @Override 283732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang public Conversation[] newArray(int size) { 284732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang return new Conversation[size]; 285732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 286732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 287732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang }; 288732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 289acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira public static final Uri MOVE_CONVERSATIONS_URI = Uri.parse("content://moveconversations"); 290acf6039a23382f18c35f6b487d90d53cb67b5858Mindy Pereira 291ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira /** 292ae7e6a0786a2d890b77c783d7ac39a90523b8154mindyp * The column that needs to be updated to change the folders for a conversation. 293ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira */ 29400ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira public static final String UPDATE_FOLDER_COLUMN = ConversationColumns.RAW_FOLDERS; 295ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira 296a831b2f1ba6d3c18d5e54563df8bae1f589c4257Mindy Pereira public Conversation(Cursor cursor) { 297edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler if (cursor == null) { 298edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler throw new IllegalArgumentException("Creating conversation from null cursor"); 299edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 300edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler id = cursor.getLong(UIProvider.CONVERSATION_ID_COLUMN); 301edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler uri = Uri.parse(cursor.getString(UIProvider.CONVERSATION_URI_COLUMN)); 302edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler dateMs = cursor.getLong(UIProvider.CONVERSATION_DATE_RECEIVED_MS_COLUMN); 303edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler final String subj = cursor.getString(UIProvider.CONVERSATION_SUBJECT_COLUMN); 304edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler // Don't allow null subject 305edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler if (subj == null) { 306edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler subject = ""; 307edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } else { 308edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler subject = subj; 309732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 310edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler hasAttachments = cursor.getInt(UIProvider.CONVERSATION_HAS_ATTACHMENTS_COLUMN) != 0; 311edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler String messageList = cursor.getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN); 312edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler messageListUri = !TextUtils.isEmpty(messageList) ? Uri.parse(messageList) : null; 313edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler sendingState = cursor.getInt(UIProvider.CONVERSATION_SENDING_STATE_COLUMN); 314edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler priority = cursor.getInt(UIProvider.CONVERSATION_PRIORITY_COLUMN); 315edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler read = cursor.getInt(UIProvider.CONVERSATION_READ_COLUMN) != 0; 316edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler seen = cursor.getInt(UIProvider.CONVERSATION_SEEN_COLUMN) != 0; 317edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler starred = cursor.getInt(UIProvider.CONVERSATION_STARRED_COLUMN) != 0; 318edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler rawFolders = readRawFolders(cursor); 319edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler convFlags = cursor.getInt(UIProvider.CONVERSATION_FLAGS_COLUMN); 320edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler personalLevel = cursor.getInt(UIProvider.CONVERSATION_PERSONAL_LEVEL_COLUMN); 321edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler spam = cursor.getInt(UIProvider.CONVERSATION_IS_SPAM_COLUMN) != 0; 322edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler phishing = cursor.getInt(UIProvider.CONVERSATION_IS_PHISHING_COLUMN) != 0; 323edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler muted = cursor.getInt(UIProvider.CONVERSATION_MUTED_COLUMN) != 0; 324edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler color = cursor.getInt(UIProvider.CONVERSATION_COLOR_COLUMN); 325edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler String account = cursor.getString(UIProvider.CONVERSATION_ACCOUNT_URI_COLUMN); 326edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler accountUri = !TextUtils.isEmpty(account) ? Uri.parse(account) : null; 327edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler position = NO_POSITION; 328edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler localDeleteOnUpdate = false; 329edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler conversationInfo = readConversationInfo(cursor); 330edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler if (conversationInfo == null) { 331edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler LogUtils.wtf(LOG_TAG, "Null conversation info from cursor"); 332edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 333edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler final String conversationBase = 334edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler cursor.getString(UIProvider.CONVERSATION_BASE_URI_COLUMN); 335edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler conversationBaseUri = !TextUtils.isEmpty(conversationBase) ? 336edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler Uri.parse(conversationBase) : null; 337edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler isRemote = cursor.getInt(UIProvider.CONVERSATION_REMOTE_COLUMN) != 0; 338edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler attachmentPreviews = null; 339edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler attachmentPreviewUri0 = cursor.getString( 340edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_URI0_COLUMN); 341edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler attachmentPreviewUri1 = cursor.getString( 342edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_URI1_COLUMN); 343edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler attachmentPreviewStates = cursor.getInt( 344edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler UIProvider.CONVERSATION_ATTACHMENT_PREVIEW_STATES_COLUMN); 345edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler attachmentPreviewsCount = cursor.getInt( 346edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler UIProvider.CONVERSATION_ATTACHMENT_PREVIEWS_COUNT_COLUMN); 347732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang } 348732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang 3491bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang public Conversation(Conversation other) { 3501bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang if (other == null) { 351edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler throw new IllegalArgumentException("Copying null conversation"); 3521bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } 3531bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang 3541bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang id = other.id; 3551bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang uri = other.uri; 3561bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang dateMs = other.dateMs; 3571bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang subject = other.subject; 3581bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang hasAttachments = other.hasAttachments; 3591bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang messageListUri = other.messageListUri; 3601bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang sendingState = other.sendingState; 3611bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang priority = other.priority; 3621bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang read = other.read; 3631bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang seen = other.seen; 3641bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang starred = other.starred; 3651bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang rawFolders = other.rawFolders; // FolderList is immutable, shallow copy is OK 3661bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang convFlags = other.convFlags; 3671bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang personalLevel = other.personalLevel; 3681bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang spam = other.spam; 3691bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang phishing = other.phishing; 3701bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang muted = other.muted; 3711bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang color = other.color; 3721bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang accountUri = other.accountUri; 3731bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang position = other.position; 3741bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang localDeleteOnUpdate = other.localDeleteOnUpdate; 3751bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang // although ConversationInfo is mutable (see ConversationInfo.markRead), applyCachedValues 3761bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang // will overwrite this if cached changes exist anyway, so a shallow copy is OK 3771bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang conversationInfo = other.conversationInfo; 3781bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang conversationBaseUri = other.conversationBaseUri; 3791bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang isRemote = other.isRemote; 380479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviews = null; 381479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewUri0 = other.attachmentPreviewUri0; 382479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewUri1 = other.attachmentPreviewUri1; 383479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewStates = other.attachmentPreviewStates; 384479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviewsCount = other.attachmentPreviewsCount; 3851bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } 3861bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang 387edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Conversation(long id, Uri uri, String subject, long dateMs, 388edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler boolean hasAttachment, Uri messageListUri, 389edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler int sendingState, int priority, boolean read, 390d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy boolean seen, boolean starred, FolderList rawFolders, int convFlags, int personalLevel, 391d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy boolean spam, boolean phishing, boolean muted, Uri accountUri, 392479505d71969e26b0785d8e0e1b81108731cf827Mark Wei ConversationInfo conversationInfo, Uri conversationBase, boolean isRemote, 393479505d71969e26b0785d8e0e1b81108731cf827Mark Wei String attachmentPreviewUri0, String attachmentPreviewUri1, int attachmentPreviewStates, 394b6f1998c9151ad236dd3c6c5d0be3280df3ae895Mark Wei int attachmentPreviewsCount) { 395edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler if (conversationInfo == null) { 396edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler throw new IllegalArgumentException("Null conversationInfo"); 397edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 398edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.id = id; 399edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.uri = uri; 400edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.subject = subject; 401edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.dateMs = dateMs; 402edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.hasAttachments = hasAttachment; 403edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.messageListUri = messageListUri; 404edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.sendingState = sendingState; 405edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.priority = priority; 406edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.read = read; 407edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.seen = seen; 408edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.starred = starred; 409edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.rawFolders = rawFolders; 410edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.convFlags = convFlags; 411edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.personalLevel = personalLevel; 412edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.spam = spam; 413edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.phishing = phishing; 414edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.muted = muted; 415edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.color = 0; 416edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.accountUri = accountUri; 417edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.conversationInfo = conversationInfo; 418edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.conversationBaseUri = conversationBase; 419edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.isRemote = isRemote; 420edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.attachmentPreviews = null; 421edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.attachmentPreviewUri0 = attachmentPreviewUri0; 422edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.attachmentPreviewUri1 = attachmentPreviewUri1; 423edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.attachmentPreviewStates = attachmentPreviewStates; 424edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler this.attachmentPreviewsCount = attachmentPreviewsCount; 425edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 426edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 427edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public static class Builder { 428edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private long mId; 429edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private Uri mUri; 430edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private String mSubject; 431edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private long mDateMs; 432edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mHasAttachments; 433edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private Uri mMessageListUri; 434edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private int mSendingState; 435edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private int mPriority; 436edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mRead; 437edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mSeen; 438edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mStarred; 439edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private FolderList mRawFolders; 440edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private int mConvFlags; 441edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private int mPersonalLevel; 442edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mSpam; 443edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mPhishing; 444edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mMuted; 445edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private Uri mAccountUri; 446edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private ConversationInfo mConversationInfo; 447edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private Uri mConversationBaseUri; 448edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private boolean mIsRemote; 449edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private String mAttachmentPreviewUri0; 450edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private String mAttachmentPreviewUri1; 451edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private int mAttachmentPreviewStates; 452edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler private int mAttachmentPreviewsCount; 453edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 454edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setId(long id) { 455edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mId = id; 456edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 457edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 458edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 459edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setUri(Uri uri) { 460edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mUri = uri; 461edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 462edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 463edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 464edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setSubject(String subject) { 465edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mSubject = subject; 466edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 467edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 468edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 469edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setDateMs(long dateMs) { 470edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mDateMs = dateMs; 471edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 472edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 473edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 474edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setHasAttachments(boolean hasAttachments) { 475edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mHasAttachments = hasAttachments; 476edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 477edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 478edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 479edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setMessageListUri(Uri messageListUri) { 480edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mMessageListUri = messageListUri; 481edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 482edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 483edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 484edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setSendingState(int sendingState) { 485edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mSendingState = sendingState; 486edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 487edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 488edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 489edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setPriority(int priority) { 490edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mPriority = priority; 491edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 492edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 493edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 494edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setRead(boolean read) { 495edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mRead = read; 496edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 497edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 498edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 499edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setSeen(boolean seen) { 500edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mSeen = seen; 501edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 502edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 503edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 504edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setStarred(boolean starred) { 505edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mStarred = starred; 506edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 507edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 508edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 509edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setRawFolders(FolderList rawFolders) { 510edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mRawFolders = rawFolders; 511edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 512edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 513edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 514edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setConvFlags(int convFlags) { 515edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mConvFlags = convFlags; 516edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 517edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 518edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 519edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setPersonalLevel(int personalLevel) { 520edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mPersonalLevel = personalLevel; 521edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 522edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 523edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 524edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setSpam(boolean spam) { 525edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mSpam = spam; 526edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 527edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 528edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 529edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setPhishing(boolean phishing) { 530edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mPhishing = phishing; 531edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 532edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 533edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 534edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setMuted(boolean muted) { 535edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mMuted = muted; 536edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 537edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 538edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 539edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setAccountUri(Uri accountUri) { 540edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mAccountUri = accountUri; 541edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 542edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 543edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 544edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setConversationInfo(ConversationInfo conversationInfo) { 545edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler if (conversationInfo == null) { 546edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler throw new IllegalArgumentException("Can't set null ConversationInfo"); 547edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 548edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mConversationInfo = conversationInfo; 549edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 550edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 551edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 552edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setConversationBaseUri(Uri conversationBaseUri) { 553edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mConversationBaseUri = conversationBaseUri; 554edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 555edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 556edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 557edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setIsRemote(boolean isRemote) { 558edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mIsRemote = isRemote; 559edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 560edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 561edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 562edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setAttachmentPreviewUri0(String attachmentPreviewUri0) { 563edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mAttachmentPreviewUri0 = attachmentPreviewUri0; 564edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 565edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 566edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 567edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setAttachmentPreviewUri1(String attachmentPreviewUri1) { 568edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mAttachmentPreviewUri1 = attachmentPreviewUri1; 569edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 570edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 571edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 572edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setAttachmentPreviewStates(int attachmentPreviewStates) { 573edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mAttachmentPreviewStates = attachmentPreviewStates; 574edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 575edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 576edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 577edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder setAttachmentPreviewsCount(int attachmentPreviewsCount) { 578edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mAttachmentPreviewsCount = attachmentPreviewsCount; 579edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return this; 580edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 581edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 582edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Builder() {} 583edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler 584edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler public Conversation build() { 585edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler if (mConversationInfo == null) { 586edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler LogUtils.d(LOG_TAG, "Null conversationInfo in Builder"); 587edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mConversationInfo = new ConversationInfo(); 588edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 589edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return new Conversation(mId, mUri, mSubject, mDateMs, mHasAttachments, mMessageListUri, 590edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mSendingState, mPriority, mRead, mSeen, mStarred, mRawFolders, mConvFlags, 591edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mPersonalLevel, mSpam, mPhishing, mMuted, mAccountUri, mConversationInfo, 592edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mConversationBaseUri, mIsRemote, mAttachmentPreviewUri0, mAttachmentPreviewUri1, 593edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler mAttachmentPreviewStates, mAttachmentPreviewsCount); 594edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 595ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook } 596ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook 5971367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook private static final Bundle CONVERSATION_INFO_REQUEST; 5981367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook private static final Bundle RAW_FOLDERS_REQUEST; 5991367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook 6001367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook static { 6011367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook RAW_FOLDERS_REQUEST = new Bundle(2); 6021367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook RAW_FOLDERS_REQUEST.putBoolean( 6031367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS, true); 6041367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook RAW_FOLDERS_REQUEST.putInt( 6051367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook ConversationCursorCommand.COMMAND_KEY_OPTIONS, 6061367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook ConversationCursorCommand.OPTION_MOVE_POSITION); 6071367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook 6081367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook CONVERSATION_INFO_REQUEST = new Bundle(2); 6091367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook CONVERSATION_INFO_REQUEST.putBoolean( 6101367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO, true); 6111367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook CONVERSATION_INFO_REQUEST.putInt( 6121367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook ConversationCursorCommand.COMMAND_KEY_OPTIONS, 6131367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook ConversationCursorCommand.OPTION_MOVE_POSITION); 6141367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook } 6157f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang 6167f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang private static ConversationInfo readConversationInfo(Cursor cursor) { 6177f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang final ConversationInfo ci; 6187f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang 619f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang if (cursor instanceof ConversationCursor) { 620f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang final byte[] blob = ((ConversationCursor) cursor).getCachedBlob( 621f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang UIProvider.CONVERSATION_INFO_COLUMN); 622f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang if (blob != null && blob.length > 0) { 623f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang return ConversationInfo.fromBlob(blob); 624f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang } 625f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang } 626f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang 6271367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook final Bundle response = cursor.respond(CONVERSATION_INFO_REQUEST); 6281367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook if (response.containsKey(ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO)) { 6291367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook ci = response.getParcelable(ConversationCursorCommand.COMMAND_GET_CONVERSATION_INFO); 6307f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang } else { 6317f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang // legacy fallback 6327f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang ci = ConversationInfo.fromBlob(cursor.getBlob(UIProvider.CONVERSATION_INFO_COLUMN)); 6337f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang } 6347f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang return ci; 6357f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang } 6367f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang 6377f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang private static FolderList readRawFolders(Cursor cursor) { 6387f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang final FolderList fl; 6397f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang 640f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang if (cursor instanceof ConversationCursor) { 641f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang final byte[] blob = ((ConversationCursor) cursor).getCachedBlob( 642f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN); 643f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang if (blob != null && blob.length > 0) { 644f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang return FolderList.fromBlob(blob); 645f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang } 646f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang } 647f8b613c1103952ae5cc1f8a5e6ae60aa62d73decAndy Huang 6481367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook final Bundle response = cursor.respond(RAW_FOLDERS_REQUEST); 6491367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook if (response.containsKey(ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS)) { 6501367d09b1cb2ea08f2e105672262ade08e1f5895Paul Westbrook fl = response.getParcelable(ConversationCursorCommand.COMMAND_GET_RAW_FOLDERS); 6517f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang } else { 6527f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang // legacy fallback 653db5356a92ebc593e9eb564aaadad8dac8cd83554Paul Westbrook // TODO: delete this once Email supports the respond call 6547f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang fl = FolderList.fromBlob( 6557f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang cursor.getBlob(UIProvider.CONVERSATION_RAW_FOLDERS_COLUMN)); 6567f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang } 6577f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang return fl; 6587f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang } 6597f39bbd358f7003a72ae2b480dfe38a84e830e5fAndy Huang 660b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang /** 6611bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang * Apply any column values from the given {@link ContentValues} (where column names are the 6621bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang * keys) to this conversation. 6631bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang * 6641bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang */ 6651bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang public void applyCachedValues(ContentValues values) { 6661bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang if (values == null) { 6671bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang return; 6681bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } 6691bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang for (String key : values.keySet()) { 6701bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang final Object val = values.get(key); 6711bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang LogUtils.i(LOG_TAG, "Conversation: applying cached value to col=%s val=%s", key, 6721bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang val); 6731bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang if (ConversationColumns.READ.equals(key)) { 6741bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang read = (Integer) val != 0; 6751bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } else if (ConversationColumns.CONVERSATION_INFO.equals(key)) { 676edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler final ConversationInfo cachedCi = ConversationInfo.fromBlob((byte[]) val); 677edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler if (cachedCi == null) { 678edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler LogUtils.d(LOG_TAG, "Null ConversationInfo in applyCachedValues"); 679edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } else { 680edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler conversationInfo.overwriteWith(cachedCi); 681edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler } 6821bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } else if (ConversationColumns.FLAGS.equals(key)) { 6831bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang convFlags = (Integer) val; 6841bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } else if (ConversationColumns.STARRED.equals(key)) { 6851bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang starred = (Integer) val != 0; 6867f4b6140b40c1d1d2624ca1dabe229fbb5c6959aAndy Huang } else if (ConversationColumns.SEEN.equals(key)) { 6877f4b6140b40c1d1d2624ca1dabe229fbb5c6959aAndy Huang seen = (Integer) val != 0; 6888ebc2ce34ed7d979662cf88b1c9fa60d63142fe4Andy Huang } else if (ConversationColumns.RAW_FOLDERS.equals(key)) { 6898ebc2ce34ed7d979662cf88b1c9fa60d63142fe4Andy Huang rawFolders = FolderList.fromBlob((byte[]) val); 6901bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } else if (ConversationColumns.VIEWED.equals(key)) { 6911bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang // ignore. this is not read from the cursor, either. 6921bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } else { 6931bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang LogUtils.e(LOG_TAG, new UnsupportedOperationException(), 6941bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang "unsupported cached conv value in col=%s", key); 6951bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } 6961bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } 6971bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang } 6981bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang 6991bca265b7a8a3f9ea08e0ae51eeb145f0883a266Andy Huang /** 700b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * Get the <strong>immutable</strong> list of {@link Folder}s for this conversation. To modify 701b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * this list, make a new {@link FolderList} and use {@link #setRawFolders(FolderList)}. 702b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * 703b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang * @return <strong>Immutable</strong> list of {@link Folder}s. 704b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang */ 705b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang public List<Folder> getRawFolders() { 706b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang return rawFolders.folders; 70700ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira } 70800ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira 709b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang public void setRawFolders(FolderList folders) { 710b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang rawFolders = folders; 71185c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira } 71285c4a77abd849f5f3f0236d51554bb1bb99fe8f6Mindy Pereira 713e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank @Override 714e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public boolean equals(Object o) { 7153c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank if (o instanceof Conversation) { 716648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira Conversation conv = (Conversation) o; 7173c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank return conv.uri.equals(uri); 7183c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank } 7193c9bcef43b4f103697034abbf2eab99111e8d987Marc Blank return false; 720e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 721e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 722e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank @Override 723e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public int hashCode() { 724e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank return uri.hashCode(); 725e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 726e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank 7277f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira /** 7287f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira * Get if this conversation is marked as high priority. 7297f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira */ 7307f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira public boolean isImportant() { 73122657529437c160dec072115c5982409306c1313Mindy Pereira return priority == UIProvider.ConversationPriority.IMPORTANT; 7327f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira } 7337f0a962513503cb01aec093b14c1b48dfae08f12Mindy Pereira 734e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank /** 735e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank * Get if this conversation is mostly dead 736e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank */ 737e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank public boolean isMostlyDead() { 738e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank return (convFlags & FLAG_MOSTLY_DEAD) != 0; 739e1d1b07cdb0026097eb80f6c2912a16353aacec1Marc Blank } 740440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 741440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** 742648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Returns true if the URI of the conversation specified as the needle was 743648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * found in the collection of conversations specified as the haystack. False 744192fac189e6aed434556a4e37bd3c5c29ef02f29Vikram Aggarwal * otherwise. This method is safe to call with null arguments. 745f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang * 746d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @param haystack 747d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @param needle 748d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal * @return true if the needle was found in the haystack, false otherwise. 749d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal */ 750d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal public final static boolean contains(Collection<Conversation> haystack, Conversation needle) { 751d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal // If the haystack is empty, it cannot contain anything. 752d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal if (haystack == null || haystack.size() <= 0) { 753d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return false; 754d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 755d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal // The null folder exists everywhere. 756d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal if (needle == null) { 757d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return true; 758d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 7597dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final long toFind = needle.id; 760d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal for (final Conversation c : haystack) { 7617dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal if (toFind == c.id) { 762d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return true; 763d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 764d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 765d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal return false; 766d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal } 767d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal 768d503df4f0c31bbf842c6a1d3cba18df8c074bf67Vikram Aggarwal /** 769648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * Returns a collection of a single conversation. This method always returns 770648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira * a valid collection even if the input conversation is null. 771f98bc898cbc7014a203c35a13427d3f949bce705Andy Huang * 772440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal * @param in a conversation, possibly null. 773440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal * @return a collection of the conversation. 774440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal */ 775440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal public static Collection<Conversation> listOf(Conversation in) { 776440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal final Collection<Conversation> target = (in == null) ? EMPTY : ImmutableList.of(in); 777440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal return target; 778440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal } 7797dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal 7807dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal /** 781edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler * Get the snippet for this conversation. 782aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira */ 783aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira public String getSnippet() { 784edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return !TextUtils.isEmpty(conversationInfo.firstSnippet) ? 785edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler conversationInfo.firstSnippet : ""; 786aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira } 787aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira 788aa1f945612847bc4cf5c8909b8acfab4b5ecf54eMindy Pereira /** 7890972e0793cc321670391d063348aecb5031b2677Mindy Pereira * Get the number of messages for this conversation. 7900972e0793cc321670391d063348aecb5031b2677Mindy Pereira */ 7910972e0793cc321670391d063348aecb5031b2677Mindy Pereira public int getNumMessages() { 792edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return conversationInfo.messageCount; 7930972e0793cc321670391d063348aecb5031b2677Mindy Pereira } 7940972e0793cc321670391d063348aecb5031b2677Mindy Pereira 7950972e0793cc321670391d063348aecb5031b2677Mindy Pereira /** 7960972e0793cc321670391d063348aecb5031b2677Mindy Pereira * Get the number of drafts for this conversation. 7970972e0793cc321670391d063348aecb5031b2677Mindy Pereira */ 7980972e0793cc321670391d063348aecb5031b2677Mindy Pereira public int numDrafts() { 799edd6c1a2807d2ade930dfd4622707298dc470d64Tony Mantler return conversationInfo.draftCount; 8000972e0793cc321670391d063348aecb5031b2677Mindy Pereira } 8010972e0793cc321670391d063348aecb5031b2677Mindy Pereira 802cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang public boolean isViewed() { 803cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang return viewed; 804cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang } 805cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang 806cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang public void markViewed() { 807cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang viewed = true; 808cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang } 809cd5c5eeae167885ffa2959c200233fea2f39c5f7Andy Huang 810c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public String getBaseUri(String defaultValue) { 811c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return conversationBaseUri != null ? conversationBaseUri.toString() : defaultValue; 812c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 813c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 814479505d71969e26b0785d8e0e1b81108731cf827Mark Wei public ArrayList<String> getAttachmentPreviewUris() { 815479505d71969e26b0785d8e0e1b81108731cf827Mark Wei if (attachmentPreviews == null) { 816479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviews = Lists.newArrayListWithCapacity(2); 817479505d71969e26b0785d8e0e1b81108731cf827Mark Wei if (!TextUtils.isEmpty(attachmentPreviewUri0)) { 818479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviews.add(attachmentPreviewUri0); 819479505d71969e26b0785d8e0e1b81108731cf827Mark Wei } 820479505d71969e26b0785d8e0e1b81108731cf827Mark Wei if (!TextUtils.isEmpty(attachmentPreviewUri1)) { 821479505d71969e26b0785d8e0e1b81108731cf827Mark Wei attachmentPreviews.add(attachmentPreviewUri1); 822479505d71969e26b0785d8e0e1b81108731cf827Mark Wei } 823479505d71969e26b0785d8e0e1b81108731cf827Mark Wei } 824479505d71969e26b0785d8e0e1b81108731cf827Mark Wei return attachmentPreviews; 825d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Wei } 826d198fa7ddb2d0c730847af34f06aa2e940b2537dMark Wei 8270972e0793cc321670391d063348aecb5031b2677Mindy Pereira /** 8287dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * Create a human-readable string of all the conversations 8297dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @param collection Any collection of conversations 8307dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @return string with a human readable representation of the conversations. 8317dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal */ 8327dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal public static String toString(Collection<Conversation> collection) { 8337dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final StringBuilder out = new StringBuilder(collection.size() + " conversations:"); 8347dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal int count = 0; 8357dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal for (final Conversation c : collection) { 8367dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal count++; 837648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // Indent the conversations to make them easy to read in debug 838648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira // output. 8397dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal out.append(" " + count + ": " + c.toString() + "\n"); 8407dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal } 8417dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal return out.toString(); 8427dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal } 843820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook 844820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook /** 845820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook * Returns an empty string if the specified string is null 846820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook */ 847820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook private static String emptyIfNull(String in) { 848820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook return in != null ? in : EMPTY_STRING; 849820f051b37b45b3e3729bda5c4302a879ee6aa4dPaul Westbrook } 850bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira 851bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira /** 852f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * Get the properly formatted subject and snippet string for display a 853f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * conversation. 854f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * 855f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * @param context 856f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * @param filteredSubject 857f2caf91209e4e2d4182d6b379a3cd79eed81af71mindyp * @param snippet 858bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira */ 859c046e4a310462aa6998a34ff50439eb5e2508d85mindyp public static String getSubjectAndSnippetForDisplay(Context context, 860c046e4a310462aa6998a34ff50439eb5e2508d85mindyp String filteredSubject, String snippet) { 8612909b7442130800d6c6c20c1227d65295262f03emindyp if (sSubjectAndSnippet == null) { 8622909b7442130800d6c6c20c1227d65295262f03emindyp sSubjectAndSnippet = context.getString(R.string.subject_and_snippet); 8632909b7442130800d6c6c20c1227d65295262f03emindyp } 86461bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy if (TextUtils.isEmpty(filteredSubject) && TextUtils.isEmpty(snippet)) { 86561bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy return ""; 86661bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy } else if (TextUtils.isEmpty(filteredSubject)) { 86761bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy return snippet; 86861bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy } else if (TextUtils.isEmpty(snippet)) { 86961bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy return filteredSubject; 87061bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy } 87161bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy 87261bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy return String.format(sSubjectAndSnippet, filteredSubject, snippet); 873bf9508d3877d05742b2f5d23e1780366d3e1aa2eMindy Pereira } 8745f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy 8755f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy /** 8765f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy * Public object that knows how to construct Conversation given Cursors. This is not used by 8775f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy * {@link ConversationCursor} or {@link ConversationCursorLoader}. 8785f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy */ 8795f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy public static final CursorCreator<Conversation> FACTORY = new CursorCreator<Conversation>() { 8805f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy @Override 8815f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy public Conversation createFromCursor(final Cursor c) { 8825f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy return new Conversation(c); 8835f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy } 8845f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy 8855f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy @Override 8865f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy public String toString() { 8875f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy return "Conversation CursorCreator"; 8885f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy } 8895f578144cc01738d5f9988d61674a643df19fdaeScott Kennedy }; 890648df3f0b0ebcd3c4adf907d70ff0938e5dfc78fMindy Pereira} 891