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.content.ContentValues;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.database.sqlite.SQLiteDatabase;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.net.Uri;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.BaseColumns;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.ContactsContract.CommonDataKinds.Phone;
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.ContactsContract.Contacts;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.MediaStore.Images.Media;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.BugleDatabaseOperations;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper;
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper.ConversationColumns;
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper.MessageColumns;
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper.PartColumns;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseHelper.ParticipantColumns;
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.FakeCursor;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationListItemData.ConversationListViewColumns;
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationMessageData.ConversationMessageViewColumns;
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert;
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ContactUtil;
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ContentType;
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.Arrays;
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.List;
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/**
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * A factory for fake objects that can be useful for multiple tests.
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class TestDataFactory {
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final static String[] sConversationListCursorColumns = new String[] {
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns._ID,
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.NAME,
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.ICON,
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SNIPPET_TEXT,
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.PREVIEW_URI,
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.SORT_TIMESTAMP,
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.READ,
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.PREVIEW_CONTENT_TYPE,
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationListViewColumns.MESSAGE_STATUS,
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final static String[] sContactCursorColumns = new String[] {
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.CONTACT_ID,
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.DISPLAY_NAME_PRIMARY,
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.PHOTO_THUMBNAIL_URI,
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.NUMBER,
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.TYPE,
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.LABEL,
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.LOOKUP_KEY,
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone._ID,
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.SORT_KEY_PRIMARY,
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final static String[] sFrequentContactCursorColumns = new String[] {
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Contacts._ID,
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Contacts.DISPLAY_NAME,
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Contacts.PHOTO_URI,
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Phone.LOOKUP_KEY,
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final static String[] sConversationMessageCursorColumns = new String[] {
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns._ID,
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.CONVERSATION_ID,
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTICIPANT_ID,
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.SENT_TIMESTAMP,
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.RECEIVED_TIMESTAMP,
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.STATUS,
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.SENDER_FULL_NAME,
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.SENDER_PROFILE_PHOTO_URI,
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTS_IDS,
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTS_CONTENT_TYPES,
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTS_CONTENT_URIS,
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTS_WIDTHS,
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTS_HEIGHTS,
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTS_TEXTS,
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ConversationMessageViewColumns.PARTS_COUNT
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final static String[] sGalleryCursorColumns = new String[] {
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Media._ID,
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Media.DATA,
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Media.WIDTH,
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Media.HEIGHT,
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Media.MIME_TYPE
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getConversationListCursor() {
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), "name1", "content://icon1",
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "snippetText1", "content://snippetUri1", Long.valueOf(10), 1,
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        ContentType.IMAGE_JPEG, MessageData.BUGLE_STATUS_INCOMING_COMPLETE},
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(2), "name2", "content://icon2",
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "snippetText2", "content://snippetUri2", Long.valueOf(20) + 24*60*60*1000,
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        0, ContentType.IMAGE_JPEG, MessageData.BUGLE_STATUS_INCOMING_COMPLETE},
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(3), "name3", "content://icon3",
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "snippetText3", "content://snippetUri3", Long.valueOf(30) + 2*24*60*60*1000,
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        0, ContentType.IMAGE_JPEG, MessageData.BUGLE_STATUS_OUTGOING_COMPLETE}
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(ConversationListItemData.PROJECTION, sConversationListCursorColumns,
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                cursorData);
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int CONVERSATION_LIST_CURSOR_READ_MESSAGE_INDEX = 0;
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int CONVERSATION_LIST_CURSOR_UNREAD_MESSAGE_INDEX = 1;
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getEmptyConversationListCursor() {
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(ConversationListItemData.PROJECTION, sConversationListCursorColumns,
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[][] {});
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getConversationMessageCursor() {
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(0), Long.valueOf(1), Long.valueOf(1),
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        Long.valueOf(10), Long.valueOf(10),
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        MessageData.BUGLE_STATUS_INCOMING_COMPLETE, "Alice", null,
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "0", "text/plain", "''", -1, -1, "msg0", 1},
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), Long.valueOf(1), Long.valueOf(2),
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        Long.valueOf(20), Long.valueOf(20),
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        MessageData.BUGLE_STATUS_OUTGOING_COMPLETE, "Bob", null,
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "1", "text/plain", "''", -1, -1, "msg1", 1},
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(2), Long.valueOf(1), Long.valueOf(1),
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        Long.valueOf(30), Long.valueOf(30),
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        MessageData.BUGLE_STATUS_OUTGOING_COMPLETE, "Alice", null,
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "2", "contentType3", "'content://fakeUri3'", "0", "0", "msg1", 1},
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(3), Long.valueOf(1), Long.valueOf(1),
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        Long.valueOf(40), Long.valueOf(40),
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        MessageData.BUGLE_STATUS_OUTGOING_COMPLETE, "Alice", null,
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "3|4", "'contentType4'|'text/plain'", "'content://fakeUri4'|''", "0|-1", "0|-1", "''|'msg3'", 2},
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ConversationMessageData.getProjection(),
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                sConversationMessageCursorColumns,
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                cursorData);
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static String getMessageText(final FakeCursor messageCursor, final int row) {
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final String allPartsText = messageCursor.getAt(ConversationMessageViewColumns.PARTS_TEXTS, row)
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                .toString();
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int partsCount = (Integer) messageCursor.getAt(
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ConversationMessageViewColumns.PARTS_COUNT, row);
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final String messageId = messageCursor.getAt(
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ConversationMessageViewColumns._ID, row).toString();
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final List<MessagePartData> parts = ConversationMessageData.makeParts(
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageCursor.getAt(ConversationMessageViewColumns.PARTS_IDS, row).toString(),
161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageCursor.getAt(ConversationMessageViewColumns.PARTS_CONTENT_TYPES, row).toString(),
162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageCursor.getAt(ConversationMessageViewColumns.PARTS_CONTENT_URIS, row).toString(),
163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageCursor.getAt(ConversationMessageViewColumns.PARTS_WIDTHS, row).toString(),
164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageCursor.getAt(ConversationMessageViewColumns.PARTS_HEIGHTS, row).toString(),
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageCursor.getAt(ConversationMessageViewColumns.PARTS_TEXTS, row).toString(),
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                partsCount,
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageId);
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (final MessagePartData part : parts) {
170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (part.isText()) {
171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return part.getText();
172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return null;
175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // Indexes where to find consecutive and non consecutive messages from same participant
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // (respect to index - 1).
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int MESSAGE_WITH_SAME_PARTICIPANT_AS_PREVIOUS = 3;
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int MESSAGE_WITH_DIFFERENT_PARTICIPANT_AS_PREVIOUS = 2;
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getConversationParticipantsCursor() {
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final String[] sConversationParticipantsCursorColumns = new String[] {
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantColumns._ID,
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantColumns.SUB_ID,
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantColumns.NORMALIZED_DESTINATION,
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantColumns.SEND_DESTINATION,
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantColumns.FULL_NAME,
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantColumns.FIRST_NAME,
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantColumns.PROFILE_PHOTO_URI,
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { 1, ParticipantData.OTHER_THAN_SELF_SUB_ID, "+15554567890",
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "(555)456-7890", "alice in wonderland", "alice", "alice.png" },
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { 2, ParticipantData.OTHER_THAN_SELF_SUB_ID, "+15551011121",
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "(555)101-1121", "bob the baker", "bob", "bob.png"},
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { 3, ParticipantData.OTHER_THAN_SELF_SUB_ID, "+15551314152",
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "(555)131-4152", "charles in charge", "charles", "charles.png" },
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(ParticipantData.ParticipantsQuery.PROJECTION,
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                sConversationParticipantsCursorColumns, cursorData);
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int CONTACT_LIST_CURSOR_FIRST_LEVEL_CONTACT_INDEX = 0;
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int CONTACT_LIST_CURSOR_SECOND_LEVEL_CONTACT_INDEX = 2;
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Returns a cursor for the all contacts list consumable by ContactPickerFragment.
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getAllContactListCursor() {
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(0), "John Smith", "content://uri1",
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1234", Phone.TYPE_HOME, "", "0", Long.valueOf(0), 0 },
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), "Sun Woo Kong", "content://uri2",
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1235", Phone.TYPE_MOBILE, "", "1", Long.valueOf(1), 1 },
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), "Sun Woo Kong", "content://uri2",
219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1238", Phone.TYPE_HOME, "", "1", Long.valueOf(2), 2 },
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(2), "Anna Kinney", "content://uri3",
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1236", Phone.TYPE_MAIN, "", "3", Long.valueOf(3), 3 },
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(3), "Mike Jones", "content://uri3",
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1236", Phone.TYPE_MAIN, "", "5", Long.valueOf(4), 4 },
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(ContactUtil.PhoneQuery.PROJECTION, sContactCursorColumns,
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                cursorData);
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Returns a cursor for the frequent contacts list consumable by ContactPickerFragment.
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Note: make it so that this cursor is the generated result of getStrequentContactsCursor()
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * and getAllContactListCursor(), i.e., expand the entries in getStrequentContactsCursor()
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * with the details from getAllContactListCursor()
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getFrequentContactListCursor() {
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(2), "Anna Kinney", "content://uri3",
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1236", Phone.TYPE_MAIN, "", "3", Long.valueOf(3), 0 },
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), "Sun Woo Kong", "content://uri2",
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1235", Phone.TYPE_MOBILE, "", "1", Long.valueOf(1), 1},
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), "Sun Woo Kong", "content://uri2",
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1238", Phone.TYPE_HOME, "", "1", Long.valueOf(2), 2 },
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(0), "John Smith", "content://uri1",
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "425-555-1234", Phone.TYPE_HOME, "", "0", Long.valueOf(0), 3 },
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(ContactUtil.PhoneQuery.PROJECTION, sContactCursorColumns,
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                cursorData);
248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Returns a strequent (starred + frequent) cursor (like the one produced by android contact
252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * provider's CONTENT_STREQUENT_URI query) that's consumable by FrequentContactsCursorBuilder.
253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getStrequentContactsCursor() {
255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(0), "Anna Kinney", "content://uri1", "3" },
257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), "Sun Woo Kong", "content://uri2", "1" },
258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(2), "John Smith", "content://uri3", "0" },
259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // Email-only entry that shouldn't be included in the result.
260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(3), "Email Contact", "content://uri4", "100" },
261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(ContactUtil.FrequentContactQuery.PROJECTION,
263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                sFrequentContactCursorColumns, cursorData);
264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int SMS_MMS_THREAD_ID_CURSOR_VALUE = 123456789;
267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getSmsMmsThreadIdCursor() {
269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final String[] ID_PROJECTION = { BaseColumns._ID };
270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(SMS_MMS_THREAD_ID_CURSOR_VALUE) },
272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(ID_PROJECTION, ID_PROJECTION, cursorData);
274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static FakeCursor getGalleryGridCursor() {
277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final Object[][] cursorData = new Object[][] {
278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(0), "/sdcard/image1", 100, 100, "image/jpeg" },
279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(1), "/sdcard/image2", 200, 200, "image/png" },
280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new Object[] { Long.valueOf(2), "/sdcard/image3", 300, 300, "image/jpeg" },
281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new FakeCursor(GalleryGridItemData.IMAGE_PROJECTION, sGalleryCursorColumns,
283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                cursorData);
284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final int NUM_TEST_CONVERSATIONS = 10;
287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Create test data in our db.
290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Ideally this will create more realistic data with more variety.
292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static void createTestData(final SQLiteDatabase db) {
294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        BugleDatabaseOperations.clearParticipantIdCache();
295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Timestamp for 1 day ago
297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final long yesterday = System.currentTimeMillis() - (24 * 60 * 60 * 1000);
298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
299d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final ContentValues conversationValues = new ContentValues();
300d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 1; i <= NUM_TEST_CONVERSATIONS; i++) {
301d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            conversationValues.put(ConversationColumns.NAME, "Conversation " + i);
302d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final long conversationId = db.insert(DatabaseHelper.CONVERSATIONS_TABLE, null,
303d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    conversationValues);
304d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
305d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ContentValues messageValues = new ContentValues();
306d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            for (int m = 1; m <= 25; m++) {
307d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // Move forward ten minutes per conversation, 1 minute per message.
308d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                final long messageTime = yesterday + (i * 10 * 60 * 1000) + (m * 60 * 1000);
309d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageValues.put(MessageColumns.RECEIVED_TIMESTAMP, messageTime);
310d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageValues.put(MessageColumns.CONVERSATION_ID, conversationId);
311d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                messageValues.put(MessageColumns.SENDER_PARTICIPANT_ID,
312d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        Math.abs(("" + messageTime).hashCode()) % 2);
313d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                final long messageId = db.insert(DatabaseHelper.MESSAGES_TABLE, null, messageValues);
314d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
315d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // Create a text part for this message
316d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                final ContentValues partValues = new ContentValues();
317d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                partValues.put(PartColumns.MESSAGE_ID, messageId);
318d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                partValues.put(PartColumns.CONVERSATION_ID, conversationId);
319d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                partValues.put(PartColumns.TEXT, "Conversation: " + conversationId +
320d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        " Message: " + m);
321d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                db.insert(DatabaseHelper.PARTS_TABLE, null, partValues);
322d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
323d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // Update the snippet for this conversation to the latest message inserted
324d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                conversationValues.clear();
325d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                conversationValues.put(ConversationColumns.LATEST_MESSAGE_ID, messageId);
326d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                final int updatedCount = db.update(DatabaseHelper.CONVERSATIONS_TABLE,
327d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        conversationValues,
328d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "_id=?", new String[]{String.valueOf(conversationId)});
329d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                Assert.isTrue(updatedCount == 1);
330d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
331d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
332d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
333d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
334d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static List<MessagePartData> getTestDraftAttachments() {
335d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final MessagePartData[] retParts = new MessagePartData[] {
336d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new MessagePartData(ContentType.IMAGE_JPEG, Uri.parse("content://image"),
337d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        100, 100),
338d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new MessagePartData(ContentType.VIDEO_3GPP, Uri.parse("content://video"),
339d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        100, 100),
340d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new MessagePartData(ContentType.TEXT_VCARD, Uri.parse("content://vcard"),
341d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        0, 0),
342d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                new MessagePartData(ContentType.AUDIO_3GPP, Uri.parse("content://audio"),
343d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        0, 0)
344d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
345d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return Arrays.asList(retParts);
346d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
347d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
348