Make the editor in the two-pane activity work

Change-Id: Ie468cbedf70a87084117b933e646f3af87746377
diff --git a/res/layout/contact_editor_fragment.xml b/res/layout/contact_editor_fragment.xml
index 3fb7c2e..0055956 100644
--- a/res/layout/contact_editor_fragment.xml
+++ b/res/layout/contact_editor_fragment.xml
@@ -25,14 +25,6 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"/>
 
-
-<!-- If we need the real ListView again, this is how to do it
-    <ListView android:id="@android:id/list"
-        android:layout_width="match_parent"
-        android:layout_height="0px"
-        android:layout_weight="1"
-        android:background="@drawable/title_bar_shadow"
-    /> -->
     <ScrollView
             android:layout_width="match_parent"
             android:layout_height="0px"
diff --git a/res/layout/two_pane_activity.xml b/res/layout/two_pane_activity.xml
index bcf0ad8..407360b 100644
--- a/res/layout/two_pane_activity.xml
+++ b/res/layout/two_pane_activity.xml
@@ -24,21 +24,22 @@
         layout="@layout/search_bar"/>
 
     <LinearLayout
-        android:id="@+id/two_pane_activity"
         android:orientation="horizontal"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
         <fragment android:name="com.android.contacts.list.DefaultContactBrowseListFragment"
                 android:id="@+id/two_pane_list"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
+                android:layout_width="0px"
+                android:layout_height="match_parent"
                 android:layout_weight="1" />
 
-        <fragment android:name="com.android.contacts.views.detail.ContactDetailFragment"
-                android:id="@+id/two_pane_detail"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_weight="1" />
+        <!--  Holder for detail- or editor-fragment. -->
+        <LinearLayout
+            android:id="@+id/two_pane_right_view"
+            android:orientation="horizontal"
+            android:layout_width="0px"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
   </LinearLayout>
 </LinearLayout>
diff --git a/src/com/android/contacts/activities/TwoPaneActivity.java b/src/com/android/contacts/activities/TwoPaneActivity.java
index ec6d4e3..63283ad 100644
--- a/src/com/android/contacts/activities/TwoPaneActivity.java
+++ b/src/com/android/contacts/activities/TwoPaneActivity.java
@@ -20,6 +20,7 @@
 import com.android.contacts.list.DefaultContactBrowseListFragment;
 import com.android.contacts.list.OnContactBrowserActionListener;
 import com.android.contacts.views.detail.ContactDetailFragment;
+import com.android.contacts.views.editor.ContactEditorFragment;
 import com.android.contacts.widget.SearchEditText;
 import com.android.contacts.widget.SearchEditText.OnFilterTextListener;
 
@@ -28,14 +29,21 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.text.TextUtils;
+import android.widget.LinearLayout;
 import android.widget.Toast;
+import android.widget.LinearLayout.LayoutParams;
 
 public class TwoPaneActivity extends Activity {
     private final static String TAG = "TwoPaneActivity";
+
     private DefaultContactBrowseListFragment mListFragment;
+    private ListFragmentListener mListFragmentListener = new ListFragmentListener();
+
     private ContactDetailFragment mDetailFragment;
     private DetailFragmentListener mDetailFragmentListener = new DetailFragmentListener();
-    private ListFragmentListener mListFragmentListener = new ListFragmentListener();
+
+    private ContactEditorFragment mEditorFragment;
+    private EditorFragmentListener mEditorFragmentListener = new EditorFragmentListener();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -46,12 +54,51 @@
         mListFragment = (DefaultContactBrowseListFragment) findFragmentById(R.id.two_pane_list);
         mListFragment.setOnContactListActionListener(mListFragmentListener);
 
-        mDetailFragment = (ContactDetailFragment) findFragmentById(R.id.two_pane_detail);
-        mDetailFragment.setListener(mDetailFragmentListener);
+        setupContactDetailFragment();
 
         setupSearchUI();
     }
 
+    private void setupContactDetailFragment() {
+        // No editor here
+        if (mEditorFragment != null) {
+            mEditorFragment.setListener(null);
+            mEditorFragment = null;
+        }
+
+        // Already showing? Nothing to do
+        if (mDetailFragment != null) return;
+
+        mDetailFragment = new ContactDetailFragment();
+        mDetailFragment.setListener(mDetailFragmentListener);
+
+        // Nothing showing yet? Create (this happens during Activity-Startup)
+        openFragmentTransaction()
+                .replace(R.id.two_pane_right_view, mDetailFragment)
+                .commit();
+
+    }
+
+    private void setupContactEditorFragment() {
+        // No detail view here
+        if (mDetailFragment != null) {
+            mDetailFragment.setListener(null);
+            mDetailFragment = null;
+        }
+
+        // Already showing? Nothing to do
+        if (mEditorFragment != null) return;
+
+        mEditorFragment = new ContactEditorFragment();
+        mEditorFragment.setListener(mEditorFragmentListener);
+
+        // Nothing showing yet? Create (this happens during Activity-Startup)
+        openFragmentTransaction()
+                .replace(R.id.two_pane_right_view, mEditorFragment)
+                .commit();
+
+    }
+
     private void setupSearchUI() {
         SearchEditText searchEditText = (SearchEditText)findViewById(R.id.search_src_text);
         searchEditText.setOnFilterTextListener(new OnFilterTextListener() {
@@ -112,6 +159,7 @@
         }
 
         public void onViewContactAction(Uri contactLookupUri) {
+            setupContactDetailFragment();
             mDetailFragment.loadUri(contactLookupUri);
         }
     }
@@ -122,10 +170,8 @@
         }
 
         public void onEditRequested(Uri contactLookupUri) {
-//          final ContactEditFragment fragment = new ContactEditFragment();
-//          openFragmentTransaction().replace(mDetailFragment.getView().getId(), fragment).commit();
-//          fragment.loadUri(contactLookupUri);
-            Toast.makeText(TwoPaneActivity.this, "editContact", Toast.LENGTH_LONG).show();
+            setupContactEditorFragment();
+            mEditorFragment.loadUri(contactLookupUri);
         }
 
         public void onItemClicked(Intent intent) {
@@ -136,4 +182,22 @@
             showDialog(id, bundle);
         }
     }
+
+    private class EditorFragmentListener implements ContactEditorFragment.Listener {
+        public void onContactNotFound() {
+            Toast.makeText(TwoPaneActivity.this, "onContactNotFound", Toast.LENGTH_LONG).show();
+        }
+
+        public void onDialogRequested(int id, Bundle bundle) {
+            Toast.makeText(TwoPaneActivity.this, "onDialogRequested", Toast.LENGTH_LONG).show();
+        }
+
+        public void onEditorRequested(Intent intent) {
+            Toast.makeText(TwoPaneActivity.this, "onEditorRequested", Toast.LENGTH_LONG).show();
+        }
+
+        public void onError() {
+            Toast.makeText(TwoPaneActivity.this, "onError", Toast.LENGTH_LONG).show();
+        }
+    }
 }
diff --git a/src/com/android/contacts/views/detail/ContactDetailFragment.java b/src/com/android/contacts/views/detail/ContactDetailFragment.java
index bfbd4d7..49471cc 100644
--- a/src/com/android/contacts/views/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/views/detail/ContactDetailFragment.java
@@ -103,6 +103,8 @@
     private Uri mLookupUri;
     private Listener mListener;
 
+    private boolean mIsInitialized;
+
     private ContactLoader.Result mContactData;
     private ContactDetailHeaderView mHeaderView;
     private ListView mListView;
@@ -194,11 +196,13 @@
 
     public void loadUri(Uri lookupUri) {
         mLookupUri = lookupUri;
-        startLoading(LOADER_DETAILS, null);
+        if (mIsInitialized) startLoading(LOADER_DETAILS, null);
     }
 
     @Override
     protected void onInitializeLoaders() {
+        mIsInitialized = true;
+        if (mLookupUri != null) startLoading(LOADER_DETAILS, null);
     }
 
     @Override
diff --git a/src/com/android/contacts/views/editor/ContactEditorFragment.java b/src/com/android/contacts/views/editor/ContactEditorFragment.java
index 384fa23..58f56ff 100644
--- a/src/com/android/contacts/views/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/views/editor/ContactEditorFragment.java
@@ -93,6 +93,8 @@
     private Uri mLookupUri;
     private Listener mListener;
 
+    private boolean mIsInitialized;
+
     private ContactLoader.Result mContactData;
     private ContactEditorHeaderView mHeaderView;
     private MyListView mListView;
@@ -144,11 +146,13 @@
 
     public void loadUri(Uri lookupUri) {
         mLookupUri = lookupUri;
-        startLoading(LOADER_DETAILS, null);
+        if (mIsInitialized) startLoading(LOADER_DETAILS, null);
     }
 
     @Override
     protected void onInitializeLoaders() {
+        mIsInitialized = true;
+        if (mLookupUri != null) startLoading(LOADER_DETAILS, null);
     }
 
     @Override