Fixing INSERT_OR_EDIT intent for contacts

Change-Id: I62e8c3628bed7443232d0e23ed50d34a55788f70
diff --git a/src/com/android/contacts/JoinContactActivity.java b/src/com/android/contacts/JoinContactActivity.java
index ea48763..5089b8c 100644
--- a/src/com/android/contacts/JoinContactActivity.java
+++ b/src/com/android/contacts/JoinContactActivity.java
@@ -75,20 +75,24 @@
         mListFragment = new JoinContactListFragment();
         mListFragment.setTargetContactId(mTargetContactId);
         mListFragment.setOnContactPickerActionListener(new OnContactPickerActionListener() {
+            @Override
             public void onPickContactAction(Uri contactUri) {
                 Intent intent = new Intent(null, contactUri);
                 setResult(RESULT_OK, intent);
                 finish();
             }
 
-            public void onSearchAllContactsAction(String string) {
-            }
-
+            @Override
             public void onShortcutIntentCreated(Intent intent) {
             }
 
+            @Override
             public void onCreateNewContactAction() {
             }
+
+            @Override
+            public void onEditContactAction(Uri contactLookupUri) {
+            }
         });
 
         FragmentTransaction transaction = getFragmentManager().openTransaction();
diff --git a/src/com/android/contacts/activities/ContactSearchActivity.java b/src/com/android/contacts/activities/ContactSearchActivity.java
index a42f56b..0c8d141 100644
--- a/src/com/android/contacts/activities/ContactSearchActivity.java
+++ b/src/com/android/contacts/activities/ContactSearchActivity.java
@@ -103,8 +103,6 @@
         fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
         fragment.setAizyEnabled(false);
         fragment.setSelectionVisible(true);
-        fragment.setEditMode(mRequest.getActionCode() ==
-                ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT);
         return fragment;
     }
 
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 7bcfea9..cfe9710 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -178,10 +178,10 @@
         mActionCode = mRequest.getActionCode();
         switch (mActionCode) {
             case ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT: {
-                DefaultContactBrowseListFragment fragment = new DefaultContactBrowseListFragment();
-                fragment.setEditMode(true);
+                ContactPickerFragment fragment = new ContactPickerFragment();
                 fragment.setCreateContactEnabled(true);
-                fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_CONTACT_SHORTCUT);
+                fragment.setEditMode(true);
+                fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
                 mListFragment = fragment;
                 break;
             }
@@ -337,6 +337,12 @@
         }
 
         @Override
+        public void onEditContactAction(Uri contactLookupUri) {
+            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
+            startActivityAndForwardResult(intent);
+        }
+
+        @Override
         public void onPickContactAction(Uri contactUri) {
             Intent intent = new Intent();
             setResult(RESULT_OK, intent.setData(contactUri));
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index 9572dda..0937608 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -21,6 +21,7 @@
 
 import android.content.Intent;
 import android.net.Uri;
+import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -33,8 +34,13 @@
 public class ContactPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter>
         implements OnShortcutIntentCreatedListener {
 
+    private static final String KEY_EDIT_MODE = "editMode";
+    private static final String KEY_CREATE_CONTACT_ENABLED = "createContactEnabled";
+    private static final String KEY_SHORTCUT_REQUESTED = "shortcutRequested";
+
     private OnContactPickerActionListener mListener;
     private boolean mCreateContactEnabled;
+    private boolean mEditMode;
     private boolean mShortcutRequested;
 
     public ContactPickerFragment() {
@@ -57,6 +63,14 @@
         this.mCreateContactEnabled = flag;
     }
 
+    public boolean isEditMode() {
+        return mEditMode;
+    }
+
+    public void setEditMode(boolean flag) {
+        mEditMode = flag;
+    }
+
     public boolean isShortcutRequested() {
         return mShortcutRequested;
     }
@@ -66,6 +80,27 @@
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBoolean(KEY_EDIT_MODE, mEditMode);
+        outState.putBoolean(KEY_CREATE_CONTACT_ENABLED, mCreateContactEnabled);
+        outState.putBoolean(KEY_SHORTCUT_REQUESTED, mShortcutRequested);
+    }
+
+    @Override
+    public void restoreSavedState(Bundle savedState) {
+        super.restoreSavedState(savedState);
+
+        if (savedState == null) {
+            return;
+        }
+
+        mEditMode = savedState.getBoolean(KEY_EDIT_MODE);
+        mCreateContactEnabled = savedState.getBoolean(KEY_CREATE_CONTACT_ENABLED);
+        mShortcutRequested = savedState.getBoolean(KEY_SHORTCUT_REQUESTED);
+    }
+
+    @Override
     protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
         super.onCreateView(inflater, container);
         if (mCreateContactEnabled) {
@@ -75,7 +110,7 @@
 
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        if (position == 0 && !isSearchMode() && mCreateContactEnabled) {
+        if (position == 0 && mCreateContactEnabled) {
             mListener.onCreateNewContactAction();
         } else {
             super.onItemClick(parent, view, position, id);
@@ -90,14 +125,28 @@
         } else {
             uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
         }
-        if (mShortcutRequested) {
+        if (mEditMode) {
+            editContact(uri);
+        } else  if (mShortcutRequested) {
             ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
             builder.createContactShortcutIntent(uri);
         } else {
-            mListener.onPickContactAction(uri);
+            pickContact(uri);
         }
     }
 
+    public void createNewContact() {
+        mListener.onCreateNewContactAction();
+    }
+
+    public void editContact(Uri contactUri) {
+        mListener.onEditContactAction(contactUri);
+    }
+
+    public void pickContact(Uri uri) {
+        mListener.onPickContactAction(uri);
+    }
+
     @Override
     protected ContactEntryListAdapter createListAdapter() {
         if (!isLegacyCompatibilityMode()) {
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index bd43afc..651228b 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -35,14 +35,10 @@
 public class DefaultContactBrowseListFragment extends ContactBrowseListFragment
         implements ContactListFilterController.ContactListFilterListener {
 
-    private static final String KEY_EDIT_MODE = "editMode";
-    private static final String KEY_CREATE_CONTACT_ENABLED = "createContactEnabled";
     private static final String KEY_FILTER_ENABLED = "filterEnabled";
 
     private static final int REQUEST_CODE_CUSTOMIZE_FILTER = 3;
 
-    private boolean mEditMode;
-    private boolean mCreateContactEnabled;
     private View mCounterHeaderView;
     private View mSearchHeaderView;
 
@@ -71,8 +67,6 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
-        outState.putBoolean(KEY_EDIT_MODE, mEditMode);
-        outState.putBoolean(KEY_CREATE_CONTACT_ENABLED, mCreateContactEnabled);
         outState.putBoolean(KEY_FILTER_ENABLED, mFilterEnabled);
     }
 
@@ -84,23 +78,12 @@
             return;
         }
 
-        mEditMode = savedState.getBoolean(KEY_EDIT_MODE);
-        mCreateContactEnabled = savedState.getBoolean(KEY_CREATE_CONTACT_ENABLED);
         setFilterEnabled(savedState.getBoolean(KEY_FILTER_ENABLED));
     }
 
     @Override
     protected void onItemClick(int position, long id) {
-        ContactListAdapter adapter = getAdapter();
-        if (isEditMode()) {
-            if (position == 0 && !isSearchMode() && isCreateContactEnabled()) {
-                createNewContact();
-            } else {
-                editContact(adapter.getContactUri(position));
-            }
-        } else {
-            viewContact(adapter.getContactUri(position));
-        }
+        viewContact(getAdapter().getContactUri(position));
     }
 
     @Override
@@ -197,14 +180,6 @@
         }
     }
 
-    public boolean isEditMode() {
-        return mEditMode;
-    }
-
-    public void setEditMode(boolean flag) {
-        mEditMode = flag;
-    }
-
     public boolean isFilterEnabled() {
         return mFilterEnabled;
     }
@@ -213,14 +188,6 @@
         this.mFilterEnabled = flag;
     }
 
-    public boolean isCreateContactEnabled() {
-        return mCreateContactEnabled;
-    }
-
-    public void setCreateContactEnabled(boolean flag) {
-        this.mCreateContactEnabled = flag;
-    }
-
     @Override
     protected void startLoading() {
         if (mFilterController != null && !mFilterController.isLoaded()) {
diff --git a/src/com/android/contacts/list/OnContactPickerActionListener.java b/src/com/android/contacts/list/OnContactPickerActionListener.java
index 1216888..0c26e9e 100644
--- a/src/com/android/contacts/list/OnContactPickerActionListener.java
+++ b/src/com/android/contacts/list/OnContactPickerActionListener.java
@@ -24,11 +24,6 @@
 public interface OnContactPickerActionListener  {
 
     /**
-     * Creates a new contact and then returns it to the caller.
-     */
-    void onCreateNewContactAction();
-
-    /**
      * Returns the selected contact to the requester.
      */
     void onPickContactAction(Uri contactUri);
@@ -37,4 +32,14 @@
      * Returns the selected contact as a shortcut intent.
      */
     void onShortcutIntentCreated(Intent intent);
+
+    /**
+     * Creates a new contact and then returns it to the caller.
+     */
+    void onCreateNewContactAction();
+
+    /**
+     * Opens the specified contact for editing.
+     */
+    void onEditContactAction(Uri contactLookupUri);
 }
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index b3048f5..4cc9cc8 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -316,7 +316,9 @@
             }
             case ACTION_INSERT_OR_EDIT: {
                 Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
-                startContactListActivity(intent);
+                intent.setType(Contacts.CONTENT_ITEM_TYPE);
+                putDataExtra(intent);
+                startActivity(intent);
                 break;
             }
             case ACTION_SEARCH_CALL: {
@@ -440,17 +442,7 @@
             case EDIT_NEW_CONTACT_WITH_DATA: {
                 Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
 
-                ContentValues row1 = new ContentValues();
-                row1.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
-                row1.put(Organization.COMPANY, "Android");
-
-                ContentValues row2 = new ContentValues();
-                row2.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
-                row2.put(Email.TYPE, Email.TYPE_CUSTOM);
-                row2.put(Email.LABEL, "Green Bot");
-                row2.put(Email.ADDRESS, "android@android.com");
-
-                intent.putParcelableArrayListExtra(Insert.DATA, Lists.newArrayList(row1, row2));
+                putDataExtra(intent);
 
                 startActivity(intent);
                 break;
@@ -665,21 +657,25 @@
                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
 
                 intent.putExtra(Insert.ACCOUNT, account);
-                ContentValues row1 = new ContentValues();
-                row1.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
-                row1.put(Organization.COMPANY, "Android");
-
-                ContentValues row2 = new ContentValues();
-                row2.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
-                row2.put(Email.TYPE, Email.TYPE_CUSTOM);
-                row2.put(Email.LABEL, "Green Bot");
-                row2.put(Email.ADDRESS, "android@android.com");
-
-                intent.putParcelableArrayListExtra(Insert.DATA, Lists.newArrayList(row1, row2));
+                putDataExtra(intent);
 
                 startActivity(intent);
                 break;
             }
         }
     }
+
+    public void putDataExtra(final Intent intent) {
+        ContentValues row1 = new ContentValues();
+        row1.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
+        row1.put(Organization.COMPANY, "Android");
+
+        ContentValues row2 = new ContentValues();
+        row2.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
+        row2.put(Email.TYPE, Email.TYPE_CUSTOM);
+        row2.put(Email.LABEL, "Green Bot");
+        row2.put(Email.ADDRESS, "android@android.com");
+
+        intent.putParcelableArrayListExtra(Insert.DATA, Lists.newArrayList(row1, row2));
+    }
 }