summaryrefslogtreecommitdiffstats
path: root/src/com/android/contacts/activities/PeopleActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/contacts/activities/PeopleActivity.java')
-rw-r--r--src/com/android/contacts/activities/PeopleActivity.java298
1 files changed, 294 insertions, 4 deletions
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 97c6ea028..bad3f6996 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -16,12 +16,15 @@
package com.android.contacts.activities;
+import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ActivityNotFoundException;
import android.content.ContentUris;
import android.content.Context;
+import android.content.BroadcastReceiver;
+import android.content.IntentFilter;
import android.content.Intent;
import android.graphics.Rect;
import android.net.Uri;
@@ -33,6 +36,7 @@ import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.ProviderStatus;
import android.provider.Settings;
+import android.preference.PreferenceManager;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
@@ -59,8 +63,14 @@ import com.android.contacts.common.dialog.ClearFrequentsDialog;
import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.common.widget.FloatingActionButtonController;
import com.android.contacts.editor.EditorIntents;
+import com.android.contacts.common.editor.SelectAccountDialogFragment;
+import com.android.contacts.group.GroupBrowseListFragment;
+import com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener;
+import com.android.contacts.group.GroupDetailFragment;
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.common.interactions.ImportExportDialogFragment;
+import com.android.contacts.common.interactions.ImportExportDialogFragment.ExportToSimThread;
+import com.android.contacts.common.list.AccountFilterActivity;
import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.ContactListFilterController;
@@ -82,17 +92,24 @@ import com.android.contacts.list.OnContactsUnavailableActionListener;
import com.android.contacts.list.ProviderStatusWatcher;
import com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
import com.android.contacts.common.list.ViewPagerTabs;
+import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.preference.ContactsPreferenceActivity;
+import com.android.contacts.common.SimContactsConstants;
import com.android.contacts.common.util.AccountFilterUtil;
import com.android.contacts.common.util.ViewUtil;
import com.android.contacts.quickcontact.QuickContactActivity;
import com.android.contacts.util.AccountPromptUtils;
import com.android.contacts.common.util.Constants;
+import com.android.contacts.common.vcard.ExportVCardActivity;
+import com.android.contacts.common.vcard.VCardCommonArguments;
import com.android.contacts.util.DialogManager;
import com.android.contactsbind.HelpUtils;
import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Locale;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -110,11 +127,13 @@ public class PeopleActivity extends ContactsActivity implements
private static final String TAG = "PeopleActivity";
+ public static String EDITABLE_KEY = "search_contacts";
private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
// These values needs to start at 2. See {@link ContactEntryListFragment}.
private static final int SUBACTIVITY_ACCOUNT_FILTER = 2;
-
+ private static final int SUBACTIVITY_NEW_GROUP = 4;
+ private static final int SUBACTIVITY_EDIT_GROUP = 5;
private final DialogManager mDialogManager = new DialogManager(this);
private ContactsIntentResolver mIntentResolver;
@@ -122,6 +141,9 @@ public class PeopleActivity extends ContactsActivity implements
private ActionBarAdapter mActionBarAdapter;
private FloatingActionButtonController mFloatingActionButtonController;
+ private GroupDetailFragment mGroupDetailFragment;
+ private final GroupDetailFragmentListener mGroupDetailFragmentListener =
+ new GroupDetailFragmentListener();
private View mFloatingActionButtonContainer;
private boolean wasLastFabAnimationScaleIn = false;
@@ -141,6 +163,7 @@ public class PeopleActivity extends ContactsActivity implements
*/
private MultiSelectContactsListFragment mAllFragment;
private ContactTileListFragment mFavoritesFragment;
+ private GroupBrowseListFragment mGroupsFragment;
/** ViewPager for swipe */
private ViewPager mTabPager;
@@ -151,6 +174,7 @@ public class PeopleActivity extends ContactsActivity implements
private boolean mEnableDebugMenuOptions;
+ private ExportToSimThread mExportThread = null;
/**
* True if this activity instance is a re-created one. i.e. set true after orientation change.
* This is set in {@link #onCreate} for later use in {@link #onStart}.
@@ -173,6 +197,11 @@ public class PeopleActivity extends ContactsActivity implements
/** Sequential ID assigned to each instance; used for logging */
private final int mInstanceId;
private static final AtomicInteger sNextInstanceId = new AtomicInteger();
+ // TODO: we need to refactor the export code in future release.
+ // QRD enhancement: contacts list for multi contact pick
+ private ArrayList<String[]> mContactList;
+
+ private BroadcastReceiver mExportToSimCompleteListener = null;
public PeopleActivity() {
mInstanceId = sNextInstanceId.getAndIncrement();
@@ -247,6 +276,7 @@ public class PeopleActivity extends ContactsActivity implements
Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish");
}
getWindow().setBackgroundDrawable(null);
+ registerReceiver();
}
@Override
@@ -266,6 +296,21 @@ public class PeopleActivity extends ContactsActivity implements
invalidateOptionsMenuIfNeeded();
}
+ private void registerReceiver() {
+ mExportToSimCompleteListener = new BroadcastReceiver() {
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(SimContactsConstants.INTENT_EXPORT_COMPLETE)) {
+ ImportExportDialogFragment.destroyExportToSimThread();
+ mExportThread = null;
+ }
+ }
+ };
+ IntentFilter exportCompleteFilter = new IntentFilter(
+ SimContactsConstants.INTENT_EXPORT_COMPLETE);
+ registerReceiver(mExportToSimCompleteListener, exportCompleteFilter);
+ }
+
/**
* Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect
* is needed.
@@ -311,6 +356,7 @@ public class PeopleActivity extends ContactsActivity implements
mTabTitles = new String[TabState.COUNT];
mTabTitles[TabState.FAVORITES] = getString(R.string.favorites_tab_label);
mTabTitles[TabState.ALL] = getString(R.string.all_contacts_tab_label);
+ mTabTitles[TabState.GROUPS] = getString(R.string.contacts_groups_label);
mTabPager = getView(R.id.tab_pager);
mTabPagerAdapter = new TabPagerAdapter();
mTabPager.setAdapter(mTabPagerAdapter);
@@ -333,6 +379,7 @@ public class PeopleActivity extends ContactsActivity implements
final String FAVORITE_TAG = "tab-pager-favorite";
final String ALL_TAG = "tab-pager-all";
+ final String GROUPS_TAG = "tab-pager-groups";
// Create the fragments and add as children of the view pager.
// The pager adapter will only change the visibility; it'll never create/destroy
@@ -344,13 +391,17 @@ public class PeopleActivity extends ContactsActivity implements
fragmentManager.findFragmentByTag(FAVORITE_TAG);
mAllFragment = (MultiSelectContactsListFragment)
fragmentManager.findFragmentByTag(ALL_TAG);
+ mGroupsFragment = (GroupBrowseListFragment)
+ fragmentManager.findFragmentByTag(GROUPS_TAG);
if (mFavoritesFragment == null) {
mFavoritesFragment = new ContactTileListFragment();
mAllFragment = new MultiSelectContactsListFragment();
+ mGroupsFragment = new GroupBrowseListFragment();
transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG);
transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
+ transaction.add(R.id.tab_pager, mGroupsFragment, GROUPS_TAG);
}
mFavoritesFragment.setListener(mFavoritesFragmentListener);
@@ -358,10 +409,13 @@ public class PeopleActivity extends ContactsActivity implements
mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
mAllFragment.setCheckBoxListListener(new CheckBoxListListener());
+ mGroupsFragment.setListener(new GroupBrowserActionListener());
+
// Hide all fragments for now. We adjust visibility when we get onSelectedTabChanged()
// from ActionBarAdapter.
transaction.hide(mFavoritesFragment);
transaction.hide(mAllFragment);
+ transaction.hide(mGroupsFragment);
transaction.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
@@ -417,6 +471,8 @@ public class PeopleActivity extends ContactsActivity implements
mOptionsMenuContactsAvailable = false;
mProviderStatusWatcher.stop();
super.onPause();
+ dismissDialog(ImportExportDialogFragment.TAG);
+ dismissDialog(SelectAccountDialogFragment.TAG);
}
@Override
@@ -451,9 +507,22 @@ public class PeopleActivity extends ContactsActivity implements
mContactListFilterController.removeListener(this);
}
+ if (mExportToSimCompleteListener != null) {
+ unregisterReceiver(mExportToSimCompleteListener);
+ }
super.onDestroy();
}
+ private void dismissDialog(String tag) {
+ // when this activity lose focus,dismiss the dialog
+ Fragment dialogFragment = getFragmentManager().findFragmentByTag(tag);
+ if (dialogFragment != null) {
+ if (dialogFragment instanceof DialogFragment) {
+ ((DialogFragment) dialogFragment).dismiss();
+ }
+ }
+ }
+
private void configureFragments(boolean fromRequest) {
if (fromRequest) {
ContactListFilter filter = null;
@@ -480,6 +549,9 @@ public class PeopleActivity extends ContactsActivity implements
case ContactsRequest.ACTION_VIEW_CONTACT:
tabToOpen = TabState.ALL;
break;
+ case ContactsRequest.ACTION_GROUP:
+ tabToOpen = TabState.GROUPS;
+ break;
default:
tabToOpen = -1;
break;
@@ -502,6 +574,7 @@ public class PeopleActivity extends ContactsActivity implements
}
configureContactListFragment();
+ configureGroupListFragment();
invalidateOptionsMenuIfNeeded();
}
@@ -621,6 +694,9 @@ public class PeopleActivity extends ContactsActivity implements
}
invalidateOptionsMenu();
showEmptyStateForTab(tab);
+ if (tab == TabState.GROUPS) {
+ mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
+ }
}
private void showEmptyStateForTab(int tab) {
@@ -630,6 +706,10 @@ public class PeopleActivity extends ContactsActivity implements
mContactsUnavailableFragment.setMessageText(
R.string.listTotalAllContactsZeroStarred, -1);
break;
+ case TabState.GROUPS:
+ mContactsUnavailableFragment.setMessageText(R.string.noGroups,
+ areGroupWritableAccountsAvailable() ? -1 : R.string.noAccounts);
+ break;
case TabState.ALL:
mContactsUnavailableFragment.setMessageText(R.string.noContacts, -1);
break;
@@ -678,6 +758,9 @@ public class PeopleActivity extends ContactsActivity implements
mActionBarAdapter.setCurrentTab(position, false);
mViewPagerTabs.onPageSelected(position);
showEmptyStateForTab(position);
+ if (position == TabState.GROUPS) {
+ mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
+ }
invalidateOptionsMenu();
}
}
@@ -736,6 +819,9 @@ public class PeopleActivity extends ContactsActivity implements
if (object == mAllFragment) {
return getTabPositionForTextDirection(TabState.ALL);
}
+ if (object == mGroupsFragment) {
+ return TabState.GROUPS;
+ }
}
return POSITION_NONE;
}
@@ -759,6 +845,8 @@ public class PeopleActivity extends ContactsActivity implements
return mFavoritesFragment;
} else if (position == TabState.ALL) {
return mAllFragment;
+ } else if (position == TabState.GROUPS) {
+ return mGroupsFragment;
}
}
throw new IllegalArgumentException("position: " + position);
@@ -866,6 +954,11 @@ public class PeopleActivity extends ContactsActivity implements
return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL;
}
+ private void configureGroupListFragment() {
+ mGroupsFragment.setVerticalScrollbarPosition(getScrollBarPosition());
+ mGroupsFragment.setSelectionVisible(false);
+ }
+
@Override
public void onProviderStatusChange() {
updateViewConfiguration(false);
@@ -1040,6 +1133,67 @@ public class PeopleActivity extends ContactsActivity implements
}
}
+ private final class GroupBrowserActionListener implements OnGroupBrowserActionListener {
+
+ GroupBrowserActionListener() {}
+
+ @Override
+ public void onViewGroupAction(Uri groupUri) {
+ Intent intent = new Intent(PeopleActivity.this, GroupDetailActivity.class);
+ intent.setData(groupUri);
+ startActivity(intent);
+ }
+ }
+
+ private class GroupDetailFragmentListener implements GroupDetailFragment.Listener {
+
+ GroupDetailFragmentListener() {}
+
+ @Override
+ public void onGroupSizeUpdated(String size) {
+ // Nothing needs to be done here because the size will be displayed in the detail
+ // fragment
+ }
+
+ @Override
+ public void onGroupTitleUpdated(String title) {
+ // Nothing needs to be done here because the title will be displayed in the detail
+ // fragment
+ }
+
+ @Override
+ public void onAccountTypeUpdated(String accountTypeString, String dataSet) {
+ // Nothing needs to be done here because the group source will be displayed in the
+ // detail fragment
+ }
+
+ @Override
+ public void onEditRequested(Uri groupUri) {
+ final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class);
+ intent.setData(groupUri);
+ intent.setAction(Intent.ACTION_EDIT);
+ startActivityForResult(intent, SUBACTIVITY_EDIT_GROUP);
+ }
+
+ @Override
+ public void onContactSelected(Uri contactUri) {
+ // Nothing needs to be done here because either quickcontact will be displayed
+ // or activity will take care of selection
+ }
+ }
+
+ public void startActivityAndForwardResult(final Intent intent) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+
+ // Forward extras to the new activity
+ Bundle extras = getIntent().getExtras();
+ if (extras != null) {
+ intent.putExtras(extras);
+ }
+ startActivity(intent);
+ finish();
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!areContactsAvailable()) {
@@ -1069,6 +1223,10 @@ public class PeopleActivity extends ContactsActivity implements
return true;
}
+ if (mGroupDetailFragment != null && mGroupDetailFragment.isOptionsMenuChanged()) {
+ return true;
+ }
+
return false;
}
@@ -1081,25 +1239,39 @@ public class PeopleActivity extends ContactsActivity implements
// Get references to individual menu items in the menu
final MenuItem contactsFilterMenu = menu.findItem(R.id.menu_contacts_filter);
+ MenuItem addGroupMenu = menu.findItem(R.id.menu_add_group);
final MenuItem clearFrequentsMenu = menu.findItem(R.id.menu_clear_frequents);
final MenuItem helpMenu = menu.findItem(R.id.menu_help);
final boolean isSearchOrSelectionMode = mActionBarAdapter.isSearchMode()
|| mActionBarAdapter.isSelectionMode();
if (isSearchOrSelectionMode) {
+ addGroupMenu.setVisible(false);
contactsFilterMenu.setVisible(false);
clearFrequentsMenu.setVisible(false);
helpMenu.setVisible(false);
+ makeMenuItemVisible(menu, R.id.menu_delete, false);
} else {
switch (getTabPositionForTextDirection(mActionBarAdapter.getCurrentTab())) {
case TabState.FAVORITES:
+ addGroupMenu.setVisible(false);
contactsFilterMenu.setVisible(false);
clearFrequentsMenu.setVisible(hasFrequents());
break;
case TabState.ALL:
+ addGroupMenu.setVisible(false);
contactsFilterMenu.setVisible(true);
clearFrequentsMenu.setVisible(false);
break;
+ case TabState.GROUPS:
+ // Do not display the "new group" button if no accounts are available
+ if (areGroupWritableAccountsAvailable()) {
+ addGroupMenu.setVisible(true);
+ } else {
+ addGroupMenu.setVisible(false);
+ }
+ contactsFilterMenu.setVisible(false);
+ clearFrequentsMenu.setVisible(false);
}
helpMenu.setVisible(HelpUtils.isHelpAndFeedbackAvailable());
}
@@ -1107,13 +1279,13 @@ public class PeopleActivity extends ContactsActivity implements
makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions);
makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions);
makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions);
+ makeMenuItemVisible(menu, R.id.menu_memory_status, showMiscOptions);
makeMenuItemVisible(menu, R.id.menu_settings,
showMiscOptions && !ContactsPreferenceActivity.isEmpty(this));
final boolean showSelectedContactOptions = mActionBarAdapter.isSelectionMode()
&& mAllFragment.getSelectedContactIds().size() != 0;
makeMenuItemVisible(menu, R.id.menu_share, showSelectedContactOptions);
- makeMenuItemVisible(menu, R.id.menu_delete, showSelectedContactOptions);
makeMenuItemVisible(menu, R.id.menu_join, showSelectedContactOptions);
makeMenuItemEnabled(menu, R.id.menu_join, mAllFragment.getSelectedContactIds().size() > 1);
@@ -1191,9 +1363,21 @@ public class PeopleActivity extends ContactsActivity implements
case R.id.menu_join:
joinSelectedContacts();
return true;
- case R.id.menu_delete:
- deleteSelectedContacts();
+ case R.id.menu_add_group: {
+ createNewGroup();
+ return true;
+ }
+ case R.id.menu_delete: {
+ final Intent intent = new Intent(Intent.ACTION_DELETE, Contacts.CONTENT_URI);
+ intent.putExtra(EDITABLE_KEY, mActionBarAdapter.getQueryString());
+
+ ContactListFilter filter = ContactListFilter.restoreDefaultPreferences(
+ PreferenceManager.getDefaultSharedPreferences(this));
+ intent.putExtra(AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+
+ startActivity(intent);
return true;
+ }
case R.id.menu_import_export: {
ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
PeopleActivity.class);
@@ -1221,6 +1405,12 @@ public class PeopleActivity extends ContactsActivity implements
ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
return true;
}
+
+ case R.id.menu_memory_status: {
+ final Intent intent = new Intent(this, MemoryStatusActivity.class);
+ startActivity(intent);
+ return true;
+ }
}
return false;
}
@@ -1271,6 +1461,12 @@ public class PeopleActivity extends ContactsActivity implements
mAllFragment.getSelectedContactIds());
}
+ private void createNewGroup() {
+ final Intent intent = new Intent(this, GroupEditorActivity.class);
+ intent.setAction(Intent.ACTION_INSERT);
+ startActivityForResult(intent, SUBACTIVITY_NEW_GROUP);
+ }
+
@Override
public void onDeletionFinished() {
mActionBarAdapter.setSelectionMode(false);
@@ -1284,6 +1480,14 @@ public class PeopleActivity extends ContactsActivity implements
mContactListFilterController, resultCode, data);
break;
}
+ case SUBACTIVITY_NEW_GROUP:
+ case SUBACTIVITY_EDIT_GROUP: {
+ if (resultCode == RESULT_OK) {
+ mRequest.setActionCode(ContactsRequest.ACTION_GROUP);
+ mGroupsFragment.setSelectedUri(data.getData());
+ }
+ break;
+ }
// TODO: Using the new startActivityWithResultFromFragment API this should not be needed
// anymore
@@ -1291,6 +1495,7 @@ public class PeopleActivity extends ContactsActivity implements
if (resultCode == RESULT_OK) {
mAllFragment.onPickerResult(data);
}
+ break;
// TODO fix or remove multipicker code
// else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
@@ -1299,6 +1504,91 @@ public class PeopleActivity extends ContactsActivity implements
// finish();
// }
// break;
+ case ImportExportDialogFragment.SUBACTIVITY_MULTI_PICK_CONTACT:
+ if (resultCode == RESULT_OK) {
+ mContactList = new ArrayList<String[]>();
+ Bundle b = data.getExtras();
+ Bundle choiceSet = b.getBundle(SimContactsConstants.RESULT_KEY);
+ Set<String> set = choiceSet.keySet();
+ Iterator<String> i = set.iterator();
+ while (i.hasNext()) {
+ String contactInfo[] = choiceSet.getStringArray(i.next());
+ mContactList.add(contactInfo);
+ }
+ Log.d(TAG, "return " + mContactList.size() + " contacts");
+ if (!mContactList.isEmpty()) {
+ if (!ImportExportDialogFragment.isExportingToSIM()) {
+ ImportExportDialogFragment.destroyExportToSimThread();
+ mExportThread =
+ new ImportExportDialogFragment().createExportToSimThread(
+ ImportExportDialogFragment.mExportSub, mContactList,
+ PeopleActivity.this);
+ mExportThread.start();
+ }
+ }
+ }
+ break;
+ case ImportExportDialogFragment.SUBACTIVITY_EXPORT_CONTACTS:
+ if (resultCode == RESULT_OK) {
+ Bundle result = data.getExtras().getBundle(
+ SimContactsConstants.RESULT_KEY);
+ Set<String> keySet = result.keySet();
+ Iterator<String> it = keySet.iterator();
+ StringBuilder selExportBuilder = new StringBuilder();
+ while (it.hasNext()) {
+ String id = it.next();
+ if (0 != selExportBuilder.length()) {
+ selExportBuilder.append(",");
+ }
+ selExportBuilder.append(id);
+ }
+ selExportBuilder.insert(0, "_id IN (");
+ selExportBuilder.append(")");
+ Intent exportIntent = new Intent(this,
+ ExportVCardActivity.class);
+ exportIntent.putExtra("SelExport", selExportBuilder.toString());
+ exportIntent.putExtra(
+ VCardCommonArguments.ARG_CALLING_ACTIVITY,
+ PeopleActivity.class.getName());
+ this.startActivity(exportIntent);
+ }
+ break;
+ case ImportExportDialogFragment.SUBACTIVITY_SHARE_VISILBLE_CONTACTS:
+ if (resultCode == RESULT_OK) {
+ Bundle result = data.getExtras().getBundle(
+ SimContactsConstants.RESULT_KEY);
+ StringBuilder uriListBuilder = new StringBuilder();
+ int index = 0;
+ int size = result.keySet().size();
+ // The premise of allowing to share contacts is that the
+ // amount of those contacts which have been selected to
+ // append and will be put into intent as extra data to
+ // deliver is not more that 2000, because too long arguments
+ // will cause TransactionTooLargeException in binder.
+ if (size > ImportExportDialogFragment.MAX_COUNT_ALLOW_SHARE_CONTACT) {
+ Toast.makeText(this, R.string.share_failed,
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ Iterator<String> it = result.keySet().iterator();
+ String[] values = null;
+ while (it.hasNext()) {
+ if (index != 0) {
+ uriListBuilder.append(':');
+ }
+ values = result.getStringArray(it.next());
+ uriListBuilder.append(values[0]);
+ index++;
+ }
+ Uri uri = Uri.withAppendedPath(
+ Contacts.CONTENT_MULTI_VCARD_URI,
+ Uri.encode(uriListBuilder.toString()));
+ final Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType(Contacts.CONTENT_VCARD_TYPE);
+ intent.putExtra(Intent.EXTRA_STREAM, uri);
+ startActivity(intent);
+ }
+ break;
}
}