12644d947574240b71c427d457f7a775dc160ec09Yorke Lee/*
22644d947574240b71c427d457f7a775dc160ec09Yorke Lee * Copyright (C) 2009 The Android Open Source Project
32644d947574240b71c427d457f7a775dc160ec09Yorke Lee *
42644d947574240b71c427d457f7a775dc160ec09Yorke Lee * Licensed under the Apache License, Version 2.0 (the "License");
52644d947574240b71c427d457f7a775dc160ec09Yorke Lee * you may not use this file except in compliance with the License.
62644d947574240b71c427d457f7a775dc160ec09Yorke Lee * You may obtain a copy of the License at
72644d947574240b71c427d457f7a775dc160ec09Yorke Lee *
82644d947574240b71c427d457f7a775dc160ec09Yorke Lee *      http://www.apache.org/licenses/LICENSE-2.0
92644d947574240b71c427d457f7a775dc160ec09Yorke Lee *
102644d947574240b71c427d457f7a775dc160ec09Yorke Lee * Unless required by applicable law or agreed to in writing, software
112644d947574240b71c427d457f7a775dc160ec09Yorke Lee * distributed under the License is distributed on an "AS IS" BASIS,
122644d947574240b71c427d457f7a775dc160ec09Yorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132644d947574240b71c427d457f7a775dc160ec09Yorke Lee * See the License for the specific language governing permissions and
142644d947574240b71c427d457f7a775dc160ec09Yorke Lee * limitations under the License.
152644d947574240b71c427d457f7a775dc160ec09Yorke Lee */
162644d947574240b71c427d457f7a775dc160ec09Yorke Lee
170a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maipackage com.android.contacts;
182644d947574240b71c427d457f7a775dc160ec09Yorke Lee
191ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulosimport android.content.ContentValues;
202644d947574240b71c427d457f7a775dc160ec09Yorke Leeimport android.content.Intent;
211ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulosimport android.net.Uri;
22e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulosimport android.provider.ContactsContract.CommonDataKinds.Email;
231ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulosimport android.provider.ContactsContract.CommonDataKinds.Im;
242644d947574240b71c427d457f7a775dc160ec09Yorke Leeimport android.test.AndroidTestCase;
252644d947574240b71c427d457f7a775dc160ec09Yorke Leeimport android.test.suitebuilder.annotation.SmallTest;
26e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulosimport android.util.Pair;
272644d947574240b71c427d457f7a775dc160ec09Yorke Lee
2869c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.dataitem.DataItem;
2969c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.dataitem.EmailDataItem;
3069c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.dataitem.ImDataItem;
312644d947574240b71c427d457f7a775dc160ec09Yorke Lee
322644d947574240b71c427d457f7a775dc160ec09Yorke Lee/**
332644d947574240b71c427d457f7a775dc160ec09Yorke Lee * Tests for {@link ContactsUtils}.
342644d947574240b71c427d457f7a775dc160ec09Yorke Lee */
352644d947574240b71c427d457f7a775dc160ec09Yorke Lee@SmallTest
362644d947574240b71c427d457f7a775dc160ec09Yorke Leepublic class ContactsUtilsTests extends AndroidTestCase {
372644d947574240b71c427d457f7a775dc160ec09Yorke Lee
38e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    private static final String TEST_ADDRESS = "user@example.org";
39e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    private static final String TEST_PROTOCOL = "prot%col";
40e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
412644d947574240b71c427d457f7a775dc160ec09Yorke Lee    public void testIsGraphicNull() throws Exception {
422644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse(ContactsUtils.isGraphic(null));
432644d947574240b71c427d457f7a775dc160ec09Yorke Lee    }
442644d947574240b71c427d457f7a775dc160ec09Yorke Lee
452644d947574240b71c427d457f7a775dc160ec09Yorke Lee    public void testIsGraphicEmpty() throws Exception {
462644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse(ContactsUtils.isGraphic(""));
472644d947574240b71c427d457f7a775dc160ec09Yorke Lee    }
482644d947574240b71c427d457f7a775dc160ec09Yorke Lee
492644d947574240b71c427d457f7a775dc160ec09Yorke Lee    public void testIsGraphicSpaces() throws Exception {
502644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse(ContactsUtils.isGraphic("  "));
512644d947574240b71c427d457f7a775dc160ec09Yorke Lee    }
522644d947574240b71c427d457f7a775dc160ec09Yorke Lee
532644d947574240b71c427d457f7a775dc160ec09Yorke Lee    public void testIsGraphicPunctuation() throws Exception {
542644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertTrue(ContactsUtils.isGraphic("."));
552644d947574240b71c427d457f7a775dc160ec09Yorke Lee    }
562644d947574240b71c427d457f7a775dc160ec09Yorke Lee
572644d947574240b71c427d457f7a775dc160ec09Yorke Lee    public void testAreObjectsEqual() throws Exception {
582644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertTrue("null:null", ContactsUtils.areObjectsEqual(null, null));
592644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertTrue("1:1", ContactsUtils.areObjectsEqual(1, 1));
602644d947574240b71c427d457f7a775dc160ec09Yorke Lee
612644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("null:1", ContactsUtils.areObjectsEqual(null, 1));
622644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("1:null", ContactsUtils.areObjectsEqual(1, null));
632644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("1:2", ContactsUtils.areObjectsEqual(1, 2));
642644d947574240b71c427d457f7a775dc160ec09Yorke Lee    }
652644d947574240b71c427d457f7a775dc160ec09Yorke Lee
662644d947574240b71c427d457f7a775dc160ec09Yorke Lee    public void testAreIntentActionEqual() throws Exception {
672644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertTrue("1", ContactsUtils.areIntentActionEqual(null, null));
682644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertTrue("1", ContactsUtils.areIntentActionEqual(new Intent("a"), new Intent("a")));
692644d947574240b71c427d457f7a775dc160ec09Yorke Lee
702644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("11", ContactsUtils.areIntentActionEqual(new Intent("a"), null));
712644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("12", ContactsUtils.areIntentActionEqual(null, new Intent("a")));
722644d947574240b71c427d457f7a775dc160ec09Yorke Lee
732644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("21", ContactsUtils.areIntentActionEqual(new Intent("a"), new Intent()));
742644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("22", ContactsUtils.areIntentActionEqual(new Intent(), new Intent("b")));
752644d947574240b71c427d457f7a775dc160ec09Yorke Lee        assertFalse("23", ContactsUtils.areIntentActionEqual(new Intent("a"), new Intent("b")));
762644d947574240b71c427d457f7a775dc160ec09Yorke Lee    }
771ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos
781ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos    public void testImIntentCustom() throws Exception {
791ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        // Custom IM types have encoded authority. We send the imto Intent here, because
801ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        // legacy third party apps might not accept xmpp yet
811ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        final ContentValues values = new ContentValues();
821ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        values.put(Im.MIMETYPE, Im.CONTENT_ITEM_TYPE);
831ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        values.put(Im.TYPE, Im.TYPE_HOME);
841ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        values.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
85e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.CUSTOM_PROTOCOL, TEST_PROTOCOL);
86e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.DATA, TEST_ADDRESS);
87e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ImDataItem im = (ImDataItem) DataItem.createFrom(values);
88e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
89e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Pair<Intent, Intent> intents = ContactsUtils.buildImIntent(getContext(), im);
90e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent imIntent = intents.first;
911ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos
921ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        assertEquals(Intent.ACTION_SENDTO, imIntent.getAction());
931ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos
941ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        final Uri data = imIntent.getData();
951ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos        assertEquals("imto", data.getScheme());
96e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(TEST_PROTOCOL, data.getAuthority());
97e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(TEST_ADDRESS, data.getPathSegments().get(0));
98e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
99e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertNull(intents.second);
100e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    }
101e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
102e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    public void testImIntent() throws Exception {
103e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        // Test GTalk XMPP URI. No chat capabilities provided
104e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ContentValues values = new ContentValues();
105e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.MIMETYPE, Im.CONTENT_ITEM_TYPE);
106e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.TYPE, Im.TYPE_HOME);
107e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK);
108e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.DATA, TEST_ADDRESS);
109e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ImDataItem im = (ImDataItem) DataItem.createFrom(values);
110e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
111e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Pair<Intent, Intent> intents = ContactsUtils.buildImIntent(getContext(), im);
112e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent imIntent = intents.first;
113e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
114e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(Intent.ACTION_SENDTO, imIntent.getAction());
115e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals("xmpp:" + TEST_ADDRESS + "?message", imIntent.getData().toString());
116e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
117e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertNull(intents.second);
118e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    }
119e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
120e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    public void testImIntentWithAudio() throws Exception {
121e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        // Test GTalk XMPP URI. Audio chat capabilities provided
122e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ContentValues values = new ContentValues();
123e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.MIMETYPE, Im.CONTENT_ITEM_TYPE);
124e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.TYPE, Im.TYPE_HOME);
125e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK);
126e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.DATA, TEST_ADDRESS);
127e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.CHAT_CAPABILITY, Im.CAPABILITY_HAS_VOICE | Im.CAPABILITY_HAS_VIDEO);
128e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ImDataItem im = (ImDataItem) DataItem.createFrom(values);
129e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
130e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Pair<Intent, Intent> intents = ContactsUtils.buildImIntent(getContext(), im);
131e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent imIntent = intents.first;
132e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
133e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(Intent.ACTION_SENDTO, imIntent.getAction());
134e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals("xmpp:" + TEST_ADDRESS + "?message", imIntent.getData().toString());
135e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
136e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent secondaryIntent = intents.second;
137e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(Intent.ACTION_SENDTO, secondaryIntent.getAction());
138e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals("xmpp:" + TEST_ADDRESS + "?call", secondaryIntent.getData().toString());
139e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    }
140e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
141e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    public void testImIntentWithVideo() throws Exception {
142e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        // Test GTalk XMPP URI. Video chat capabilities provided
143e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ContentValues values = new ContentValues();
144e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.MIMETYPE, Im.CONTENT_ITEM_TYPE);
145e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.TYPE, Im.TYPE_HOME);
146e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK);
147e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.DATA, TEST_ADDRESS);
148e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Im.CHAT_CAPABILITY, Im.CAPABILITY_HAS_VOICE | Im.CAPABILITY_HAS_VIDEO |
149e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos                Im.CAPABILITY_HAS_VOICE);
150e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ImDataItem im = (ImDataItem) DataItem.createFrom(values);
151e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
152e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Pair<Intent, Intent> intents = ContactsUtils.buildImIntent(getContext(), im);
153e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent imIntent = intents.first;
154e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
155e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(Intent.ACTION_SENDTO, imIntent.getAction());
156e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals("xmpp:" + TEST_ADDRESS + "?message", imIntent.getData().toString());
157e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
158e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent secondaryIntent = intents.second;
159e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(Intent.ACTION_SENDTO, secondaryIntent.getAction());
160e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals("xmpp:" + TEST_ADDRESS + "?call", secondaryIntent.getData().toString());
161e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    }
162e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
163e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
164e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos    public void testImEmailIntent() throws Exception {
165e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        // Email addresses are treated as Google Talk entries
166e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        // This test only tests the VIDEO+CAMERA case. The other cases have been addressed by the
167e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        // Im tests
168e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ContentValues values = new ContentValues();
169e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Email.MIMETYPE, Email.CONTENT_ITEM_TYPE);
170e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Email.TYPE, Email.TYPE_HOME);
171e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Email.DATA, TEST_ADDRESS);
172e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        values.put(Email.CHAT_CAPABILITY, Im.CAPABILITY_HAS_VOICE | Im.CAPABILITY_HAS_VIDEO |
173e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos                Im.CAPABILITY_HAS_VOICE);
174e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final ImDataItem im = ImDataItem.createFromEmail(
175e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos                (EmailDataItem) DataItem.createFrom(values));
176e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
177e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Pair<Intent, Intent> intents = ContactsUtils.buildImIntent(getContext(), im);
178e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent imIntent = intents.first;
179e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
180e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(Intent.ACTION_SENDTO, imIntent.getAction());
181e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals("xmpp:" + TEST_ADDRESS + "?message", imIntent.getData().toString());
182e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos
183e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        final Intent secondaryIntent = intents.second;
184e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals(Intent.ACTION_SENDTO, secondaryIntent.getAction());
185e98b88d33c236d3b25238aab06f05bbcb2f3cb5ePaul Soulos        assertEquals("xmpp:" + TEST_ADDRESS + "?call", secondaryIntent.getData().toString());
1861ff2fcb999b43f1249a3105563c4b170ea735283Paul Soulos    }
1872644d947574240b71c427d457f7a775dc160ec09Yorke Lee}
188