Home | History | Annotate | Download | only in allintents
      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.CallLog.Calls;
     30 import android.provider.Contacts.ContactMethods;
     31 import android.provider.Contacts.People;
     32 import android.provider.Contacts.Phones;
     33 import android.provider.ContactsContract.CommonDataKinds.Email;
     34 import android.provider.ContactsContract.CommonDataKinds.Organization;
     35 import android.provider.ContactsContract.CommonDataKinds.Phone;
     36 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
     37 import android.provider.ContactsContract.Contacts;
     38 import android.provider.ContactsContract.Data;
     39 import android.provider.ContactsContract.Intents;
     40 import android.provider.ContactsContract.Intents.Insert;
     41 import android.provider.ContactsContract.Intents.UI;
     42 import android.provider.ContactsContract.RawContacts;
     43 import android.view.View;
     44 import android.widget.ArrayAdapter;
     45 import android.widget.ListView;
     46 import android.widget.Toast;
     47 
     48 import com.android.contacts.tests.R;
     49 import com.google.common.collect.Lists;
     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 static final String ANDROID_CONTACTS_PACKAGE = "com.android.contacts";
     63 
     64     private static final String CONTACT_LIST_ACTIVITY_CLASS_NAME =
     65             "com.android.contacts.activities.PeopleActivity";
     66 
     67     public enum ContactsIntent {
     68         LIST_DEFAULT,
     69         LIST_ALL_CONTACTS_ACTION,
     70         LIST_CONTACTS_WITH_PHONES_ACTION,
     71         LIST_STARRED_ACTION,
     72         LIST_FREQUENT_ACTION,
     73         LIST_STREQUENT_ACTION,
     74         LIST_GROUP_ACTION,
     75         VIEW_CONTACT_WITHOUT_ID,
     76         ACTION_PICK_CONTACT,
     77         ACTION_PICK_CONTACT_LEGACY,
     78         ACTION_PICK_PHONE,
     79         ACTION_PICK_PHONE_LEGACY,
     80         ACTION_PICK_POSTAL,
     81         ACTION_PICK_POSTAL_LEGACY,
     82         ACTION_PICK_EMAIL,
     83         ACTION_CREATE_SHORTCUT_CONTACT,
     84         ACTION_CREATE_SHORTCUT_DIAL,
     85         ACTION_CREATE_SHORTCUT_MESSAGE,
     86         ACTION_GET_CONTENT_CONTACT,
     87         ACTION_GET_CONTENT_CONTACT_LEGACY,
     88         ACTION_GET_CONTENT_PHONE,
     89         ACTION_GET_CONTENT_PHONE_LEGACY,
     90         ACTION_GET_CONTENT_POSTAL,
     91         ACTION_GET_CONTENT_POSTAL_LEGACY,
     92         ACTION_INSERT_OR_EDIT,
     93         ACTION_INSERT_OR_EDIT_PHONE_NUMBER,
     94         ACTION_INSERT_OR_EDIT_EMAIL_ADDRESS,
     95         ACTION_SEARCH_CALL,
     96         ACTION_SEARCH_CONTACT,
     97         ACTION_SEARCH_EMAIL,
     98         ACTION_SEARCH_PHONE,
     99         SEARCH_SUGGESTION_CLICKED_CONTACT,
    100         JOIN_CONTACT,
    101         EDIT_CONTACT,
    102         EDIT_CONTACT_LOOKUP,
    103         EDIT_CONTACT_LOOKUP_ID,
    104         EDIT_RAW_CONTACT,
    105         EDIT_LEGACY,
    106         EDIT_NEW_CONTACT,
    107         EDIT_NEW_CONTACT_WITH_DATA,
    108         EDIT_NEW_CONTACT_FOR_ACCOUNT,
    109         EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA,
    110         EDIT_NEW_RAW_CONTACT,
    111         EDIT_NEW_LEGACY,
    112         VIEW_CONTACT,
    113         VIEW_CONTACT_LOOKUP,
    114         VIEW_CONTACT_LOOKUP_ID,
    115         VIEW_RAW_CONTACT,
    116         VIEW_LEGACY,
    117         DIAL,
    118         DIAL_phone,
    119         DIAL_person,
    120         DIAL_voicemail,
    121         CALL_BUTTON,
    122         DIAL_tel,
    123         VIEW_tel,
    124         VIEW_calllog,
    125         VIEW_calllog_entry,
    126         LEGACY_CALL_DETAILS_ACTIVITY,
    127         LEGACY_CALL_LOG_ACTIVITY;
    128 
    129         public static ContactsIntent get(int ordinal) {
    130             return values()[ordinal];
    131         }
    132     }
    133 
    134     @Override
    135     protected void onCreate(Bundle savedInstanceState) {
    136         super.onCreate(savedInstanceState);
    137         setListAdapter(new ArrayAdapter<String>(this, R.layout.intent_list_item,
    138                 getResources().getStringArray(R.array.allIntents)));
    139     }
    140 
    141     @Override
    142     protected void onListItemClick(ListView l, View v, int position, long id) {
    143         super.onListItemClick(l, v, position, id);
    144 
    145         switch (ContactsIntent.get(position)) {
    146             case LIST_DEFAULT: {
    147                 startContactListActivity(
    148                         new Intent(UI.LIST_DEFAULT, Contacts.CONTENT_URI));
    149                 break;
    150             }
    151             case LIST_ALL_CONTACTS_ACTION: {
    152                 startContactListActivity(
    153                         new Intent(UI.LIST_ALL_CONTACTS_ACTION, Contacts.CONTENT_URI));
    154                 break;
    155             }
    156             case LIST_CONTACTS_WITH_PHONES_ACTION: {
    157                 startContactListActivity(
    158                         new Intent(UI.LIST_CONTACTS_WITH_PHONES_ACTION, Contacts.CONTENT_URI));
    159                 break;
    160             }
    161             case LIST_STARRED_ACTION: {
    162                 startContactListActivity(
    163                         new Intent(UI.LIST_STARRED_ACTION, Contacts.CONTENT_URI));
    164                 break;
    165             }
    166             case LIST_FREQUENT_ACTION: {
    167                 startContactListActivity(
    168                         new Intent(UI.LIST_FREQUENT_ACTION, Contacts.CONTENT_URI));
    169                 break;
    170             }
    171             case LIST_STREQUENT_ACTION: {
    172                 startContactListActivity(
    173                         new Intent(UI.LIST_STREQUENT_ACTION, Contacts.CONTENT_URI));
    174                 break;
    175             }
    176             case LIST_GROUP_ACTION: {
    177                 startContactListActivity(
    178                         new Intent(UI.LIST_GROUP_ACTION, Contacts.CONTENT_URI));
    179                 break;
    180             }
    181             case ACTION_PICK_CONTACT: {
    182                 startContactSelectionActivityForResult(
    183                         new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI));
    184                 break;
    185             }
    186             case ACTION_PICK_CONTACT_LEGACY: {
    187                 startContactSelectionActivityForResult(
    188                         new Intent(Intent.ACTION_PICK, People.CONTENT_URI));
    189                 break;
    190             }
    191             case ACTION_PICK_PHONE: {
    192                 startContactSelectionActivityForResult(
    193                         new Intent(Intent.ACTION_PICK, Phone.CONTENT_URI));
    194                 break;
    195             }
    196             case ACTION_PICK_PHONE_LEGACY: {
    197                 startContactSelectionActivityForResult(
    198                         new Intent(Intent.ACTION_PICK, Phones.CONTENT_URI));
    199                 break;
    200             }
    201             case ACTION_PICK_POSTAL: {
    202                 startContactSelectionActivityForResult(
    203                         new Intent(Intent.ACTION_PICK, StructuredPostal.CONTENT_URI));
    204                 break;
    205             }
    206             case ACTION_PICK_POSTAL_LEGACY: {
    207                 Intent intent = new Intent(Intent.ACTION_PICK);
    208                 intent.setType(ContactMethods.CONTENT_POSTAL_TYPE);
    209                 startContactSelectionActivityForResult(intent);
    210                 break;
    211             }
    212             case ACTION_PICK_EMAIL: {
    213                 startContactSelectionActivityForResult(
    214                         new Intent(Intent.ACTION_PICK, Email.CONTENT_URI));
    215                 break;
    216             }
    217             case ACTION_CREATE_SHORTCUT_CONTACT: {
    218                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
    219                 startContactSelectionActivityForResult(intent);
    220                 break;
    221             }
    222             case ACTION_CREATE_SHORTCUT_DIAL: {
    223                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
    224                 bindIntentToClass(intent, "alias.DialShortcut");
    225                 startActivityForResult(intent, 0);
    226                 break;
    227             }
    228             case ACTION_CREATE_SHORTCUT_MESSAGE: {
    229                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
    230                 bindIntentToClass(intent, "alias.MessageShortcut");
    231                 startActivityForResult(intent, 0);
    232                 break;
    233             }
    234             case ACTION_GET_CONTENT_CONTACT: {
    235                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    236                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
    237                 startContactSelectionActivityForResult(intent);
    238                 break;
    239             }
    240             case ACTION_GET_CONTENT_CONTACT_LEGACY: {
    241                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    242                 intent.setType(People.CONTENT_ITEM_TYPE);
    243                 startContactSelectionActivityForResult(intent);
    244                 break;
    245             }
    246             case ACTION_GET_CONTENT_PHONE: {
    247                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    248                 intent.setType(Phone.CONTENT_ITEM_TYPE);
    249                 startContactSelectionActivityForResult(intent);
    250                 break;
    251             }
    252             case ACTION_GET_CONTENT_PHONE_LEGACY: {
    253                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    254                 intent.setType(Phones.CONTENT_ITEM_TYPE);
    255                 startContactSelectionActivityForResult(intent);
    256                 break;
    257             }
    258             case ACTION_GET_CONTENT_POSTAL: {
    259                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    260                 intent.setType(StructuredPostal.CONTENT_ITEM_TYPE);
    261                 startContactSelectionActivityForResult(intent);
    262                 break;
    263             }
    264             case ACTION_GET_CONTENT_POSTAL_LEGACY: {
    265                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    266                 intent.setType(ContactMethods.CONTENT_POSTAL_ITEM_TYPE);
    267                 startContactSelectionActivityForResult(intent);
    268                 break;
    269             }
    270             case ACTION_INSERT_OR_EDIT: {
    271                 Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
    272                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
    273                 putDataExtra(intent);
    274                 startActivity(intent);
    275                 break;
    276             }
    277             case ACTION_INSERT_OR_EDIT_PHONE_NUMBER: {
    278                 Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
    279                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
    280                 intent.putExtra(Insert.PHONE, "5123456789");
    281                 startActivity(intent);
    282                 break;
    283             }
    284             case ACTION_INSERT_OR_EDIT_EMAIL_ADDRESS: {
    285                 Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
    286                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
    287                 intent.putExtra(Insert.EMAIL, "android (at) android.com");
    288                 startActivity(intent);
    289                 break;
    290             }
    291             case ACTION_SEARCH_CALL: {
    292                 Intent intent = new Intent(Intent.ACTION_SEARCH);
    293                 intent.putExtra(SearchManager.ACTION_MSG, "call");
    294                 intent.putExtra(SearchManager.QUERY, "800-4664-411");
    295                 startSearchResultActivity(intent);
    296                 break;
    297             }
    298             case ACTION_SEARCH_CONTACT: {
    299                 Intent intent = new Intent(Intent.ACTION_SEARCH);
    300                 intent.putExtra(SearchManager.QUERY, "a");
    301                 intent.setType(Contacts.CONTENT_TYPE);
    302                 startSearchResultActivity(intent);
    303                 break;
    304             }
    305             case ACTION_SEARCH_EMAIL: {
    306                 Intent intent = new Intent(Intent.ACTION_SEARCH);
    307                 intent.putExtra(Insert.EMAIL, "a");
    308                 startSearchResultActivity(intent);
    309                 break;
    310             }
    311             case ACTION_SEARCH_PHONE: {
    312                 Intent intent = new Intent(Intent.ACTION_SEARCH);
    313                 intent.putExtra(Insert.PHONE, "800");
    314                 startSearchResultActivity(intent);
    315                 break;
    316             }
    317             case SEARCH_SUGGESTION_CLICKED_CONTACT: {
    318                 long contactId = findArbitraryContactWithPhoneNumber();
    319                 if (contactId != -1) {
    320                     Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    321                     Intent intent = new Intent(Intents.SEARCH_SUGGESTION_CLICKED);
    322                     intent.setData(contactUri);
    323                     startContactListActivity(intent);
    324                 }
    325                 break;
    326             }
    327             case JOIN_CONTACT: {
    328                 // TODO
    329                 break;
    330             }
    331             case EDIT_CONTACT: {
    332                 final long contactId = findArbitraryContactWithPhoneNumber();
    333                 final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    334                 final Intent intent = new Intent(Intent.ACTION_EDIT, uri);
    335                 startActivity(intent);
    336                 break;
    337             }
    338             case EDIT_CONTACT_LOOKUP: {
    339                 final long contactId = findArbitraryContactWithPhoneNumber();
    340                 final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    341                 final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
    342                 final String lookupKey = lookupUri.getPathSegments().get(2);
    343                 final Uri lookupWithoutIdUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
    344                         lookupKey);
    345                 final Intent intent = new Intent(Intent.ACTION_EDIT, lookupWithoutIdUri);
    346                 startActivity(intent);
    347                 break;
    348             }
    349             case EDIT_CONTACT_LOOKUP_ID: {
    350                 final long contactId = findArbitraryContactWithPhoneNumber();
    351                 final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    352                 final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
    353                 final Intent intent = new Intent(Intent.ACTION_EDIT, lookupUri);
    354                 startActivity(intent);
    355                 break;
    356             }
    357             case EDIT_RAW_CONTACT: {
    358                 final long contactId = findArbitraryContactWithPhoneNumber();
    359                 final long rawContactId = findArbitraryRawContactOfContact(contactId);
    360                 final Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
    361                 final Intent intent = new Intent(Intent.ACTION_EDIT, uri);
    362                 startActivity(intent);
    363                 break;
    364             }
    365             case EDIT_LEGACY: {
    366                 final Uri legacyContentUri = Uri.parse("content://contacts/people");
    367                 final long contactId = findArbitraryContactWithPhoneNumber();
    368                 final long rawContactId = findArbitraryRawContactOfContact(contactId);
    369                 final Uri uri = ContentUris.withAppendedId(legacyContentUri, rawContactId);
    370                 final Intent intent = new Intent(Intent.ACTION_EDIT, uri);
    371                 startActivity(intent);
    372                 break;
    373             }
    374             case EDIT_NEW_CONTACT: {
    375                 startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
    376                 break;
    377             }
    378             case EDIT_NEW_CONTACT_WITH_DATA: {
    379                 Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
    380 
    381                 putDataExtra(intent);
    382 
    383                 startActivity(intent);
    384                 break;
    385             }
    386             case EDIT_NEW_CONTACT_FOR_ACCOUNT:
    387             case EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA: {
    388                 final SelectAccountDialogFragment dialog = new SelectAccountDialogFragment();
    389                 dialog.setArguments(SelectAccountDialogFragment.createBundle(position));
    390                 dialog.show(getFragmentManager(), SelectAccountDialogFragment.TAG);
    391                 break;
    392             }
    393             case EDIT_NEW_RAW_CONTACT: {
    394                 startActivity(new Intent(Intent.ACTION_INSERT, RawContacts.CONTENT_URI));
    395                 break;
    396             }
    397             case EDIT_NEW_LEGACY: {
    398                 final Uri legacyContentUri = Uri.parse("content://contacts/people");
    399                 startActivity(new Intent(Intent.ACTION_INSERT, legacyContentUri));
    400                 break;
    401             }
    402             case VIEW_CONTACT: {
    403                 final long contactId = findArbitraryContactWithPhoneNumber();
    404                 final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    405                 final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    406                 startActivity(intent);
    407                 break;
    408             }
    409             case VIEW_CONTACT_WITHOUT_ID: {
    410                 startActivity(new Intent(Intent.ACTION_VIEW, Contacts.CONTENT_URI));
    411                 break;
    412             }
    413             case VIEW_CONTACT_LOOKUP: {
    414                 final long contactId = findArbitraryContactWithPhoneNumber();
    415                 final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    416                 final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
    417                 final String lookupKey = lookupUri.getPathSegments().get(2);
    418                 final Uri lookupWithoutIdUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
    419                         lookupKey);
    420                 final Intent intent = new Intent(Intent.ACTION_VIEW, lookupWithoutIdUri);
    421                 startActivity(intent);
    422                 break;
    423             }
    424             case VIEW_CONTACT_LOOKUP_ID: {
    425                 final long contactId = findArbitraryContactWithPhoneNumber();
    426                 final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    427                 final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri);
    428                 final Intent intent = new Intent(Intent.ACTION_VIEW, lookupUri);
    429                 startActivity(intent);
    430                 break;
    431             }
    432             case VIEW_RAW_CONTACT: {
    433                 final long contactId = findArbitraryContactWithPhoneNumber();
    434                 final long rawContactId = findArbitraryRawContactOfContact(contactId);
    435                 final Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
    436                 final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    437                 startActivity(intent);
    438                 break;
    439             }
    440             case VIEW_LEGACY: {
    441                 final Uri legacyContentUri = Uri.parse("content://contacts/people");
    442                 final long contactId = findArbitraryContactWithPhoneNumber();
    443                 final long rawContactId = findArbitraryRawContactOfContact(contactId);
    444                 final Uri uri = ContentUris.withAppendedId(legacyContentUri, rawContactId);
    445                 final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    446                 startActivity(intent);
    447                 break;
    448             }
    449             case DIAL: {
    450                 startActivity(new Intent(Intent.ACTION_DIAL));
    451                 break;
    452             }
    453             case DIAL_phone: {
    454                 // This is the legacy URI (there is no >2.0 way to call a phone data item)
    455                 final long dataId = findArbitraryPhoneDataId();
    456                 if (dataId != -1) {
    457                     final Uri legacyContentUri = Uri.parse("content://contacts/phones");
    458                     final Uri uri = ContentUris.withAppendedId(legacyContentUri, dataId);
    459                     startActivity(new Intent(Intent.ACTION_DIAL, uri));
    460                 }
    461                 break;
    462             }
    463             case DIAL_person: {
    464                 // This is the legacy URI (there is no >2.0 way to call a person)
    465                 final long contactId = findArbitraryContactWithPhoneNumber();
    466                 if (contactId != -1) {
    467                     final Uri legacyContentUri = Uri.parse("content://contacts/people");
    468                     final long rawContactId = findArbitraryRawContactOfContact(contactId);
    469                     final Uri uri = ContentUris.withAppendedId(legacyContentUri, rawContactId);
    470                     startActivity(new Intent(Intent.ACTION_DIAL, uri));
    471                 }
    472                 break;
    473             }
    474             case DIAL_voicemail: {
    475                 startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("voicemail:")));
    476                 break;
    477             }
    478             case CALL_BUTTON: {
    479                 startActivity(new Intent(Intent.ACTION_CALL_BUTTON));
    480                 break;
    481             }
    482             case DIAL_tel: {
    483                 startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-123-4567")));
    484                 break;
    485             }
    486             case VIEW_tel: {
    487                 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("tel:555-123-4567")));
    488                 break;
    489             }
    490             case VIEW_calllog: {
    491                 final Intent intent = new Intent(Intent.ACTION_VIEW, null);
    492                 intent.setType("vnd.android.cursor.dir/calls");
    493                 startActivity(intent);
    494                 break;
    495             }
    496             case VIEW_calllog_entry: {
    497                 Uri uri = getCallLogUri();
    498                 if (uri == null) {
    499                     Toast.makeText(this, "Call log is empty", Toast.LENGTH_LONG).show();
    500                     break;
    501                 }
    502                 final Intent intent = new Intent(Intent.ACTION_VIEW);
    503                 intent.setData(uri);
    504                 startActivity(intent);
    505                 break;
    506             }
    507             case LEGACY_CALL_DETAILS_ACTIVITY: {
    508                 Uri uri = getCallLogUri();
    509                 if (uri == null) {
    510                     Toast.makeText(this, "Call log is empty", Toast.LENGTH_LONG).show();
    511                     break;
    512                 }
    513                 final Intent intent = new Intent("android.intent.action.VIEW");
    514                 intent.setData(uri);
    515                 bindIntentToClass(intent, "com.android.dialer.CallDetailActivity");
    516                 startActivity(intent);
    517                 break;
    518             }
    519             case LEGACY_CALL_LOG_ACTIVITY: {
    520                 startActivity(bindIntentToClass(new Intent(),
    521                         "com.android.contacts.activities.CallLogActivity"));
    522                 break;
    523             }
    524 
    525             default: {
    526                 Toast.makeText(this, "Sorry, we forgot to write this...", Toast.LENGTH_LONG).show();
    527             }
    528         }
    529     }
    530 
    531     /** Returns the URI of one of the items in the call log, or null if the call log is empty. */
    532     private Uri getCallLogUri() {
    533         Cursor cursor = getContentResolver().query(
    534                 Calls.CONTENT_URI, new String[]{ Calls._ID }, null, null,
    535                 Calls.DEFAULT_SORT_ORDER);
    536         if (!cursor.moveToNext()) {
    537             return null;
    538         }
    539         return ContentUris.withAppendedId(Calls.CONTENT_URI, cursor.getLong(0));
    540     }
    541 
    542     /** Creates an intent that is bound to a specific activity by name. */
    543     private Intent bindIntentToClass(Intent intent, String activityClassName) {
    544         intent.setComponent(new ComponentName(ANDROID_CONTACTS_PACKAGE, activityClassName));
    545         return intent;
    546     }
    547 
    548     private Intent buildFilterIntent(int actionCode, boolean legacy) {
    549         Intent intent = new Intent(UI.FILTER_CONTACTS_ACTION);
    550         intent.putExtra(UI.FILTER_TEXT_EXTRA_KEY, "A");
    551 //        ContactsRequest request = new ContactsRequest();
    552 //        request.setActionCode(actionCode);
    553 //        intent.putExtra("originalRequest", request);
    554         return intent;
    555     }
    556 
    557     private void startContactListActivity(Intent intent) {
    558         bindIntentToClass(intent, CONTACT_LIST_ACTIVITY_CLASS_NAME);
    559         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    560         startActivity(intent);
    561     }
    562 
    563     private void startContactSelectionActivityForResult(Intent intent) {
    564         startActivityForResult(intent, 12);
    565     }
    566 
    567     private void startSearchResultActivity(Intent intent) {
    568         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    569         startActivity(intent);
    570     }
    571 
    572     @Override
    573     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    574         Intent intent = new Intent(this, ResultActivity.class);
    575         intent.putExtra("resultCode", resultCode);
    576         intent.putExtra("data", data);
    577         startActivity(intent);
    578     }
    579 
    580     private long findArbitraryContactWithPhoneNumber() {
    581         final Cursor cursor = getContentResolver().query(Contacts.CONTENT_URI,
    582                 new String[] { Contacts._ID },
    583                 Contacts.HAS_PHONE_NUMBER + "!=0 AND " + Contacts.STARRED + "!=0" ,
    584                 null, "RANDOM() LIMIT 1");
    585         try {
    586             if (cursor.moveToFirst()) {
    587                 return cursor.getLong(0);
    588             }
    589         } finally {
    590             cursor.close();
    591         }
    592 
    593         return -1;
    594     }
    595 
    596     private long findArbitraryPhoneDataId() {
    597         final Cursor cursor = getContentResolver().query(Data.CONTENT_URI,
    598                 new String[] { Data._ID },
    599                 Data.MIMETYPE + "=" + Phone.MIMETYPE,
    600                 null, "RANDOM() LIMIT 1");
    601         try {
    602             if (cursor.moveToFirst()) {
    603                 return cursor.getLong(0);
    604             }
    605         } finally {
    606             cursor.close();
    607         }
    608 
    609         return -1;
    610     }
    611 
    612     private long findArbitraryRawContactOfContact(long contactId) {
    613         final Cursor cursor = getContentResolver().query(RawContacts.CONTENT_URI,
    614                 new String[] { RawContacts._ID },
    615                 RawContacts.CONTACT_ID + "=?",
    616                 new String[] { String.valueOf(contactId) },
    617                 RawContacts._ID + " LIMIT 1");
    618         try {
    619             if (cursor.moveToFirst()) {
    620                 return cursor.getLong(0);
    621             }
    622         } finally {
    623             cursor.close();
    624         }
    625 
    626         return -1;
    627     }
    628 
    629     @Override
    630     public void onAccountChosen(Account account, String dataSet, int tag) {
    631         switch (ContactsIntent.get(tag)) {
    632             case EDIT_NEW_CONTACT_FOR_ACCOUNT: {
    633                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
    634                 intent.putExtra(Insert.ACCOUNT, account);
    635                 intent.putExtra(Insert.DATA_SET, dataSet);
    636                 startActivity(intent);
    637                 break;
    638             }
    639             case EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA: {
    640                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
    641 
    642                 intent.putExtra(Insert.ACCOUNT, account);
    643                 intent.putExtra(Insert.DATA_SET, dataSet);
    644                 putDataExtra(intent);
    645 
    646                 startActivity(intent);
    647                 break;
    648             }
    649             default:
    650                 break;
    651         }
    652     }
    653 
    654     public void putDataExtra(final Intent intent) {
    655         ContentValues row1 = new ContentValues();
    656         row1.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
    657         row1.put(Organization.COMPANY, "Android");
    658 
    659         ContentValues row2 = new ContentValues();
    660         row2.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
    661         row2.put(Email.TYPE, Email.TYPE_CUSTOM);
    662         row2.put(Email.LABEL, "Green Bot");
    663         row2.put(Email.ADDRESS, "android (at) android.com");
    664 
    665         intent.putParcelableArrayListExtra(Insert.DATA, Lists.newArrayList(row1, row2));
    666     }
    667 }
    668