Preserving detail URI on orientation change

Change-Id: Ia84cd323398e9503f9fe883db792ef388565124d
diff --git a/src/com/android/contacts/activities/ContactListActivity.java b/src/com/android/contacts/activities/ContactListActivity.java
index c483d0b..7b8eccc 100644
--- a/src/com/android/contacts/activities/ContactListActivity.java
+++ b/src/com/android/contacts/activities/ContactListActivity.java
@@ -98,8 +98,6 @@
     private NavigationBar mNavigationBar;
     private int mMode = -1;
 
-    public Uri mSelectedContactLookupUri;
-
     public ContactListActivity() {
         mIntentResolver = new ContactsIntentResolver(this);
     }
@@ -109,6 +107,14 @@
         if (fragment instanceof ContactBrowseListFragment) {
             mListFragment = (ContactBrowseListFragment)fragment;
             mListFragment.setOnContactListActionListener(new ContactBrowserActionListener());
+        } else if (fragment instanceof ContactNoneFragment) {
+            mEmptyFragment = (ContactNoneFragment)fragment;
+        } else if (fragment instanceof ContactDetailFragment) {
+            mDetailFragment = (ContactDetailFragment)fragment;
+            mDetailFragment.setListener(mDetailFragmentListener);
+        } else if (fragment instanceof ContactEditorFragment) {
+            mEditorFragment = (ContactEditorFragment)fragment;
+            mEditorFragment.setListener(mEditorFragmentListener);
         }
     }
 
@@ -186,6 +192,7 @@
 
         mNavigationBar = new NavigationBar(this);
         mNavigationBar.onCreate(savedState, mRequest);
+        mNavigationBar.setListener(this);
 
         ActionBar actionBar = getActionBar();
         View navBarView = mNavigationBar.onCreateView(getLayoutInflater());
@@ -195,9 +202,10 @@
             configureListFragment();
         }
 
-        setupContactDetailFragment();
+        if (mEmptyFragment == null && mDetailFragment == null && mEditorFragment == null) {
+            setupContactDetailFragment(null);
+        }
 
-        mNavigationBar.setListener(this);
     }
 
     @Override
@@ -264,22 +272,21 @@
         }
     }
 
-    private void setupContactDetailFragment() {
+    private void setupContactDetailFragment(Uri contactLookupUri) {
         // No editor here
         closeEditorFragment();
 
-        if (mSelectedContactLookupUri != null) {
+        if (contactLookupUri != null) {
             // Already showing? Nothing to do
             if (mDetailFragment != null) {
-                mDetailFragment.loadUri(mSelectedContactLookupUri);
+                mDetailFragment.loadUri(contactLookupUri);
                 return;
             }
 
             closeEmptyFragment();
 
             mDetailFragment = new ContactDetailFragment();
-            mDetailFragment.setListener(mDetailFragmentListener);
-            mDetailFragment.loadUri(mSelectedContactLookupUri);
+            mDetailFragment.loadUri(contactLookupUri);
 
             // Nothing showing yet? Create (this happens during Activity-Startup)
             openFragmentTransaction()
@@ -304,7 +311,6 @@
         if (mEditorFragment != null) return;
 
         mEditorFragment = new ContactEditorFragment();
-        mEditorFragment.setListener(mEditorFragmentListener);
 
         // Nothing showing yet? Create (this happens during Activity-Startup)
         openFragmentTransaction()
@@ -410,8 +416,7 @@
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
         public void onViewContactAction(Uri contactLookupUri) {
             if (mTwoPaneLayout) {
-                mSelectedContactLookupUri = contactLookupUri;
-                setupContactDetailFragment();
+                setupContactDetailFragment(contactLookupUri);
             } else {
                 startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
             }
diff --git a/src/com/android/contacts/views/detail/ContactDetailFragment.java b/src/com/android/contacts/views/detail/ContactDetailFragment.java
index cb6eba6..a7319f5 100644
--- a/src/com/android/contacts/views/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/views/detail/ContactDetailFragment.java
@@ -95,6 +95,8 @@
         implements OnCreateContextMenuListener, OnItemClickListener {
     private static final String TAG = "ContactDetailFragment";
 
+    private static final String KEY_LOOKUP_URI = "lookupUri";
+
     private static final int MENU_ITEM_MAKE_DEFAULT = 3;
 
     private static final int LOADER_DETAILS = 1;
@@ -164,6 +166,24 @@
     }
 
     @Override
+    public void onCreate(Bundle savedState) {
+        super.onCreate(savedState);
+
+        if (savedState != null) {
+            mLookupUri = savedState.getParcelable(KEY_LOOKUP_URI);
+            if (mLookupUri != null) {
+                loadUri(mLookupUri);
+            }
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putParcelable(KEY_LOOKUP_URI, mLookupUri);
+    }
+
+    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
         final View view = inflater.inflate(R.layout.contact_detail_fragment, container, false);
 
@@ -811,6 +831,7 @@
         menu.findItem(R.id.menu_share).setEnabled(!mAllRestricted);
     }
 
+    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.menu_edit: {
@@ -866,6 +887,7 @@
         if (mListener != null) mListener.onDialogRequested(id, null);
     }
 
+    @Override
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
         AdapterView.AdapterContextMenuInfo info;
         try {
@@ -957,6 +979,7 @@
         }
     }
 
+    @Override
     public boolean onContextItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case MENU_ITEM_MAKE_DEFAULT: {
diff --git a/src/com/android/contacts/views/editor/ContactEditorFragment.java b/src/com/android/contacts/views/editor/ContactEditorFragment.java
index d6baa9c..8fd8473 100644
--- a/src/com/android/contacts/views/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/views/editor/ContactEditorFragment.java
@@ -104,6 +104,8 @@
 
     private static final int LOADER_DATA = 1;
 
+    private static final String KEY_URI = "uri";
+    private static final String KEY_ACTION = "action";
     private static final String KEY_EDIT_STATE = "state";
     private static final String KEY_RAW_CONTACT_ID_REQUESTING_PHOTO = "photorequester";
     private static final String KEY_VIEW_ID_GENERATOR = "viewidgenerator";
@@ -212,7 +214,13 @@
 
     @Override
     public void onCreate(Bundle savedState) {
-        // TODO: Currently savedState is always null (framework issue). Test once this is fixed
+        if (savedState != null) {
+            // Restore mUri before calling super.onCreate so that onInitializeLoaders
+            // would already have a uri and an action to work with
+            mUri = savedState.getParcelable(KEY_URI);
+            mAction = savedState.getString(KEY_ACTION);
+        }
+
         super.onCreate(savedState);
 
         if (savedState == null) {
@@ -1287,6 +1295,9 @@
 
     @Override
     public void onSaveInstanceState(Bundle outState) {
+        outState.putParcelable(KEY_URI, mUri);
+        outState.putString(KEY_ACTION, mAction);
+
         if (hasValidState()) {
             // Store entities with modifications
             outState.putParcelable(KEY_EDIT_STATE, mState);
@@ -1303,6 +1314,7 @@
         super.onSaveInstanceState(outState);
     }
 
+    @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         // Ignore failed requests
         if (resultCode != Activity.RESULT_OK) return;