Proper handling of View/Edit from list-context Menu

Change-Id: Ibe299620ca0c0ba237a3cd4bfc83e9c807cc63ab
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 62530fd..d05f2b1 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -290,7 +290,7 @@
         }
     }
 
-    private void setupContactEditorFragment() {
+    private void setupContactEditorFragment(Uri contactLookupUri) {
         // No detail view here
         closeDetailFragment();
         closeEmptyFragment();
@@ -299,6 +299,8 @@
         if (mEditorFragment != null) return;
 
         mEditorFragment = new ContactEditorFragment();
+        mEditorFragment.load(Intent.ACTION_EDIT, contactLookupUri,
+                Contacts.CONTENT_ITEM_TYPE, new Bundle());
 
         // Nothing showing yet? Create (this happens during Activity-Startup)
         openFragmentTransaction()
@@ -418,8 +420,9 @@
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
-        public void onViewContactAction(Uri contactLookupUri) {
+        public void onViewContactAction(Uri contactLookupUri, boolean force) {
             if (mContactContentDisplayed) {
+                if (force) closeEditorFragment(true);
                 mListFragment.setSelectedContactUri(contactLookupUri);
                 setupContactDetailFragment(contactLookupUri);
             } else {
@@ -437,12 +440,18 @@
         }
 
         public void onEditContactAction(Uri contactLookupUri) {
-            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
-            Bundle extras = getIntent().getExtras();
-            if (extras != null) {
-                intent.putExtras(extras);
+            if (mContactContentDisplayed) {
+                closeEditorFragment(true);
+                mListFragment.setSelectedContactUri(contactLookupUri);
+                setupContactEditorFragment(contactLookupUri);
+            } else {
+                Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
+                Bundle extras = getIntent().getExtras();
+                if (extras != null) {
+                    intent.putExtras(extras);
+                }
+                startActivity(intent);
             }
-            startActivity(intent);
         }
 
         public void onAddToFavoritesAction(Uri contactUri) {
@@ -482,9 +491,7 @@
 
         @Override
         public void onEditRequested(Uri contactLookupUri) {
-            setupContactEditorFragment();
-            mEditorFragment.load(Intent.ACTION_EDIT, contactLookupUri, Contacts.CONTENT_ITEM_TYPE,
-                    new Bundle());
+            setupContactEditorFragment(contactLookupUri);
         }
 
         @Override
diff --git a/src/com/android/contacts/activities/ContactSearchActivity.java b/src/com/android/contacts/activities/ContactSearchActivity.java
index 327ccfa..799653c 100644
--- a/src/com/android/contacts/activities/ContactSearchActivity.java
+++ b/src/com/android/contacts/activities/ContactSearchActivity.java
@@ -108,7 +108,7 @@
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
-        public void onViewContactAction(Uri contactLookupUri) {
+        public void onViewContactAction(Uri contactLookupUri, boolean force) {
             startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
         }
 
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 55d225a..b1e13ad 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -231,7 +231,7 @@
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
-        public void onViewContactAction(Uri contactLookupUri) {
+        public void onViewContactAction(Uri contactLookupUri, boolean force) {
             throw new UnsupportedOperationException();
         }
 
diff --git a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java b/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
index 1529c1d..0cb4394 100644
--- a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
+++ b/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
@@ -100,7 +100,7 @@
         final Uri contactUri = adapter.getContactUri(position);
         switch (item.getItemId()) {
             case MENU_ITEM_VIEW_CONTACT: {
-                mContactListFragment.viewContact(contactUri);
+                mContactListFragment.viewContact(contactUri, true);
                 return true;
             }
 
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 85b70fe..c3a3f2e 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -132,8 +132,8 @@
         mListener.onCreateNewContactAction();
     }
 
-    public void viewContact(Uri contactUri) {
-        mListener.onViewContactAction(contactUri);
+    public void viewContact(Uri contactUri, boolean finishEditing) {
+        mListener.onViewContactAction(contactUri, finishEditing);
     }
 
     public void editContact(Uri contactUri) {
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 2133d49..dd0ae3e 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -119,7 +119,7 @@
                 editContact(adapter.getContactUri(position));
             }
         } else {
-            viewContact(adapter.getContactUri(position));
+            viewContact(adapter.getContactUri(position), false);
         }
     }
 
diff --git a/src/com/android/contacts/list/OnContactBrowserActionListener.java b/src/com/android/contacts/list/OnContactBrowserActionListener.java
index 2532c84..5291639 100644
--- a/src/com/android/contacts/list/OnContactBrowserActionListener.java
+++ b/src/com/android/contacts/list/OnContactBrowserActionListener.java
@@ -24,8 +24,11 @@
 
     /**
      * Opens the specified contact for viewing.
+     *
+     * @param contactLookupUri The lookup-uri of the Contact that should be opened
+     * @param finishEditing The user has explicitly requested to leave the edit mode
      */
-    void onViewContactAction(Uri contactLookupUri);
+    void onViewContactAction(Uri contactLookupUri, boolean finishEditing);
 
     /**
      * Creates a new contact.
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 4b8e2bb..722e3b7 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -58,7 +58,7 @@
     @Override
     protected void onItemClick(int position, long id) {
         ContactListAdapter adapter = getAdapter();
-        viewContact(adapter.getContactUri(position));
+        viewContact(adapter.getContactUri(position), false);
     }
 
     @Override