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
19d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.accounts.Account;
20d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentUris;
21d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentValues;
22d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.database.Cursor;
23d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.net.Uri;
24d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract;
256c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
26d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
276c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikovimport android.provider.ContactsContract.Data;
28d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Directory;
2938210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport android.test.suitebuilder.annotation.MediumTest;
30d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
318ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Chengimport com.android.providers.contacts.testutil.RawContactUtil;
328ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng
33d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
34d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov/**
35d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}, directory functionality.
36d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
37d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Run the test like this:
38d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * <code>
39d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * adb shell am instrument -e class com.android.providers.contacts.DirectoryTest -w \
40d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
41d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * </code>
42d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */
43583b1364980fd46a5012825886af3160752ff19cMakoto Onuki@MediumTest
44d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovpublic class DirectoryTest extends BaseContactsProvider2Test {
45d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
46d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDefaultDirectory() {
47d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
48d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri defaultDirectoryUri =
49d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.DEFAULT);
50d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
51d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, "contactsTestPackage");
52d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
53d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, R.string.default_directory);
54d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
55d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_NAME);
56d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_TYPE);
57d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.DISPLAY_NAME);
58d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
59d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(defaultDirectoryUri, values);
60d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
61d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
62d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testInvisibleLocalDirectory() {
63d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
64d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri defaultDirectoryUri =
65d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.LOCAL_INVISIBLE);
66d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
67d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, "contactsTestPackage");
68d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
69d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, R.string.local_invisible_directory);
70d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
71d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_NAME);
72d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_TYPE);
73d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.DISPLAY_NAME);
74d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
75d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(defaultDirectoryUri, values);
76d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
77d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
78d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testForwardingToLocalContacts() {
798ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng        long contactId = queryContactId(RawContactUtil.createRawContactWithName(mResolver, "John",
808ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng                "Doe"));
81d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
82d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
83d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)).build();
84d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
85d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Cursor cursor = mResolver.query(contentUri,
86d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
87d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
88d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
89d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
90d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(contactId, cursor.getLong(0));
91d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("John Doe", cursor.getString(1));
92d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
93d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
94d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
95d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testForwardingToLocalInvisibleContacts() {
96d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
97385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov        // Visible because there is no account
988ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng        long contactId1 = queryContactId(RawContactUtil.createRawContactWithName(mResolver, "Bob",
998ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng                "Parr"));
100d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
101385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov        Account account = new Account("accountName", "accountType");
102385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov        long groupId = createGroup(account, "sid", "def",
103385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov                0 /* visible */,  true /* auto-add */, false /* fav */);
1048ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng        long contactId2 = queryContactId(RawContactUtil.createRawContactWithName(mResolver, "Helen",
1058ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng                "Parr", account));
106d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
107d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
108d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.LOCAL_INVISIBLE))
109d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                .build();
110d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
111d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Cursor cursor = mResolver.query(contentUri,
112d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
1136c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        assertEquals(0, cursor.getCount());
1146c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        cursor.close();
1156c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov
1166c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        // Hide by removing from the default group
1176c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        mResolver.delete(Data.CONTENT_URI,
1186c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov                Data.MIMETYPE + "=? AND " + GroupMembership.GROUP_ROW_ID + "=?",
1196c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov                new String[] { GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(groupId) });
1206c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov
1216c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        cursor = mResolver.query(contentUri,
1226c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
123d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
124d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
125d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
1266c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov        assertEquals(contactId2, cursor.getLong(0));
127d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("Helen Parr", cursor.getString(1));
128d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
129d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
130d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov}
131d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
132