diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index ee4b726..654263b 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -172,18 +172,17 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case android.R.id.home:
-                // Go back to previous screen, intending "cancel"
-                setResult(RESULT_CANCELED);
-                onBackPressed();
-                return true;
-            case R.id.menu_search:
-                mIsSearchMode = !mIsSearchMode;
-                configureSearchMode();
-                return true;
+        final int id = item.getItemId();
+        if (id == android.R.id.home) {// Go back to previous screen, intending "cancel"
+            setResult(RESULT_CANCELED);
+            onBackPressed();
+        } else if (id == R.id.menu_search) {
+            mIsSearchMode = !mIsSearchMode;
+            configureSearchMode();
+        } else {
+            return super.onOptionsItemSelected(item);
         }
-        return super.onOptionsItemSelected(item);
+        return true;
     }
 
     @Override
@@ -631,11 +630,9 @@
 
     @Override
     public void onFocusChange(View view, boolean hasFocus) {
-        switch (view.getId()) {
-            case R.id.search_view: {
-                if (hasFocus) {
-                    mActionBarAdapter.setFocusOnSearchView();
-                }
+        if (view.getId() == R.id.search_view) {
+            if (hasFocus) {
+                mActionBarAdapter.setFocusOnSearchView();
             }
         }
     }
@@ -654,11 +651,8 @@
 
     @Override
     public void onClick(View view) {
-        switch (view.getId()) {
-            case R.id.floating_action_button: {
-                startCreateNewContactActivity();
-                break;
-            }
+        if (view.getId() == R.id.floating_action_button) {
+            startCreateNewContactActivity();
         }
     }
 
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index c9153e1..27a355f 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -784,19 +784,19 @@
             return true;
         }
 
-        switch (item.getItemId()) {
-            case R.id.menu_save:
-                return save(SaveMode.CLOSE);
-            case R.id.menu_delete:
-                if (mListener != null) mListener.onDeleteRequested(mLookupUri);
-                return true;
-            case R.id.menu_split:
-                return doSplitContactAction();
-            case R.id.menu_join:
-                return doJoinContactAction();
-            case R.id.menu_help:
-                HelpUtils.launchHelpAndFeedbackForContactScreen(getActivity());
-                return true;
+        final int id = item.getItemId();
+        if (id == R.id.menu_save) {
+            return save(SaveMode.CLOSE);
+        } else if (id == R.id.menu_delete) {
+            if (mListener != null) mListener.onDeleteRequested(mLookupUri);
+            return true;
+        } else if (id == R.id.menu_split) {
+            return doSplitContactAction();
+        } else if (id == R.id.menu_join) {
+            return doJoinContactAction();
+        } else if (id == R.id.menu_help) {
+            HelpUtils.launchHelpAndFeedbackForContactScreen(getActivity());
+            return true;
         }
 
         return false;
diff --git a/src/com/android/contacts/editor/EventFieldEditorView.java b/src/com/android/contacts/editor/EventFieldEditorView.java
index 4c29330..5d47d95 100644
--- a/src/com/android/contacts/editor/EventFieldEditorView.java
+++ b/src/com/android/contacts/editor/EventFieldEditorView.java
@@ -144,11 +144,10 @@
     public Dialog createDialog(Bundle bundle) {
         if (bundle == null) throw new IllegalArgumentException("bundle must not be null");
         int dialogId = bundle.getInt(DIALOG_ID_KEY);
-        switch (dialogId) {
-            case R.id.dialog_event_date_picker:
-                return createDatePickerDialog();
-            default:
-                return super.createDialog(bundle);
+        if (dialogId == R.id.dialog_event_date_picker) {
+            return createDatePickerDialog();
+        } else {
+            return super.createDialog(bundle);
         }
     }
 
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index ea7ab64..5ca1e9b 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -461,57 +461,43 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case android.R.id.home: {
-                mActivity.onBackPressed();
-                return true;
-            }
-            case R.id.menu_add: {
-                startGroupAddMemberActivity();
-                return true;
-            }
-            case R.id.menu_multi_send_email: {
-                final long[] ids = mActionBarAdapter.isSelectionMode()
-                        ? getAdapter().getSelectedContactIdsArray()
-                        : GroupUtil.convertStringSetToLongArray(mGroupMemberContactIds);
-                sendToGroup(ids, ContactsUtils.SCHEME_MAILTO,
-                        getString(R.string.menu_sendEmailOption));
-                return true;
-            }
-            case R.id.menu_multi_send_message: {
-                final long[] ids = mActionBarAdapter.isSelectionMode()
-                        ? getAdapter().getSelectedContactIdsArray()
-                        : GroupUtil.convertStringSetToLongArray(mGroupMemberContactIds);
-                sendToGroup(ids, ContactsUtils.SCHEME_SMSTO,
-                        getString(R.string.menu_sendMessageOption));
-                return true;
-            }
-            case R.id.menu_rename_group: {
-                GroupNameEditDialogFragment.newInstanceForUpdate(
-                        new AccountWithDataSet(mGroupMetaData.accountName,
-                                mGroupMetaData.accountType, mGroupMetaData.dataSet),
-                        GroupUtil.ACTION_UPDATE_GROUP, mGroupMetaData.groupId,
-                        mGroupMetaData.groupName).show(getFragmentManager(),
-                        TAG_GROUP_NAME_EDIT_DIALOG);
-                return true;
-            }
-            case R.id.menu_delete_group: {
-                deleteGroup();
-                return true;
-            }
-            case R.id.menu_edit_group: {
-                mIsEditMode = true;
-                mActionBarAdapter.setSelectionMode(true);
-                displayDeleteButtons(true);
-                return true;
-            }
-            case R.id.menu_remove_from_group: {
-                logListEvent();
-                removeSelectedContacts();
-                return true;
-            }
+        final int id = item.getItemId();
+        if (id == android.R.id.home) {
+            mActivity.onBackPressed();
+        } else if (id == R.id.menu_add) {
+            startGroupAddMemberActivity();
+        } else if (id == R.id.menu_multi_send_email) {
+            final long[] ids = mActionBarAdapter.isSelectionMode()
+                    ? getAdapter().getSelectedContactIdsArray()
+                    : GroupUtil.convertStringSetToLongArray(mGroupMemberContactIds);
+            sendToGroup(ids, ContactsUtils.SCHEME_MAILTO,
+                    getString(R.string.menu_sendEmailOption));
+        } else if (id == R.id.menu_multi_send_message) {
+            final long[] ids = mActionBarAdapter.isSelectionMode()
+                    ? getAdapter().getSelectedContactIdsArray()
+                    : GroupUtil.convertStringSetToLongArray(mGroupMemberContactIds);
+            sendToGroup(ids, ContactsUtils.SCHEME_SMSTO,
+                    getString(R.string.menu_sendMessageOption));
+        } else if (id == R.id.menu_rename_group) {
+            GroupNameEditDialogFragment.newInstanceForUpdate(
+                    new AccountWithDataSet(mGroupMetaData.accountName,
+                            mGroupMetaData.accountType, mGroupMetaData.dataSet),
+                    GroupUtil.ACTION_UPDATE_GROUP, mGroupMetaData.groupId,
+                    mGroupMetaData.groupName).show(getFragmentManager(),
+                    TAG_GROUP_NAME_EDIT_DIALOG);
+        } else if (id == R.id.menu_delete_group) {
+            deleteGroup();
+        } else if (id == R.id.menu_edit_group) {
+            mIsEditMode = true;
+            mActionBarAdapter.setSelectionMode(true);
+            displayDeleteButtons(true);
+        } else if (id == R.id.menu_remove_from_group) {
+            logListEvent();
+            removeSelectedContacts();
+        } else {
+            return super.onOptionsItemSelected(item);
         }
-        return super.onOptionsItemSelected(item);
+        return true;
     }
 
     private void removeSelectedContacts() {
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index 76f3935..c13e475 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -129,14 +129,14 @@
 
     @Override
     public void onClick(View v) {
-        switch (v.getId()) {
-            case R.id.add_account_button:
-                final Intent intent = ImplicitIntentsUtil.getIntentForAddingGoogleAccount();
-                ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
-                break;
-            case R.id.import_contacts_button:
-                ImportDialogFragment.show(getFragmentManager());
-                break;
+        final int id = v.getId();
+        if (id == R.id.add_account_button) {
+            final Intent intent = ImplicitIntentsUtil.getIntentForAddingGoogleAccount();
+            ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
+
+        } else if (id == R.id.import_contacts_button) {
+            ImportDialogFragment.show(getFragmentManager());
+
         }
     }
 
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index bbde17b..2fe9e12 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -934,15 +934,14 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case android.R.id.home:
-                confirmFinish();
-                return true;
-            case R.id.menu_save:
-                this.doSaveAction();
-                return true;
-            default:
-                break;
+        final int id = item.getItemId();
+        if (id == android.R.id.home) {
+            confirmFinish();
+            return true;
+        } else if (id == R.id.menu_save) {
+            this.doSaveAction();
+            return true;
+        } else {
         }
         return super.onOptionsItemSelected(item);
     }
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 079c5a5..855a530 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -1014,43 +1014,36 @@
             return false;
         }
 
-        switch (item.getItemId()) {
-            case android.R.id.home: {
-                // The home icon on the action bar is pressed
-                if (mActionBarAdapter.isUpShowing()) {
-                    // "UP" icon press -- should be treated as "back".
-                    mActivity.onBackPressed();
-                }
-                return true;
+        final int id = item.getItemId();
+        if (id == android.R.id.home) {
+            if (mActionBarAdapter.isUpShowing()) {
+                // "UP" icon press -- should be treated as "back".
+                mActivity.onBackPressed();
             }
-            case R.id.menu_search: {
-                if (!mActionBarAdapter.isSelectionMode()) {
-                    mActionBarAdapter.setSearchMode(true);
-                }
-                return true;
+            return true;
+        } else if (id == R.id.menu_search) {
+            if (!mActionBarAdapter.isSelectionMode()) {
+                mActionBarAdapter.setSearchMode(true);
             }
-            case R.id.menu_share: {
-                shareSelectedContacts();
-                return true;
-            }
-            case R.id.menu_join: {
-                Logger.logListEvent(ListEvent.ActionType.LINK,
+            return true;
+        } else if (id == R.id.menu_share) {
+            shareSelectedContacts();
+            return true;
+        } else if (id == R.id.menu_join) {
+            Logger.logListEvent(ListEvent.ActionType.LINK,
                         /* listType */ getListTypeIncludingSearch(),
                         /* count */ getAdapter().getCount(), /* clickedIndex */ -1,
                         /* numSelected */ getAdapter().getSelectedContactIds().size());
-                joinSelectedContacts();
-                return true;
-            }
-            case R.id.menu_delete: {
-                deleteSelectedContacts();
-                return true;
-            }
-            case R.id.export_database: {
-                final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
-                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-                ImplicitIntentsUtil.startActivityOutsideApp(getContext(), intent);
-                return true;
-            }
+            joinSelectedContacts();
+            return true;
+        } else if (id == R.id.menu_delete) {
+            deleteSelectedContacts();
+            return true;
+        } else if (id == R.id.export_database) {
+            final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
+            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+            ImplicitIntentsUtil.startActivityOutsideApp(getContext(), intent);
+            return true;
         }
         return super.onOptionsItemSelected(item);
     }
diff --git a/src/com/android/contacts/list/GroupMemberPickerFragment.java b/src/com/android/contacts/list/GroupMemberPickerFragment.java
index a554382..e94d73b 100644
--- a/src/com/android/contacts/list/GroupMemberPickerFragment.java
+++ b/src/com/android/contacts/list/GroupMemberPickerFragment.java
@@ -301,20 +301,18 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case android.R.id.home: {
-                final Activity activity = getActivity();
-                if (activity != null) {
-                    activity.onBackPressed();
-                }
-                return true;
+        final int id = item.getItemId();
+        if (id == android.R.id.home) {
+            final Activity activity = getActivity();
+            if (activity != null) {
+                activity.onBackPressed();
             }
-            case R.id.menu_select: {
-                if (mListener != null) {
-                    mListener.onSelectGroupMembers();
-                }
-                return true;
+            return true;
+        } else if (id == R.id.menu_select) {
+            if (mListener != null) {
+                mListener.onSelectGroupMembers();
             }
+            return true;
         }
         return super.onOptionsItemSelected(item);
     }
diff --git a/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java b/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java
index ec0bff6..6f6a3c7 100644
--- a/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java
@@ -77,18 +77,16 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch(item.getItemId()) {
-            case R.id.menu_send: {
-                final String scheme = getActivity().getIntent().getStringExtra(
-                        UiIntentActions.SELECTION_SEND_SCHEME);
-                final String title= getActivity().getIntent().getStringExtra(
-                        UiIntentActions.SELECTION_SEND_TITLE);
-                final List<String> items = GroupUtil.getSendToDataForIds(
-                        getActivity(), getAdapter().getSelectedContactIdsArray(), scheme);
-                final String list = TextUtils.join(",", items);
-                GroupUtil.startSendToSelectionActivity(this, list, scheme, title);
-                return true;
-            }
+        if (item.getItemId() == R.id.menu_send) {
+            final String scheme = getActivity().getIntent().getStringExtra(
+                    UiIntentActions.SELECTION_SEND_SCHEME);
+            final String title = getActivity().getIntent().getStringExtra(
+                    UiIntentActions.SELECTION_SEND_TITLE);
+            final List<String> items = GroupUtil.getSendToDataForIds(
+                    getActivity(), getAdapter().getSelectedContactIdsArray(), scheme);
+            final String list = TextUtils.join(",", items);
+            GroupUtil.startSendToSelectionActivity(this, list, scheme, title);
+            return true;
         }
         return super.onOptionsItemSelected(item);
     }
diff --git a/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java b/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java
index 7d23182..2b7021e 100644
--- a/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java
@@ -77,18 +77,16 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch(item.getItemId()) {
-            case R.id.menu_send: {
-                final String scheme = getActivity().getIntent().getStringExtra(
-                        UiIntentActions.SELECTION_SEND_SCHEME);
-                final String title= getActivity().getIntent().getStringExtra(
-                        UiIntentActions.SELECTION_SEND_TITLE);
-                final List<String> items = GroupUtil.getSendToDataForIds(
-                        getActivity(), getAdapter().getSelectedContactIdsArray(), scheme);
-                final String list = TextUtils.join(",", items);
-                GroupUtil.startSendToSelectionActivity(this, list, scheme, title);
-                return true;
-            }
+        if (item.getItemId() == R.id.menu_send) {
+            final String scheme = getActivity().getIntent().getStringExtra(
+                    UiIntentActions.SELECTION_SEND_SCHEME);
+            final String title = getActivity().getIntent().getStringExtra(
+                    UiIntentActions.SELECTION_SEND_TITLE);
+            final List<String> items = GroupUtil.getSendToDataForIds(
+                    getActivity(), getAdapter().getSelectedContactIdsArray(), scheme);
+            final String list = TextUtils.join(",", items);
+            GroupUtil.startSendToSelectionActivity(this, list, scheme, title);
+            return true;
         }
         return super.onOptionsItemSelected(item);
     }
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 3c04f68..767b6c7 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -2757,137 +2757,128 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.menu_star:
-                // Make sure there is a contact
-                if (mContactData != null) {
-                    // Read the current starred value from the UI instead of using the last
-                    // loaded state. This allows rapid tapping without writing the same
-                    // value several times
-                    final boolean isStarred = item.isChecked();
-                    Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                            isStarred ? ActionType.UNSTAR : ActionType.STAR,
+        final int id = item.getItemId();
+        if (id == R.id.menu_star) {// Make sure there is a contact
+            if (mContactData != null) {
+                // Read the current starred value from the UI instead of using the last
+                // loaded state. This allows rapid tapping without writing the same
+                // value several times
+                final boolean isStarred = item.isChecked();
+                Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
+                        isStarred ? ActionType.UNSTAR : ActionType.STAR,
                             /* thirdPartyAction */ null);
-                    toggleStar(item, isStarred);
-                }
-                return true;
-            case R.id.menu_edit:
-                if (DirectoryContactUtil.isDirectoryContact(mContactData)) {
-                    Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                            ActionType.ADD, /* thirdPartyAction */ null);
-
-                    // This action is used to launch the contact selector, with the option of
-                    // creating a new contact. Creating a new contact is an INSERT, while selecting
-                    // an exisiting one is an edit. The fields in the edit screen will be
-                    // prepopulated with data.
-
-                    final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
-                    intent.setType(Contacts.CONTENT_ITEM_TYPE);
-
-                    ArrayList<ContentValues> values = mContactData.getContentValues();
-
-                    // Only pre-fill the name field if the provided display name is an nickname
-                    // or better (e.g. structured name, nickname)
-                    if (mContactData.getDisplayNameSource() >= DisplayNameSources.NICKNAME) {
-                        intent.putExtra(Intents.Insert.NAME, mContactData.getDisplayName());
-                    } else if (mContactData.getDisplayNameSource()
-                            == DisplayNameSources.ORGANIZATION) {
-                        // This is probably an organization. Instead of copying the organization
-                        // name into a name entry, copy it into the organization entry. This
-                        // way we will still consider the contact an organization.
-                        final ContentValues organization = new ContentValues();
-                        organization.put(Organization.COMPANY, mContactData.getDisplayName());
-                        organization.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
-                        values.add(organization);
-                    }
-
-                    // Last time used and times used are aggregated values from the usage stat
-                    // table. They need to be removed from data values so the SQL table can insert
-                    // properly
-                    for (ContentValues value : values) {
-                        value.remove(Data.LAST_TIME_USED);
-                        value.remove(Data.TIMES_USED);
-                    }
-                    intent.putExtra(Intents.Insert.DATA, values);
-
-                    // If the contact can only export to the same account, add it to the intent.
-                    // Otherwise the ContactEditorFragment will show a dialog for selecting
-                    // an account.
-                    if (mContactData.getDirectoryExportSupport() ==
-                            Directory.EXPORT_SUPPORT_SAME_ACCOUNT_ONLY) {
-                        intent.putExtra(Intents.Insert.EXTRA_ACCOUNT,
-                                new Account(mContactData.getDirectoryAccountName(),
-                                        mContactData.getDirectoryAccountType()));
-                        intent.putExtra(Intents.Insert.EXTRA_DATA_SET,
-                                mContactData.getRawContacts().get(0).getDataSet());
-                    }
-
-                    // Add this flag to disable the delete menu option on directory contact joins
-                    // with local contacts. The delete option is ambiguous when joining contacts.
-                    intent.putExtra(
-                            ContactEditorFragment.INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION,
-                            true);
-
-                    intent.setPackage(getPackageName());
-                    startActivityForResult(intent, REQUEST_CODE_CONTACT_SELECTION_ACTIVITY);
-                } else if (InvisibleContactUtil.isInvisibleAndAddable(mContactData, this)) {
-                    Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                            ActionType.ADD, /* thirdPartyAction */ null);
-                    InvisibleContactUtil.addToDefaultGroup(mContactData, this);
-                } else if (isContactEditable()) {
-                    Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                            ActionType.EDIT, /* thirdPartyAction */ null);
-                    editContact();
-                }
-                return true;
-            case R.id.menu_join:
-                return doJoinContactAction();
-            case R.id.menu_linked_contacts:
-                return showRawContactPickerDialog();
-            case R.id.menu_delete:
+                toggleStar(item, isStarred);
+            }
+        } else if (id == R.id.menu_edit) {
+            if (DirectoryContactUtil.isDirectoryContact(mContactData)) {
                 Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                        ActionType.REMOVE, /* thirdPartyAction */ null);
-                if (isContactEditable()) {
-                    deleteContact();
+                        ActionType.ADD, /* thirdPartyAction */ null);
+
+                // This action is used to launch the contact selector, with the option of
+                // creating a new contact. Creating a new contact is an INSERT, while selecting
+                // an exisiting one is an edit. The fields in the edit screen will be
+                // prepopulated with data.
+
+                final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+                intent.setType(Contacts.CONTENT_ITEM_TYPE);
+
+                ArrayList<ContentValues> values = mContactData.getContentValues();
+
+                // Only pre-fill the name field if the provided display name is an nickname
+                // or better (e.g. structured name, nickname)
+                if (mContactData.getDisplayNameSource() >= DisplayNameSources.NICKNAME) {
+                    intent.putExtra(Intents.Insert.NAME, mContactData.getDisplayName());
+                } else if (mContactData.getDisplayNameSource()
+                        == DisplayNameSources.ORGANIZATION) {
+                    // This is probably an organization. Instead of copying the organization
+                    // name into a name entry, copy it into the organization entry. This
+                    // way we will still consider the contact an organization.
+                    final ContentValues organization = new ContentValues();
+                    organization.put(Organization.COMPANY, mContactData.getDisplayName());
+                    organization.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
+                    values.add(organization);
                 }
-                return true;
-            case R.id.menu_share:
-                Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                        ActionType.SHARE, /* thirdPartyAction */ null);
-                if (isContactShareable()) {
-                    shareContact();
+
+                // Last time used and times used are aggregated values from the usage stat
+                // table. They need to be removed from data values so the SQL table can insert
+                // properly
+                for (ContentValues value : values) {
+                    value.remove(Data.LAST_TIME_USED);
+                    value.remove(Data.TIMES_USED);
                 }
-                return true;
-            case R.id.menu_create_contact_shortcut:
-                Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                        ActionType.SHORTCUT, /* thirdPartyAction */ null);
-                if (isShortcutCreatable()) {
-                    createLauncherShortcutWithContact();
+                intent.putExtra(Intents.Insert.DATA, values);
+
+                // If the contact can only export to the same account, add it to the intent.
+                // Otherwise the ContactEditorFragment will show a dialog for selecting
+                // an account.
+                if (mContactData.getDirectoryExportSupport() ==
+                        Directory.EXPORT_SUPPORT_SAME_ACCOUNT_ONLY) {
+                    intent.putExtra(Intents.Insert.EXTRA_ACCOUNT,
+                            new Account(mContactData.getDirectoryAccountName(),
+                                    mContactData.getDirectoryAccountType()));
+                    intent.putExtra(Intents.Insert.EXTRA_DATA_SET,
+                            mContactData.getRawContacts().get(0).getDataSet());
                 }
-                return true;
-            case R.id.menu_set_ringtone:
-                doPickRingtone();
-                return true;
-            case R.id.menu_send_to_voicemail:
-                // Update state and save
-                mSendToVoicemailState = !mSendToVoicemailState;
-                item.setTitle(mSendToVoicemailState
-                        ? R.string.menu_unredirect_calls_to_vm
-                        : R.string.menu_redirect_calls_to_vm);
-                final Intent intent = ContactSaveService.createSetSendToVoicemail(
-                        this, mLookupUri, mSendToVoicemailState);
-                this.startService(intent);
-                return true;
-            case R.id.menu_help:
+
+                // Add this flag to disable the delete menu option on directory contact joins
+                // with local contacts. The delete option is ambiguous when joining contacts.
+                intent.putExtra(
+                        ContactEditorFragment.INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION,
+                        true);
+
+                intent.setPackage(getPackageName());
+                startActivityForResult(intent, REQUEST_CODE_CONTACT_SELECTION_ACTIVITY);
+            } else if (InvisibleContactUtil.isInvisibleAndAddable(mContactData, this)) {
                 Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                        ActionType.HELP, /* thirdPartyAction */ null);
-                HelpUtils.launchHelpAndFeedbackForContactScreen(this);
-                return true;
-            default:
+                        ActionType.ADD, /* thirdPartyAction */ null);
+                InvisibleContactUtil.addToDefaultGroup(mContactData, this);
+            } else if (isContactEditable()) {
                 Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
-                        ActionType.UNKNOWN_ACTION, /* thirdPartyAction */ null);
-                return super.onOptionsItemSelected(item);
+                        ActionType.EDIT, /* thirdPartyAction */ null);
+                editContact();
+            }
+        } else if (id == R.id.menu_join) {
+            return doJoinContactAction();
+        } else if (id == R.id.menu_linked_contacts) {
+            return showRawContactPickerDialog();
+        } else if (id == R.id.menu_delete) {
+            Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
+                    ActionType.REMOVE, /* thirdPartyAction */ null);
+            if (isContactEditable()) {
+                deleteContact();
+            }
+        } else if (id == R.id.menu_share) {
+            Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
+                    ActionType.SHARE, /* thirdPartyAction */ null);
+            if (isContactShareable()) {
+                shareContact();
+            }
+        } else if (id == R.id.menu_create_contact_shortcut) {
+            Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
+                    ActionType.SHORTCUT, /* thirdPartyAction */ null);
+            if (isShortcutCreatable()) {
+                createLauncherShortcutWithContact();
+            }
+        } else if (id == R.id.menu_set_ringtone) {
+            doPickRingtone();
+        } else if (id == R.id.menu_send_to_voicemail) {// Update state and save
+            mSendToVoicemailState = !mSendToVoicemailState;
+            item.setTitle(mSendToVoicemailState
+                    ? R.string.menu_unredirect_calls_to_vm
+                    : R.string.menu_redirect_calls_to_vm);
+            final Intent intent = ContactSaveService.createSetSendToVoicemail(
+                    this, mLookupUri, mSendToVoicemailState);
+            this.startService(intent);
+        } else if (id == R.id.menu_help) {
+            Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
+                    ActionType.HELP, /* thirdPartyAction */ null);
+            HelpUtils.launchHelpAndFeedbackForContactScreen(this);
+        } else {
+            Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
+                    ActionType.UNKNOWN_ACTION, /* thirdPartyAction */ null);
+            return super.onOptionsItemSelected(item);
         }
+        return true;
     }
 
     private boolean showRawContactPickerDialog() {
