1d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov/*
2d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
4d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * you may not use this file except in compliance with the License.
6d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * You may obtain a copy of the License at
7d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
8d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
10d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * See the License for the specific language governing permissions and
14d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * limitations under the License.
15d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */
16d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
17d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovpackage com.android.providers.contacts;
18d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
19fcc2655b0fca7032fcde306660da303c85125218Makoto Onukiimport static com.android.providers.contacts.ContactsActor.PACKAGE_GREY;
20fcc2655b0fca7032fcde306660da303c85125218Makoto Onuki
21d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.accounts.Account;
22d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentUris;
23d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentValues;
24d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.database.Cursor;
25d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.net.Uri;
26d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract;
276c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
28d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
296c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikovimport android.provider.ContactsContract.Data;
30d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Directory;
3138210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport android.test.suitebuilder.annotation.MediumTest;
32d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
338ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Chengimport com.android.providers.contacts.testutil.RawContactUtil;
348ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng
35d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
36d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov/**
37d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}, directory functionality.
38d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
39d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Run the test like this:
40d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * <code>
41d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * adb shell am instrument -e class com.android.providers.contacts.DirectoryTest -w \
42d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
43d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * </code>
44d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */
45583b1364980fd46a5012825886af3160752ff19cMakoto Onuki@MediumTest
46d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovpublic class DirectoryTest extends BaseContactsProvider2Test {
47d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
48fcc2655b0fca7032fcde306660da303c85125218Makoto Onuki    protected String getContextPackageName() {
49fcc2655b0fca7032fcde306660da303c85125218Makoto Onuki        return getContext().getPackageName();
50fcc2655b0fca7032fcde306660da303c85125218Makoto Onuki    }
51fcc2655b0fca7032fcde306660da303c85125218Makoto Onuki
52d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDefaultDirectory() {
53d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
54d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri defaultDirectoryUri =
55d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.DEFAULT);
56d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
57fcc2655b0fca7032fcde306660da303c85125218Makoto Onuki        values.put(Directory.PACKAGE_NAME, getContext().getPackageName());
58d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
59d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, R.string.default_directory);
60d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
61d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_NAME);
62d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_TYPE);
63d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.DISPLAY_NAME);
64d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
65d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(defaultDirectoryUri, values);
66d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
67d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
68d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testInvisibleLocalDirectory() {
69d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
70d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri defaultDirectoryUri =
71d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.LOCAL_INVISIBLE);
72d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
73fcc2655b0fca7032fcde306660da303c85125218Makoto Onuki        values.put(Directory.PACKAGE_NAME, getContext().getPackageName());
74d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
75d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, R.string.local_invisible_directory);
76d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
77d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_NAME);
78d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_TYPE);
79d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.DISPLAY_NAME);
80d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
81d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(defaultDirectoryUri, values);
82d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
83d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
84d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testForwardingToLocalContacts() {
858ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng        long contactId = queryContactId(RawContactUtil.createRawContactWithName(mResolver, "John",
868ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng                "Doe"));
87d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
88d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
89d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)).build();
90d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
91d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Cursor cursor = mResolver.query(contentUri,
92d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
93d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
94d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
95d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
96d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(contactId, cursor.getLong(0));
97d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("John Doe", cursor.getString(1));
98d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
99d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
100d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
101d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testForwardingToLocalInvisibleContacts() {
102d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
103385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov        // Visible because there is no account
1048ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng        long contactId1 = queryContactId(RawContactUtil.createRawContactWithName(mResolver, "Bob",
1058ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng                "Parr"));
106d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
107385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov        Account account = new Account("accountName", "accountType");
108385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov        long groupId = createGroup(account, "sid", "def",
109385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov                0 /* visible */,  true /* auto-add */, false /* fav */);
1108ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng        long contactId2 = queryContactId(RawContactUtil.createRawContactWithName(mResolver, "Helen",
1118ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng                "Parr", account));
112d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
113d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
114d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.LOCAL_INVISIBLE))
115d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                .build();
116d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
117d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Cursor cursor = mResolver.query(contentUri,
118d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
1196c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        assertEquals(0, cursor.getCount());
1206c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        cursor.close();
1216c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov
1226c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        // Hide by removing from the default group
1236c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        mResolver.delete(Data.CONTENT_URI,
1246c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov                Data.MIMETYPE + "=? AND " + GroupMembership.GROUP_ROW_ID + "=?",
1256c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov                new String[] { GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(groupId) });
1266c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov
1276c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        cursor = mResolver.query(contentUri,
1286c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
129d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
130d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
131d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
1326c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        assertEquals(contactId2, cursor.getLong(0));
133d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("Helen Parr", cursor.getString(1));
134d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
135d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
136d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov}
137d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
138