1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/*
2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project
3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License.
6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at
7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software
11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and
14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License.
15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.datamodel.data;
18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.database.Cursor;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.net.Uri;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.BaseColumns;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.text.TextUtils;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper.ConversationColumns;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper.MessageColumns;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper.ParticipantColumns;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseWrapper;
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.action.DeleteConversationAction;
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert;
312a50ffe57c45c99bbc8ab92fd07383582be9f836Tony Makimport com.android.messaging.util.ContactUtil;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Dates;
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.google.common.base.Joiner;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.ArrayList;
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.List;
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/**
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Class wrapping the conversation list view used to display each item in conversation list
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class ConversationListItemData {
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mConversationId;
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mName;
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mIcon;
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private boolean mIsRead;
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private long mTimestamp;
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mSnippetText;
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private Uri mPreviewUri;
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mPreviewContentType;
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private long mParticipantContactId;
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mParticipantLookupKey;
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mOtherParticipantNormalizedDestination;
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mSelfId;
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private int mParticipantCount;
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private boolean mNotificationEnabled;
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mNotificationSoundUri;
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private boolean mNotificationVibrate;
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private boolean mIncludeEmailAddress;
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private int mMessageStatus;
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private int mMessageRawTelephonyStatus;
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private boolean mShowDraft;
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private Uri mDraftPreviewUri;
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mDraftPreviewContentType;
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mDraftSnippetText;
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private boolean mIsArchived;
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mSubject;
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mDraftSubject;
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mSnippetSenderFirstName;
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mSnippetSenderDisplayDestination;
707ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak    private boolean mIsEnterprise;
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public ConversationListItemData() {
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void bind(final Cursor cursor) {
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        bind(cursor, false);
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void bind(final Cursor cursor, final boolean ignoreDraft) {
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mConversationId = cursor.getString(INDEX_ID);
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mName = cursor.getString(INDEX_CONVERSATION_NAME);
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mIcon = cursor.getString(INDEX_CONVERSATION_ICON);
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSnippetText = cursor.getString(INDEX_SNIPPET_TEXT);
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mTimestamp = cursor.getLong(INDEX_SORT_TIMESTAMP);
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mIsRead = cursor.getInt(INDEX_READ) == 1;
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final String previewUriString = cursor.getString(INDEX_PREVIEW_URI);
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreviewUri = TextUtils.isEmpty(previewUriString) ? null : Uri.parse(previewUriString);
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreviewContentType = cursor.getString(INDEX_PREVIEW_CONTENT_TYPE);
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mParticipantContactId = cursor.getLong(INDEX_PARTICIPANT_CONTACT_ID);
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mParticipantLookupKey = cursor.getString(INDEX_PARTICIPANT_LOOKUP_KEY);
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mOtherParticipantNormalizedDestination = cursor.getString(
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                INDEX_OTHER_PARTICIPANT_NORMALIZED_DESTINATION);
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSelfId = cursor.getString(INDEX_SELF_ID);
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mParticipantCount = cursor.getInt(INDEX_PARTICIPANT_COUNT);
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mNotificationEnabled = cursor.getInt(INDEX_NOTIFICATION_ENABLED) == 1;
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mNotificationSoundUri = cursor.getString(INDEX_NOTIFICATION_SOUND_URI);
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mNotificationVibrate = cursor.getInt(INDEX_NOTIFICATION_VIBRATION) == 1;
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mIncludeEmailAddress = cursor.getInt(INDEX_INCLUDE_EMAIL_ADDRESS) == 1;
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mMessageStatus = cursor.getInt(INDEX_MESSAGE_STATUS);
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mMessageRawTelephonyStatus = cursor.getInt(INDEX_MESSAGE_RAW_TELEPHONY_STATUS);
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (!ignoreDraft) {
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mShowDraft = cursor.getInt(INDEX_SHOW_DRAFT) == 1;
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final String draftPreviewUriString = cursor.getString(INDEX_DRAFT_PREVIEW_URI);
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftPreviewUri = TextUtils.isEmpty(draftPreviewUriString) ?
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    null : Uri.parse(draftPreviewUriString);
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftPreviewContentType = cursor.getString(INDEX_DRAFT_PREVIEW_CONTENT_TYPE);
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftSnippetText = cursor.getString(INDEX_DRAFT_SNIPPET_TEXT);
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftSubject = cursor.getString(INDEX_DRAFT_SUBJECT_TEXT);
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mShowDraft = false;
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftPreviewUri = null;
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftPreviewContentType = null;
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftSnippetText = null;
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDraftSubject = null;
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mIsArchived = cursor.getInt(INDEX_ARCHIVE_STATUS) == 1;
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSubject = cursor.getString(INDEX_SUBJECT_TEXT);
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSnippetSenderFirstName = cursor.getString(INDEX_SNIPPET_SENDER_FIRST_NAME);
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSnippetSenderDisplayDestination =
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                cursor.getString(INDEX_SNIPPET_SENDER_DISPLAY_DESTINATION);
1227ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak        mIsEnterprise = cursor.getInt(INDEX_IS_ENTERPRISE) == 1;
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getConversationId() {
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mConversationId;
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getName() {
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mName;
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getIcon() {
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mIcon;
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getIsRead() {
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mIsRead;
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getFormattedTimestamp() {
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return Dates.getConversationTimeString(mTimestamp).toString();
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public long getTimestamp() {
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mTimestamp;
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getSnippetText() {
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mSnippetText;
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public Uri getPreviewUri() {
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mPreviewUri;
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getPreviewContentType() {
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mPreviewContentType;
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
1612a50ffe57c45c99bbc8ab92fd07383582be9f836Tony Mak    /**
1627ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak      * @see ConversationColumns#PARTICIPANT_CONTACT_ID
1637ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak      * @return the contact id of the participant if it is a 1:1 conversation, -1 for group.
1647ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak      */
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public long getParticipantContactId() {
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mParticipantContactId;
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
1692a50ffe57c45c99bbc8ab92fd07383582be9f836Tony Mak    /**
1707ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak     * @see ConversationColumns#IS_ENTERPRISE
1717ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak     * @return whether the conversation is enterprise.
1722a50ffe57c45c99bbc8ab92fd07383582be9f836Tony Mak     */
1737ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak    public boolean isEnterprise() {
1747ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak        return mIsEnterprise;
1752a50ffe57c45c99bbc8ab92fd07383582be9f836Tony Mak    }
1762a50ffe57c45c99bbc8ab92fd07383582be9f836Tony Mak
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getParticipantLookupKey() {
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mParticipantLookupKey;
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getOtherParticipantNormalizedDestination() {
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mOtherParticipantNormalizedDestination;
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getSelfId() {
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mSelfId;
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getParticipantCount() {
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mParticipantCount;
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getIsGroup() {
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Participant count excludes self
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (mParticipantCount > 1);
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getIncludeEmailAddress() {
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mIncludeEmailAddress;
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getNotificationEnabled() {
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mNotificationEnabled;
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getNotificationSoundUri() {
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mNotificationSoundUri;
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getNotifiationVibrate() {
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mNotificationVibrate;
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public final boolean getIsFailedStatus() {
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_FAILED ||
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_FAILED_EMERGENCY_NUMBER ||
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMessageStatus == MessageData.BUGLE_STATUS_INCOMING_DOWNLOAD_FAILED ||
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMessageStatus == MessageData.BUGLE_STATUS_INCOMING_EXPIRED_OR_NOT_AVAILABLE);
219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public final boolean getIsSendRequested() {
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return (mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_YET_TO_SEND ||
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_AWAITING_RETRY ||
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_SENDING ||
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMessageStatus == MessageData.BUGLE_STATUS_OUTGOING_RESENDING);
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getIsMessageTypeOutgoing() {
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return !MessageData.getIsIncoming(mMessageStatus);
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getMessageRawTelephonyStatus() {
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mMessageRawTelephonyStatus;
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getMessageStatus() {
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mMessageStatus;
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getShowDraft() {
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mShowDraft;
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getDraftSnippetText() {
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mDraftSnippetText;
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public Uri getDraftPreviewUri() {
249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mDraftPreviewUri;
250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getDraftPreviewContentType() {
253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mDraftPreviewContentType;
254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getIsArchived() {
257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mIsArchived;
258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getSubject() {
261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mSubject;
262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getDraftSubject() {
265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mDraftSubject;
266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getSnippetSenderName() {
269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (!TextUtils.isEmpty(mSnippetSenderFirstName)) {
270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return mSnippetSenderFirstName;
271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mSnippetSenderDisplayDestination;
273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void deleteConversation() {
276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        DeleteConversationAction.deleteConversation(mConversationId, mTimestamp);
277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get the name of the view for this data item
281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String getConversationListView() {
283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return CONVERSATION_LIST_VIEW;
284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String getConversationListViewSql() {
287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return CONVERSATION_LIST_VIEW_SQL;
288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String CONVERSATION_LIST_VIEW = "conversation_list_view";
291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String CONVERSATION_LIST_VIEW_PROJECTION =
293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns._ID
294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns._ID + ", "
295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.NAME
296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.NAME + ", "
297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.CURRENT_SELF_ID
298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.CURRENT_SELF_ID + ", "
299d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.ARCHIVE_STATUS
300d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.ARCHIVE_STATUS + ", "
301d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.MESSAGES_TABLE + '.' + MessageColumns.READ
302d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.READ + ", "
303d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.ICON
304d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.ICON + ", "
305d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.PARTICIPANT_CONTACT_ID
306d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.PARTICIPANT_CONTACT_ID + ", "
307d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.PARTICIPANT_LOOKUP_KEY
308d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.PARTICIPANT_LOOKUP_KEY + ", "
309d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.'
310d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    + ConversationColumns.OTHER_PARTICIPANT_NORMALIZED_DESTINATION
311d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.OTHER_PARTICIPANT_NORMALIZED_DESTINATION + ", "
312d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.SORT_TIMESTAMP
313d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.SORT_TIMESTAMP + ", "
314d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.SHOW_DRAFT
315d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.SHOW_DRAFT + ", "
316d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.DRAFT_SNIPPET_TEXT
317d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.DRAFT_SNIPPET_TEXT + ", "
318d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.DRAFT_PREVIEW_URI
319d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.DRAFT_PREVIEW_URI + ", "
320d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.DRAFT_SUBJECT_TEXT
321d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.DRAFT_SUBJECT_TEXT + ", "
322d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.'
323d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    + ConversationColumns.DRAFT_PREVIEW_CONTENT_TYPE
324d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.DRAFT_PREVIEW_CONTENT_TYPE + ", "
325d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.PREVIEW_URI
326d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.PREVIEW_URI + ", "
327d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.PREVIEW_CONTENT_TYPE
328d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.PREVIEW_CONTENT_TYPE + ", "
329d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.PARTICIPANT_COUNT
330d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.PARTICIPANT_COUNT + ", "
331d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.NOTIFICATION_ENABLED
332d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.NOTIFICATION_ENABLED + ", "
333d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.NOTIFICATION_SOUND_URI
334d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.NOTIFICATION_SOUND_URI + ", "
335d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.NOTIFICATION_VIBRATION
336d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.NOTIFICATION_VIBRATION + ", "
337d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' +
338d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    ConversationColumns.INCLUDE_EMAIL_ADDRESS
339d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.INCLUDE_EMAIL_ADDRESS + ", "
340d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.MESSAGES_TABLE + '.' + MessageColumns.STATUS
341d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.MESSAGE_STATUS + ", "
342d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.MESSAGES_TABLE + '.' + MessageColumns.RAW_TELEPHONY_STATUS
343d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.MESSAGE_RAW_TELEPHONY_STATUS + ", "
344d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.MESSAGES_TABLE + '.' + MessageColumns._ID
345d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.MESSAGE_ID + ", "
346d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.PARTICIPANTS_TABLE + '.' + ParticipantColumns.FIRST_NAME
347d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.SNIPPET_SENDER_FIRST_NAME + ", "
348d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.PARTICIPANTS_TABLE + '.' + ParticipantColumns.DISPLAY_DESTINATION
3497ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak            + " as " + ConversationListViewColumns.SNIPPET_SENDER_DISPLAY_DESTINATION + ", "
3507ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.IS_ENTERPRISE
3517ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak            + " as " + ConversationListViewColumns.IS_ENTERPRISE;
352d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
353d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String JOIN_PARTICIPANTS =
354d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            " LEFT JOIN " + DatabaseHelper.PARTICIPANTS_TABLE + " ON ("
355d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.MESSAGES_TABLE + '.' + MessageColumns.SENDER_PARTICIPANT_ID
356d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + '=' + DatabaseHelper.PARTICIPANTS_TABLE + '.' + DatabaseHelper.ParticipantColumns._ID
357d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + ") ";
358d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
359d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // View that makes latest message read flag available with rest of conversation data.
360d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String CONVERSATION_LIST_VIEW_SQL = "CREATE VIEW " +
361d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            CONVERSATION_LIST_VIEW + " AS SELECT "
362d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + CONVERSATION_LIST_VIEW_PROJECTION + ", "
363d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // Snippet not part of the base projection shared with search view
364d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.SNIPPET_TEXT
365d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.SNIPPET_TEXT + ", "
366d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.SUBJECT_TEXT
367d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " as " + ConversationListViewColumns.SUBJECT_TEXT + " "
368d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " FROM " + DatabaseHelper.CONVERSATIONS_TABLE
369d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + " LEFT JOIN " + DatabaseHelper.MESSAGES_TABLE + " ON ("
370d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + DatabaseHelper.CONVERSATIONS_TABLE + '.' +  ConversationColumns.LATEST_MESSAGE_ID
371d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + '=' + DatabaseHelper.MESSAGES_TABLE + '.' + MessageColumns._ID + ") "
372d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + JOIN_PARTICIPANTS
373d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + "ORDER BY " + DatabaseHelper.CONVERSATIONS_TABLE + '.'
374d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            + ConversationColumns.SORT_TIMESTAMP + " DESC";
375d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
376d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static class ConversationListViewColumns implements BaseColumns {
377d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public static final String _ID = ConversationColumns._ID;
378d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String NAME = ConversationColumns.NAME;
379d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String ARCHIVE_STATUS = ConversationColumns.ARCHIVE_STATUS;
380d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String READ = MessageColumns.READ;
381d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String SORT_TIMESTAMP = ConversationColumns.SORT_TIMESTAMP;
382d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String PREVIEW_URI = ConversationColumns.PREVIEW_URI;
383d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String PREVIEW_CONTENT_TYPE = ConversationColumns.PREVIEW_CONTENT_TYPE;
384d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String SNIPPET_TEXT = ConversationColumns.SNIPPET_TEXT;
385d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String SUBJECT_TEXT = ConversationColumns.SUBJECT_TEXT;
386d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String ICON = ConversationColumns.ICON;
387d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String SHOW_DRAFT = ConversationColumns.SHOW_DRAFT;
388d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String DRAFT_SUBJECT_TEXT = ConversationColumns.DRAFT_SUBJECT_TEXT;
389d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String DRAFT_PREVIEW_URI = ConversationColumns.DRAFT_PREVIEW_URI;
390d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String DRAFT_PREVIEW_CONTENT_TYPE =
391d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ConversationColumns.DRAFT_PREVIEW_CONTENT_TYPE;
392d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String DRAFT_SNIPPET_TEXT = ConversationColumns.DRAFT_SNIPPET_TEXT;
393d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String PARTICIPANT_CONTACT_ID = ConversationColumns.PARTICIPANT_CONTACT_ID;
394d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String PARTICIPANT_LOOKUP_KEY = ConversationColumns.PARTICIPANT_LOOKUP_KEY;
395d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String OTHER_PARTICIPANT_NORMALIZED_DESTINATION =
396d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ConversationColumns.OTHER_PARTICIPANT_NORMALIZED_DESTINATION;
397d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String CURRENT_SELF_ID = ConversationColumns.CURRENT_SELF_ID;
398d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String PARTICIPANT_COUNT = ConversationColumns.PARTICIPANT_COUNT;
399d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String NOTIFICATION_ENABLED = ConversationColumns.NOTIFICATION_ENABLED;
400d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String NOTIFICATION_SOUND_URI = ConversationColumns.NOTIFICATION_SOUND_URI;
401d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String NOTIFICATION_VIBRATION = ConversationColumns.NOTIFICATION_VIBRATION;
402d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String INCLUDE_EMAIL_ADDRESS =
403d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ConversationColumns.INCLUDE_EMAIL_ADDRESS;
404d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String MESSAGE_STATUS = MessageColumns.STATUS;
405d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String MESSAGE_RAW_TELEPHONY_STATUS = MessageColumns.RAW_TELEPHONY_STATUS;
406d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String MESSAGE_ID = "message_id";
407d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String SNIPPET_SENDER_FIRST_NAME = "snippet_sender_first_name";
408d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static final String SNIPPET_SENDER_DISPLAY_DESTINATION =
409d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                "snippet_sender_display_destination";
4107ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak        static final String IS_ENTERPRISE = ConversationColumns.IS_ENTERPRISE;
411d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
412d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
413d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String[] PROJECTION = {
414d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns._ID,
415d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.NAME,
416d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.ICON,
417d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SNIPPET_TEXT,
418d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SORT_TIMESTAMP,
419d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.READ,
420d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.PREVIEW_URI,
421d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.PREVIEW_CONTENT_TYPE,
422d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.PARTICIPANT_CONTACT_ID,
423d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.PARTICIPANT_LOOKUP_KEY,
424d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.OTHER_PARTICIPANT_NORMALIZED_DESTINATION,
425d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.PARTICIPANT_COUNT,
426d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.CURRENT_SELF_ID,
427d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.NOTIFICATION_ENABLED,
428d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.NOTIFICATION_SOUND_URI,
429d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.NOTIFICATION_VIBRATION,
430d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.INCLUDE_EMAIL_ADDRESS,
431d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.MESSAGE_STATUS,
432d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SHOW_DRAFT,
433d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.DRAFT_PREVIEW_URI,
434d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.DRAFT_PREVIEW_CONTENT_TYPE,
435d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.DRAFT_SNIPPET_TEXT,
436d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.ARCHIVE_STATUS,
437d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.MESSAGE_ID,
438d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SUBJECT_TEXT,
439d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.DRAFT_SUBJECT_TEXT,
440d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.MESSAGE_RAW_TELEPHONY_STATUS,
441d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SNIPPET_SENDER_FIRST_NAME,
442d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SNIPPET_SENDER_DISPLAY_DESTINATION,
4437ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak        ConversationListViewColumns.IS_ENTERPRISE,
444d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
445d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
446d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_ID = 0;
447d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_CONVERSATION_NAME = 1;
448d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_CONVERSATION_ICON = 2;
449d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_SNIPPET_TEXT = 3;
450d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_SORT_TIMESTAMP = 4;
451d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_READ = 5;
452d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_PREVIEW_URI = 6;
453d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_PREVIEW_CONTENT_TYPE = 7;
454d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_PARTICIPANT_CONTACT_ID = 8;
455d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_PARTICIPANT_LOOKUP_KEY = 9;
456d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_OTHER_PARTICIPANT_NORMALIZED_DESTINATION = 10;
457d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_PARTICIPANT_COUNT = 11;
458d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_SELF_ID = 12;
459d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_NOTIFICATION_ENABLED = 13;
460d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_NOTIFICATION_SOUND_URI = 14;
461d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_NOTIFICATION_VIBRATION = 15;
462d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_INCLUDE_EMAIL_ADDRESS = 16;
463d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_MESSAGE_STATUS = 17;
464d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_SHOW_DRAFT = 18;
465d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_DRAFT_PREVIEW_URI = 19;
466d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_DRAFT_PREVIEW_CONTENT_TYPE = 20;
467d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_DRAFT_SNIPPET_TEXT = 21;
468d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_ARCHIVE_STATUS = 22;
469d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_MESSAGE_ID = 23;
470d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_SUBJECT_TEXT = 24;
471d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_DRAFT_SUBJECT_TEXT = 25;
472d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_MESSAGE_RAW_TELEPHONY_STATUS = 26;
473d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_SNIPPET_SENDER_FIRST_NAME = 27;
474d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int INDEX_SNIPPET_SENDER_DISPLAY_DESTINATION = 28;
4757ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak    private static final int INDEX_IS_ENTERPRISE = 29;
476d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
477d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String DIVIDER_TEXT = ", ";
478d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
4797ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak    public static boolean hasAnyEnterpriseContact(
4807ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak             final List<ParticipantData> participants) {
4817ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak         for (final ParticipantData participant : participants) {
4827ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak             if (ContactUtil.isEnterpriseContactId(participant.getContactId())) {
4837ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak                 return true;
4847ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak             }
4857ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak         }
4867ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak         return false;
4877ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak     }
4887ad7ac27f12be44659f2f0ff112a7f8433ebb1b5Tony Mak
489d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
490d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get a conversation from the local DB based on the conversation id.
491d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
492d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param dbWrapper       The database
493d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param conversationId  The conversation Id to read
494d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return The existing conversation or null
495d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
496d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static ConversationListItemData getExistingConversation(final DatabaseWrapper dbWrapper,
497d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final String conversationId) {
498d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListItemData conversation = null;
499d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
500d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Look for an existing conversation in the db with this conversation id
501d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Cursor cursor = null;
502d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        try {
503d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // TODO: Should we be able to read a row from just the conversation table?
504d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            cursor = dbWrapper.query(getConversationListView(),
505d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    PROJECTION,
506d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    ConversationColumns._ID + "=?",
507d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    new String[] { conversationId },
508d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    null, null, null);
509d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Assert.inRange(cursor.getCount(), 0, 1);
510d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (cursor.moveToFirst()) {
511d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                conversation = new ConversationListItemData();
512d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                conversation.bind(cursor);
513d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
514d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } finally {
515d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (cursor != null) {
516d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                cursor.close();
517d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
518d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
519d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
520d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return conversation;
521d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
522d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
523d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static String generateConversationName(final List<ParticipantData>
524d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            participants) {
525d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (participants.size() == 1) {
526d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // Prefer full name over first name for 1:1 conversation
527d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return participants.get(0).getDisplayName(true);
528d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
529d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
530d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final ArrayList<String> participantNames = new ArrayList<String>();
531d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (final ParticipantData participant : participants) {
532d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // Prefer first name over full name for group conversation
533d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            participantNames.add(participant.getDisplayName(false));
534d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
535d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
536d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Joiner joiner = Joiner.on(DIVIDER_TEXT).skipNulls();
537d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return joiner.join(participantNames);
538d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
539d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
540d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
541