diff options
Diffstat (limited to 'src/com/android/contacts/activities/PeopleActivity.java')
-rw-r--r-- | src/com/android/contacts/activities/PeopleActivity.java | 298 |
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; } } |