• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 
17 package com.android.contacts.tests.allintents;
18 
19 import android.accounts.Account;
20 import android.app.ListActivity;
21 import android.app.SearchManager;
22 import android.content.ComponentName;
23 import android.content.ContentUris;
24 import android.content.ContentValues;
25 import android.content.Intent;
26 import android.database.Cursor;
27 import android.net.Uri;
28 import android.os.Bundle;
29 import android.provider.Contacts.ContactMethods;
30 import android.provider.Contacts.People;
31 import android.provider.Contacts.Phones;
32 import android.provider.ContactsContract.CommonDataKinds.Email;
33 import android.provider.ContactsContract.CommonDataKinds.Organization;
34 import android.provider.ContactsContract.CommonDataKinds.Phone;
35 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
36 import android.provider.ContactsContract.Contacts;
37 import android.provider.ContactsContract.Data;
38 import android.provider.ContactsContract.Intents;
39 import android.provider.ContactsContract.Intents.Insert;
40 import android.provider.ContactsContract.RawContacts;
41 import android.view.View;
42 import android.widget.ArrayAdapter;
43 import android.widget.ListView;
44 import android.widget.Toast;
45 
46 import com.android.contacts.tests.R;
47 import com.android.contacts.tests.quickcontact.QuickContactTestsActivity;
48 
49 import java.util.ArrayList;
50 
51 /**
52  * An activity that provides access to various modes of the contacts application.
53  * Useful for manual and scripted tests.
54  * <p>
55  * Note: this class cannot depend (directly on indirectly) on anything outside the test package.
56  */
57 @SuppressWarnings("deprecation")
58 public class AllIntentsActivity extends ListActivity
59         implements SelectAccountDialogFragment.Listener {
60 
61     /** The name of the package of the contacts application. */
62     private String mContactsPackageName;
63 
64     private static final String CONTACT_LIST_ACTIVITY_CLASS_NAME =
65             "com.android.contacts.activities.PeopleActivity";
66 
67     public enum ContactsIntent {
68         VIEW_CONTACT_WITHOUT_ID,
69         ACTION_PICK_CONTACT,
70         ACTION_PICK_CONTACT_LEGACY,
71         ACTION_PICK_PHONE,
72         ACTION_PICK_PHONE_LEGACY,
73         ACTION_PICK_POSTAL,
74         ACTION_PICK_POSTAL_LEGACY,
75         ACTION_PICK_EMAIL,
76         ACTION_CREATE_SHORTCUT_CONTACT,
77         ACTION_CREATE_SHORTCUT_DIAL,
78         ACTION_CREATE_SHORTCUT_MESSAGE,
79         ACTION_GET_CONTENT_CONTACT,
80         ACTION_GET_CONTENT_CONTACT_LEGACY,
81         ACTION_GET_CONTENT_PHONE,
82         ACTION_GET_CONTENT_PHONE_LEGACY,
83         ACTION_GET_CONTENT_POSTAL,
84         ACTION_GET_CONTENT_POSTAL_LEGACY,
85         ACTION_INSERT_OR_EDIT,
86         ACTION_INSERT_OR_EDIT_PHONE_NUMBER,
87         ACTION_INSERT_OR_EDIT_EMAIL_ADDRESS,
88         ACTION_SEARCH_CALL,
89         ACTION_SEARCH_CONTACT,
90         ACTION_SEARCH_EMAIL,
91         ACTION_SEARCH_PHONE,
92         SEARCH_SUGGESTION_CLICKED_CONTACT,
93         EDIT_CONTACT,
94         EDIT_CONTACT_LOOKUP,
95         EDIT_CONTACT_LOOKUP_ID,
96         EDIT_RAW_CONTACT,
97         EDIT_LEGACY,
98         EDIT_NEW_CONTACT,
99         EDIT_NEW_CONTACT_WITH_DATA,
100         EDIT_NEW_CONTACT_FOR_ACCOUNT,
101         EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA,
102         EDIT_NEW_RAW_CONTACT,
103         EDIT_NEW_LEGACY,
104         VIEW_CONTACT,
105         VIEW_CONTACT_LOOKUP,
106         VIEW_CONTACT_LOOKUP_ID,
107         VIEW_RAW_CONTACT,
108         VIEW_LEGACY,
109         QUICK_CONTACT_TESTS_ACTIVITY;
110 
get(int ordinal)111         public static ContactsIntent get(int ordinal) {
112             return values()[ordinal];
113         }
114     }
115 
116     @Override
onCreate(Bundle savedInstanceState)117     protected void onCreate(Bundle savedInstanceState) {
118         super.onCreate(savedInstanceState);
119 
120         setListAdapter(new ArrayAdapter<String>(this, R.layout.intent_list_item,
121                 getResources().getStringArray(R.array.allIntents)));
122         mContactsPackageName = getResources().getString(
123                 R.string.target_package_name);
124     }
125 
126     @Override
onListItemClick(ListView l, View v, int position, long id)127     protected void onListItemClick(ListView l, View v, int position, long id) {
128         super.onListItemClick(l, v, position, id);
129 
130         switch (ContactsIntent.get(position)) {
131             case ACTION_PICK_CONTACT: {
132                 startContactSelectionActivityForResult(
133                         new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI));
134                 break;
135             }
136             case ACTION_PICK_CONTACT_LEGACY: {
137                 startContactSelectionActivityForResult(
138                         new Intent(Intent.ACTION_PICK, People.CONTENT_URI));
139                 break;
140             }
141             case ACTION_PICK_PHONE: {
142                 startContactSelectionActivityForResult(
143                         new Intent(Intent.ACTION_PICK, Phone.CONTENT_URI));
144                 break;
145             }
146             case ACTION_PICK_PHONE_LEGACY: {
147                 startContactSelectionActivityForResult(
148                         new Intent(Intent.ACTION_PICK, Phones.CONTENT_URI));
149                 break;
150             }
151             case ACTION_PICK_POSTAL: {
152                 startContactSelectionActivityForResult(
153                         new Intent(Intent.ACTION_PICK, StructuredPostal.CONTENT_URI));
154                 break;
155             }
156             case ACTION_PICK_POSTAL_LEGACY: {
157                 Intent intent = new Intent(Intent.ACTION_PICK);
158                 intent.setType(ContactMethods.CONTENT_POSTAL_TYPE);
159                 startContactSelectionActivityForResult(intent);
160                 break;
161             }
162             case ACTION_PICK_EMAIL: {
163                 startContactSelectionActivityForResult(
164                         new Intent(Intent.ACTION_PICK, Email.CONTENT_URI));
165                 break;
166             }
167             case ACTION_CREATE_SHORTCUT_CONTACT: {
168                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
169                 startContactSelectionActivityForResult(intent);
170                 break;
171             }
172             case ACTION_CREATE_SHORTCUT_DIAL: {
173                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
174                 bindIntentToClass(intent, "alias.DialShortcut");
175                 startActivityForResult(intent, 0);
176                 break;
177             }
178             case ACTION_CREATE_SHORTCUT_MESSAGE: {
179                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
180                 bindIntentToClass(intent, "alias.MessageShortcut");
181                 startActivityForResult(intent, 0);
182                 break;
183             }
184             case ACTION_GET_CONTENT_CONTACT: {
185                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
186                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
187                 startContactSelectionActivityForResult(intent);
188                 break;
189             }
190             case ACTION_GET_CONTENT_CONTACT_LEGACY: {
191                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
192                 intent.setType(People.CONTENT_ITEM_TYPE);
193                 startContactSelectionActivityForResult(intent);
194                 break;
195             }
196             case ACTION_GET_CONTENT_PHONE: {
197                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
198                 intent.setType(Phone.CONTENT_ITEM_TYPE);
199                 startContactSelectionActivityForResult(intent);
200                 break;
201             }
202             case ACTION_GET_CONTENT_PHONE_LEGACY: {
203                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
204                 intent.setType(Phones.CONTENT_ITEM_TYPE);
205                 startContactSelectionActivityForResult(intent);
206                 break;
207             }
208             case ACTION_GET_CONTENT_POSTAL: {
209                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
210                 intent.setType(StructuredPostal.CONTENT_ITEM_TYPE);
211                 startContactSelectionActivityForResult(intent);
212                 break;
213             }
214             case ACTION_GET_CONTENT_POSTAL_LEGACY: {
215                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
216                 intent.setType(ContactMethods.CONTENT_POSTAL_ITEM_TYPE);
217                 startContactSelectionActivityForResult(intent);
218                 break;
219             }
220             case ACTION_INSERT_OR_EDIT: {
221                 Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
222                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
223                 putDataExtra(intent);
224                 startActivity(intent);
225                 break;
226             }
227             case ACTION_INSERT_OR_EDIT_PHONE_NUMBER: {
228                 Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
229                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
230                 intent.putExtra(Insert.PHONE, "5123456789");
231                 startActivity(intent);
232                 break;
233             }
234             case ACTION_INSERT_OR_EDIT_EMAIL_ADDRESS: {
235                 Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
236                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
237                 intent.putExtra(Insert.EMAIL, "android@android.com");
238                 startActivity(intent);
239                 break;
240             }
241             case ACTION_SEARCH_CALL: {
242                 Intent intent = new Intent(Intent.ACTION_SEARCH);
243                 intent.putExtra(SearchManager.ACTION_MSG, "call");
244                 intent.putExtra(SearchManager.QUERY, "800-4664-411");
245                 startSearchResultActivity(intent);
246                 break;
247             }
248             case ACTION_SEARCH_CONTACT: {
249                 Intent intent = new Intent(Intent.ACTION_SEARCH);
250                 intent.putExtra(SearchManager.QUERY, "a");
251                 intent.setType(Contacts.CONTENT_TYPE);
252                 startSearchResultActivity(intent);
253                 break;
254             }
255             case ACTION_SEARCH_EMAIL: {
256                 Intent intent = new Intent(Intent.ACTION_SEARCH);
257                 intent.putExtra(Insert.EMAIL, "a");
258                 startSearchResultActivity(intent);
259                 break;
260             }
261             case ACTION_SEARCH_PHONE: {
262                 Intent intent = new Intent(Intent.ACTION_SEARCH);
263                 intent.putExtra(Insert.PHONE, "800");
264                 startSearchResultActivity(intent);
265                 break;
266             }
267             case SEARCH_SUGGESTION_CLICKED_CONTACT: {
268                 long contactId = findArbitraryContactWithPhoneNumber();
269                 if (contactId != -1) {
270                     Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
271                     Intent intent = new Intent(Intents.SEARCH_SUGGESTION_CLICKED);
272                     intent.setData(contactUri);
273                     startContactListActivity(intent);
274                 }
275                 break;
276             }
277             case EDIT_CONTACT: {
278                 final long contactId = findArbitraryContactWithPhoneNumber();
279                 if (contactId != -1) {
280                     final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
281                     final Intent intent = new Intent(Intent.ACTION_EDIT, uri);
282                     startActivity(intent);
283                 }
284                 break;
285             }
286             case EDIT_CONTACT_LOOKUP: {
287                 final long contactId = findArbitraryContactWithPhoneNumber();
288                 if (contactId != -1) {
289                     final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
290                     final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
291                     final String lookupKey = lookupUri.getPathSegments().get(2);
292                     final Uri lookupWithoutIdUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
293                             lookupKey);
294                     final Intent intent = new Intent(Intent.ACTION_EDIT, lookupWithoutIdUri);
295                     startActivity(intent);
296                 }
297                 break;
298             }
299             case EDIT_CONTACT_LOOKUP_ID: {
300                 final long contactId = findArbitraryContactWithPhoneNumber();
301                 if (contactId != -1) {
302                     final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
303                     final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
304                     final Intent intent = new Intent(Intent.ACTION_EDIT, lookupUri);
305                     startActivity(intent);
306                 }
307                 break;
308             }
309             case EDIT_RAW_CONTACT: {
310                 final long contactId = findArbitraryContactWithPhoneNumber();
311                 if (contactId != -1) {
312                     final long rawContactId = findArbitraryRawContactOfContact(contactId);
313                     if (rawContactId != -1) {
314                         final Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,
315                                 rawContactId);
316                         final Intent intent = new Intent(Intent.ACTION_EDIT, uri);
317                         startActivity(intent);
318                     }
319                 }
320                 break;
321             }
322             case EDIT_LEGACY: {
323                 final long contactId = findArbitraryContactWithPhoneNumber();
324                 if (contactId != -1) {
325                     final long rawContactId = findArbitraryRawContactOfContact(contactId);
326                     if (rawContactId != -1) {
327                         final Uri legacyContentUri = Uri.parse("content://contacts/people");
328                         final Uri uri = ContentUris.withAppendedId(legacyContentUri, rawContactId);
329                         final Intent intent = new Intent(Intent.ACTION_EDIT, uri);
330                         startActivity(intent);
331                     }
332                 }
333                 break;
334             }
335             case EDIT_NEW_CONTACT: {
336                 startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
337                 break;
338             }
339             case EDIT_NEW_CONTACT_WITH_DATA: {
340                 Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
341                 putDataExtra(intent);
342                 startActivity(intent);
343                 break;
344             }
345             case EDIT_NEW_CONTACT_FOR_ACCOUNT:
346             case EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA: {
347                 final SelectAccountDialogFragment dialog = new SelectAccountDialogFragment();
348                 dialog.setArguments(SelectAccountDialogFragment.createBundle(position));
349                 dialog.show(getFragmentManager(), SelectAccountDialogFragment.TAG);
350                 break;
351             }
352             case EDIT_NEW_RAW_CONTACT: {
353                 startActivity(new Intent(Intent.ACTION_INSERT, RawContacts.CONTENT_URI));
354                 break;
355             }
356             case EDIT_NEW_LEGACY: {
357                 final Uri legacyContentUri = Uri.parse("content://contacts/people");
358                 startActivity(new Intent(Intent.ACTION_INSERT, legacyContentUri));
359                 break;
360             }
361             case VIEW_CONTACT: {
362                 final long contactId = findArbitraryContactWithPhoneNumber();
363                 if (contactId != -1) {
364                     final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
365                     final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
366                     startActivity(intent);
367                 }
368                 break;
369             }
370             case VIEW_CONTACT_WITHOUT_ID: {
371                 startActivity(new Intent(Intent.ACTION_VIEW, Contacts.CONTENT_URI));
372                 break;
373             }
374             case VIEW_CONTACT_LOOKUP: {
375                 final long contactId = findArbitraryContactWithPhoneNumber();
376                 if (contactId != -1) {
377                     final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
378                     final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
379                     final String lookupKey = lookupUri.getPathSegments().get(2);
380                     final Uri lookupWithoutIdUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
381                             lookupKey);
382                     final Intent intent = new Intent(Intent.ACTION_VIEW, lookupWithoutIdUri);
383                     startActivity(intent);
384                 }
385                 break;
386             }
387             case VIEW_CONTACT_LOOKUP_ID: {
388                 final long contactId = findArbitraryContactWithPhoneNumber();
389                 if (contactId != -1) {
390                     final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
391                     final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
392                     final Intent intent = new Intent(Intent.ACTION_VIEW, lookupUri);
393                     startActivity(intent);
394                 }
395                 break;
396             }
397             case VIEW_RAW_CONTACT: {
398                 final long contactId = findArbitraryContactWithPhoneNumber();
399                 if (contactId != -1) {
400                     final long rawContactId = findArbitraryRawContactOfContact(contactId);
401                     if (rawContactId != -1) {
402                         final Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,
403                                 rawContactId);
404                         final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
405                         startActivity(intent);
406                     }
407                 }
408                 break;
409             }
410             case VIEW_LEGACY: {
411                 final long contactId = findArbitraryContactWithPhoneNumber();
412                 if (contactId != -1) {
413                     final long rawContactId = findArbitraryRawContactOfContact(contactId);
414                     if (rawContactId != -1) {
415                         final Uri legacyContentUri = Uri.parse("content://contacts/people");
416                         final Uri uri = ContentUris.withAppendedId(legacyContentUri, rawContactId);
417                         final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
418                         startActivity(intent);
419                     }
420                 }
421                 break;
422             }
423             case QUICK_CONTACT_TESTS_ACTIVITY: {
424                 startActivity(new Intent(this, QuickContactTestsActivity.class));
425                 break;
426             }
427 
428             default: {
429                 Toast.makeText(this, "Sorry, we forgot to write this...", Toast.LENGTH_LONG).show();
430             }
431         }
432     }
433 
434     /** Creates an intent that is bound to a specific activity by name. */
bindIntentToClass(Intent intent, String activityClassName)435     private Intent bindIntentToClass(Intent intent, String activityClassName) {
436         intent.setComponent(new ComponentName(mContactsPackageName,
437                     activityClassName));
438         return intent;
439     }
440 
startContactListActivity(Intent intent)441     private void startContactListActivity(Intent intent) {
442         bindIntentToClass(intent, CONTACT_LIST_ACTIVITY_CLASS_NAME);
443         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
444         startActivity(intent);
445     }
446 
startContactSelectionActivityForResult(Intent intent)447     private void startContactSelectionActivityForResult(Intent intent) {
448         startActivityForResult(intent, 12);
449     }
450 
startSearchResultActivity(Intent intent)451     private void startSearchResultActivity(Intent intent) {
452         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
453         startActivity(intent);
454     }
455 
456     @Override
onActivityResult(int requestCode, int resultCode, Intent data)457     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
458         Intent intent = new Intent(this, ResultActivity.class);
459         intent.putExtra("resultCode", resultCode);
460         intent.putExtra("data", data);
461         startActivity(intent);
462     }
463 
findArbitraryContactWithPhoneNumber()464     private long findArbitraryContactWithPhoneNumber() {
465         final Cursor cursor = getContentResolver().query(Contacts.CONTENT_URI,
466                 new String[] { Contacts._ID },
467                 Contacts.HAS_PHONE_NUMBER + "!=0",
468                 null, "RANDOM() LIMIT 1");
469         try {
470             if (cursor.moveToFirst()) {
471                 return cursor.getLong(0);
472             }
473         } finally {
474             cursor.close();
475         }
476         Toast.makeText(this, "Failed to find a contact with a phone number. Aborting.",
477                 Toast.LENGTH_SHORT).show();
478         return -1;
479     }
480 
findArbitraryRawContactOfContact(long contactId)481     private long findArbitraryRawContactOfContact(long contactId) {
482         final Cursor cursor = getContentResolver().query(RawContacts.CONTENT_URI,
483                 new String[] { RawContacts._ID },
484                 RawContacts.CONTACT_ID + "=?",
485                 new String[] { String.valueOf(contactId) },
486                 RawContacts._ID + " LIMIT 1");
487         try {
488             if (cursor.moveToFirst()) {
489                 return cursor.getLong(0);
490             }
491         } finally {
492             cursor.close();
493         }
494         Toast.makeText(this, "Failed to find a raw contact of contact with ID " + contactId +
495                 ". Aborting", Toast.LENGTH_SHORT).show();
496         return -1;
497     }
498 
499     @Override
onAccountChosen(Account account, String dataSet, int tag)500     public void onAccountChosen(Account account, String dataSet, int tag) {
501         switch (ContactsIntent.get(tag)) {
502             case EDIT_NEW_CONTACT_FOR_ACCOUNT: {
503                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
504                 intent.putExtra(Insert.EXTRA_ACCOUNT, account);
505                 intent.putExtra(Insert.EXTRA_DATA_SET, dataSet);
506                 startActivity(intent);
507                 break;
508             }
509             case EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA: {
510                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
511 
512                 intent.putExtra(Insert.EXTRA_ACCOUNT, account);
513                 intent.putExtra(Insert.EXTRA_DATA_SET, dataSet);
514                 putDataExtra(intent);
515 
516                 startActivity(intent);
517                 break;
518             }
519             default:
520                 break;
521         }
522     }
523 
putDataExtra(final Intent intent)524     public void putDataExtra(final Intent intent) {
525         ContentValues row1 = new ContentValues();
526         row1.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
527         row1.put(Organization.COMPANY, "Android");
528 
529         ContentValues row2 = new ContentValues();
530         row2.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
531         row2.put(Email.TYPE, Email.TYPE_CUSTOM);
532         row2.put(Email.LABEL, "Green Bot");
533         row2.put(Email.ADDRESS, "android@android.com");
534 
535         final ArrayList<ContentValues> rows = new ArrayList<>();
536         rows.add(row1);
537         rows.add(row2);
538 
539         intent.putParcelableArrayListExtra(Insert.DATA, rows);
540     }
541 }
542