1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.providers.contacts;
18
19import android.accounts.Account;
20import android.content.ContentUris;
21import android.content.ContentValues;
22import android.database.Cursor;
23import android.net.Uri;
24import android.provider.ContactsContract;
25import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
26import android.provider.ContactsContract.Contacts;
27import android.provider.ContactsContract.Data;
28import android.provider.ContactsContract.Directory;
29import android.test.suitebuilder.annotation.MediumTest;
30
31
32/**
33 * Unit tests for {@link ContactsProvider2}, directory functionality.
34 *
35 * Run the test like this:
36 * <code>
37 * adb shell am instrument -e class com.android.providers.contacts.DirectoryTest -w \
38 *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
39 * </code>
40 */
41@MediumTest
42public class DirectoryTest extends BaseContactsProvider2Test {
43
44    public void testDefaultDirectory() {
45        ContentValues values = new ContentValues();
46        Uri defaultDirectoryUri =
47            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.DEFAULT);
48
49        values.put(Directory.PACKAGE_NAME, "contactsTestPackage");
50        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
51        values.put(Directory.TYPE_RESOURCE_ID, R.string.default_directory);
52        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
53        values.putNull(Directory.ACCOUNT_NAME);
54        values.putNull(Directory.ACCOUNT_TYPE);
55        values.putNull(Directory.DISPLAY_NAME);
56
57        assertStoredValues(defaultDirectoryUri, values);
58    }
59
60    public void testInvisibleLocalDirectory() {
61        ContentValues values = new ContentValues();
62        Uri defaultDirectoryUri =
63            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.LOCAL_INVISIBLE);
64
65        values.put(Directory.PACKAGE_NAME, "contactsTestPackage");
66        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
67        values.put(Directory.TYPE_RESOURCE_ID, R.string.local_invisible_directory);
68        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
69        values.putNull(Directory.ACCOUNT_NAME);
70        values.putNull(Directory.ACCOUNT_TYPE);
71        values.putNull(Directory.DISPLAY_NAME);
72
73        assertStoredValues(defaultDirectoryUri, values);
74    }
75
76    public void testForwardingToLocalContacts() {
77        long contactId = queryContactId(createRawContactWithName("John", "Doe"));
78
79        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
80                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)).build();
81
82        Cursor cursor = mResolver.query(contentUri,
83                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
84        assertNotNull(cursor);
85        assertEquals(1, cursor.getCount());
86        cursor.moveToFirst();
87        assertEquals(contactId, cursor.getLong(0));
88        assertEquals("John Doe", cursor.getString(1));
89        cursor.close();
90    }
91
92    public void testForwardingToLocalInvisibleContacts() {
93
94        // Visible because there is no account
95        long contactId1 = queryContactId(createRawContactWithName("Bob", "Parr"));
96
97        Account account = new Account("accountName", "accountType");
98        long groupId = createGroup(account, "sid", "def",
99                0 /* visible */,  true /* auto-add */, false /* fav */);
100        long contactId2 = queryContactId(createRawContactWithName("Helen", "Parr",
101                account));
102
103        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
104                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.LOCAL_INVISIBLE))
105                .build();
106
107        Cursor cursor = mResolver.query(contentUri,
108                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
109        assertEquals(0, cursor.getCount());
110        cursor.close();
111
112        // Hide by removing from the default group
113        mResolver.delete(Data.CONTENT_URI,
114                Data.MIMETYPE + "=? AND " + GroupMembership.GROUP_ROW_ID + "=?",
115                new String[] { GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(groupId) });
116
117        cursor = mResolver.query(contentUri,
118                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
119        assertNotNull(cursor);
120        assertEquals(1, cursor.getCount());
121        cursor.moveToFirst();
122        assertEquals(contactId2, cursor.getLong(0));
123        assertEquals("Helen Parr", cursor.getString(1));
124        cursor.close();
125    }
126}
127
128