Fixing the "add contact from call log" flow involving search.
Bug: 2310010
Change-Id: I31bd5a62e47a23d2c2236205967a5fd7e891a1e6
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 8ca53cb..527a2e5 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -236,7 +236,8 @@
static final int MODE_LEGACY_PICK_OR_CREATE_PERSON = 44 | MODE_MASK_PICKER
| MODE_MASK_CREATE_NEW | MODE_MASK_DISABLE_QUIKCCONTACT;
/** Show all contacts and pick them when clicking, and allow creating a new contact */
- static final int MODE_INSERT_OR_EDIT_CONTACT = 45 | MODE_MASK_PICKER | MODE_MASK_CREATE_NEW;
+ static final int MODE_INSERT_OR_EDIT_CONTACT = 45 | MODE_MASK_PICKER | MODE_MASK_CREATE_NEW
+ | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_QUIKCCONTACT;
/** Show all phone numbers and pick them when clicking */
static final int MODE_PICK_PHONE = 50 | MODE_MASK_PICKER | MODE_MASK_NO_PRESENCE;
/** Show all phone numbers through the legacy provider and pick them when clicking */
@@ -268,11 +269,15 @@
static final int MODE_QUERY_PICK_PHONE = 80 | MODE_MASK_NO_FILTER | MODE_MASK_PICKER
| MODE_MASK_SHOW_NUMBER_OF_CONTACTS;
+ /** Run a search query in PICK mode, but that still launches to EDIT */
+ static final int MODE_QUERY_PICK_TO_EDIT = 85 | MODE_MASK_NO_FILTER | MODE_MASK_SHOW_PHOTOS
+ | MODE_MASK_PICKER | MODE_MASK_SHOW_NUMBER_OF_CONTACTS;
+
/**
* An action used to do perform search while in a contact picker. It is initiated
* by the ContactListActivity itself.
*/
- private static final String ACTION_SEARCH_FOR_SHORTCUT = "com.android.contacts.INTERNAL_SEARCH";
+ private static final String ACTION_SEARCH_INTERNAL = "com.android.contacts.INTERNAL_SEARCH";
/** Maximum number of suggestions shown for joining aggregates */
static final int MAX_SUGGESTIONS = 4;
@@ -684,19 +689,28 @@
mShowSearchSnippets = true;
mInitialFilter = getIntent().getStringExtra(SearchManager.QUERY);
}
- } else if (ACTION_SEARCH_FOR_SHORTCUT.equals(action)) {
- // The search request has extras to specify query
+ } else if (ACTION_SEARCH_INTERNAL.equals(action)) {
+ String originalAction = null;
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ originalAction = extras.getString(ContactsSearchManager.ORIGINAL_ACTION_EXTRA_KEY);
+ }
mShortcutAction = intent.getStringExtra(SHORTCUT_ACTION_KEY);
- if (intent.hasExtra(Insert.PHONE)) {
+
+ if (Intent.ACTION_INSERT_OR_EDIT.equals(originalAction)) {
+ mMode = MODE_QUERY_PICK_TO_EDIT;
+ mShowSearchSnippets = true;
+ mInitialFilter = getIntent().getStringExtra(SearchManager.QUERY);
+ } else if (mShortcutAction != null && intent.hasExtra(Insert.PHONE)) {
mMode = MODE_QUERY_PICK_PHONE;
mQueryMode = QUERY_MODE_TEL;
mInitialFilter = intent.getStringExtra(Insert.PHONE);
} else {
mMode = MODE_QUERY_PICK;
mQueryMode = QUERY_MODE_NONE;
+ mShowSearchSnippets = true;
mInitialFilter = getIntent().getStringExtra(SearchManager.QUERY);
}
-
// Since this is the filter activity it receives all intents
// dispatched from the SearchManager for security reasons
// so we need to re-dispatch from here to the intended target.
@@ -904,7 +918,9 @@
empty.setText(getText(R.string.noContactsWithPhoneNumbers));
} else if (mMode == MODE_STREQUENT || mMode == MODE_STARRED) {
empty.setText(getText(R.string.noFavoritesHelpText));
- } else if (mMode == MODE_QUERY) {
+ } else if (mMode == MODE_QUERY || mMode == MODE_QUERY_PICK
+ || mMode == MODE_QUERY_PICK_PHONE || mMode == MODE_QUERY_PICK_TO_VIEW
+ || mMode == MODE_QUERY_PICK_TO_EDIT) {
empty.setText(getText(R.string.noMatchingContacts));
} else {
boolean hasSim = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE))
@@ -1121,9 +1137,15 @@
}
Intent intent = new Intent(this, ContactsListActivity.class);
+ Intent originalIntent = getIntent();
+ Bundle originalExtras = originalIntent.getExtras();
+ if (originalExtras != null) {
+ intent.putExtras(originalExtras);
+ }
+
intent.putExtra(SearchManager.QUERY, query);
if ((mMode & MODE_MASK_PICKER) != 0) {
- intent.setAction(ACTION_SEARCH_FOR_SHORTCUT);
+ intent.setAction(ACTION_SEARCH_INTERNAL);
intent.putExtra(SHORTCUT_ACTION_KEY, mShortcutAction);
if (mShortcutAction != null) {
if (Intent.ACTION_CALL.equals(mShortcutAction)
@@ -1603,24 +1625,21 @@
protected void onListItemClick(ListView l, View v, int position, long id) {
hideSoftKeyboard();
- if (mMode == MODE_INSERT_OR_EDIT_CONTACT) {
+ if (mSearchMode && mAdapter.isSearchAllContactsItemPosition(position)) {
+ doSearch();
+ } else if (mMode == MODE_INSERT_OR_EDIT_CONTACT || mMode == MODE_QUERY_PICK_TO_EDIT) {
Intent intent;
- if (position == 0) {
+ if (position == 0 && !mSearchMode && mMode != MODE_QUERY_PICK_TO_EDIT) {
intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
} else {
- // Edit. adjusting position by subtracting header view count.
- position -= getListView().getHeaderViewsCount();
- final Uri uri = getSelectedUri(position);
- intent = new Intent(Intent.ACTION_EDIT, uri);
+ intent = new Intent(Intent.ACTION_EDIT, getSelectedUri(position));
}
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
Bundle extras = getIntent().getExtras();
-
- if (extras == null) {
- extras = new Bundle();
+ if (extras != null) {
+ intent.putExtras(extras);
}
- intent.putExtras(extras);
- extras.putBoolean(KEY_PICKER_MODE, (mMode & MODE_MASK_PICKER) == MODE_MASK_PICKER);
+ intent.putExtra(KEY_PICKER_MODE, (mMode & MODE_MASK_PICKER) == MODE_MASK_PICKER);
startActivity(intent);
finish();
@@ -1631,8 +1650,6 @@
} else if (mMode == MODE_JOIN_CONTACT && id == JOIN_MODE_SHOW_ALL_CONTACTS_ID) {
mJoinModeShowAllContacts = false;
startQuery();
- } else if (mSearchMode && mAdapter.isSearchAllContactsItemPosition(position)) {
- doSearch();
} else if (id > 0) {
final Uri uri = getSelectedUri(position);
if ((mMode & MODE_MASK_PICKER) == 0) {
@@ -1924,7 +1941,8 @@
return CONTACTS_CONTENT_URI_WITH_LETTER_COUNTS;
}
case MODE_QUERY:
- case MODE_QUERY_PICK: {
+ case MODE_QUERY_PICK:
+ case MODE_QUERY_PICK_TO_EDIT: {
return getContactFilterUri(mInitialFilter);
}
case MODE_QUERY_PICK_PHONE: {
@@ -2016,7 +2034,8 @@
: CONTACTS_SUMMARY_PROJECTION;
}
case MODE_QUERY:
- case MODE_QUERY_PICK: {
+ case MODE_QUERY_PICK:
+ case MODE_QUERY_PICK_TO_EDIT: {
return CONTACTS_SUMMARY_FILTER_PROJECTION;
}
case MODE_LEGACY_PICK_PERSON:
@@ -2197,7 +2216,8 @@
case MODE_QUERY:
case MODE_QUERY_PICK:
case MODE_QUERY_PICK_PHONE:
- case MODE_QUERY_PICK_TO_VIEW: {
+ case MODE_QUERY_PICK_TO_VIEW:
+ case MODE_QUERY_PICK_TO_EDIT: {
mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, null, null,
getSortOrder(projection));
break;
@@ -2612,12 +2632,12 @@
@Override
public boolean isEmpty() {
- if ((mMode & MODE_MASK_CREATE_NEW) == MODE_MASK_CREATE_NEW) {
+ if (mSearchMode) {
+ return TextUtils.isEmpty(getTextFilter());
+ } else if ((mMode & MODE_MASK_CREATE_NEW) == MODE_MASK_CREATE_NEW) {
// This mode mask adds a header and we always want it to show up, even
// if the list is empty, so always claim the list is not empty.
return false;
- } else if (mSearchMode) {
- return TextUtils.isEmpty(getTextFilter());
} else {
if (mCursor == null || mLoading) {
// We don't want the empty state to show when loading.
@@ -2722,7 +2742,8 @@
String text;
int count = getRealCount();
- if (mMode == MODE_QUERY || mMode == MODE_QUERY_PICK || mMode == MODE_QUERY_PICK_PHONE) {
+ if (mMode == MODE_QUERY || mMode == MODE_QUERY_PICK || mMode == MODE_QUERY_PICK_PHONE
+ || mMode == MODE_QUERY_PICK_TO_EDIT) {
text = getQuantityText(count, R.string.listFoundAllContactsZero,
R.plurals.listFoundAllContacts);
} else if (mSearchMode && !TextUtils.isEmpty(getTextFilter())) {
@@ -2920,7 +2941,9 @@
presenceView.setVisibility(View.GONE);
}
- if (mShowSearchSnippets) {
+ // TODO: make sure that when mShowSearchSnippets is true, the
+ // snippet views are available
+ if (mShowSearchSnippets && cache.snippetLabelView != null) {
boolean showSnippet = false;
String snippetMimeType = cursor.getString(SUMMARY_SNIPPET_MIMETYPE_COLUMN_INDEX);
String snippetValue = cursor.getString(SUMMARY_SNIPPET_DATA_COLUMN_INDEX);
@@ -3167,7 +3190,7 @@
pos--;
}
- if ((mMode & MODE_MASK_CREATE_NEW) != 0) {
+ if ((mMode & MODE_MASK_CREATE_NEW) != 0 && !mSearchMode) {
return pos - 1;
} else if (mSuggestionsCursorCount != 0) {
// When showing suggestions, we have 2 additional list items: the "Suggestions"
diff --git a/src/com/android/contacts/ContactsSearchManager.java b/src/com/android/contacts/ContactsSearchManager.java
index 8f42c3a..d65e079 100644
--- a/src/com/android/contacts/ContactsSearchManager.java
+++ b/src/com/android/contacts/ContactsSearchManager.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.content.Intent;
+import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Intents.UI;
@@ -54,10 +55,15 @@
Intent intent = new Intent();
intent.setData(ContactsContract.Contacts.CONTENT_URI);
intent.setAction(UI.FILTER_CONTACTS_ACTION);
+
+ Intent originalIntent = context.getIntent();
+ Bundle originalExtras = originalIntent.getExtras();
+ if (originalExtras != null) {
+ intent.putExtras(originalExtras);
+ }
intent.putExtra(UI.FILTER_TEXT_EXTRA_KEY, initialQuery);
- intent.putExtra(ORIGINAL_ACTION_EXTRA_KEY, context.getIntent().getAction());
- intent.putExtra(ORIGINAL_COMPONENT_EXTRA_KEY,
- context.getIntent().getComponent().getClassName());
+ intent.putExtra(ORIGINAL_ACTION_EXTRA_KEY, originalIntent.getAction());
+ intent.putExtra(ORIGINAL_COMPONENT_EXTRA_KEY, originalIntent.getComponent().getClassName());
return intent;
}
}