Fix bug #12991557 User taken to previously closed setting option

- fix behavior when we are closing the Drawer. Now will not trigger twice the same action
- fix selection in the Drawer for "Add Account": it basically should never be selected
as it is more like a button
- fix also Titles stack when launching an Intent
- remove some dead code

Change-Id: I196ad9fcd0599703f2abb902b088fbda9b4690a0
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 32ab523..bbe0e74 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -405,8 +405,11 @@
         public void onDrawerClosed(View drawerView) {
             mDrawerToggle.onDrawerClosed(drawerView);
             // Cannot process clicks when the App is finishing
-            if (isFinishing()) return;
-            onHeaderClick(mSelectedHeader);
+            if (isFinishing() || mSelectedHeader == null) {
+                return;
+            }
+            switchToHeader(mSelectedHeader, false);
+            mSelectedHeader = null;
         }
 
         @Override
@@ -594,12 +597,8 @@
                 // them and, depending on the screen, we may also show in-line
                 // the currently selected preference fragment.
                 if (mHeaders.size() > 0) {
-                    if (initialFragment == null) {
-                        Header h = onGetInitialHeader();
-                        switchToHeader(h, false);
-                    } else {
-                        switchToHeader(initialFragment, initialArguments, false);
-                    }
+                    Header h = onGetInitialHeader();
+                    switchToHeader(h, false);
                 }
             }
         }
@@ -785,31 +784,54 @@
      * @param validate true means that the fragment's Header needs to be validated
      */
     private void switchToHeader(Header header, boolean validate) {
-        if (mCurrentHeader == header) {
-            // This is the header we are currently displaying.  Just make sure
+        if (header == null) {
+            return;
+        }
+        if (header != null && mCurrentHeader != null && header.id == mCurrentHeader.id &&
+                header.id != R.id.account_add) {
+            // This is the header we are currently displaying (except "Add Account"). Just make sure
             // to pop the stack up to its root state.
             getFragmentManager().popBackStack(BACK_STACK_PREFS,
                     FragmentManager.POP_BACK_STACK_INCLUSIVE);
         } else {
-            mTitleStack.clear();
-            if (header.fragment == null) {
-                throw new IllegalStateException("can't switch to header that has no fragment");
-            }
-            switchToHeaderInner(header.fragment, header.fragmentArguments, validate);
-            setSelectedHeader(header);
-            final CharSequence title;
-            if (header.fragment.equals("com.android.settings.dashboard.DashboardSummary")) {
-                title = getResources().getString(R.string.settings_label);
+            if (header.fragment != null) {
+                mTitleStack.clear();
+                switchToHeaderInner(header.fragment, header.fragmentArguments, validate);
+                setSelectedHeader(header);
+                final TitlePair pair = new TitlePair(0, getHeaderTitle(header));
+                mTitleStack.add(pair);
+                setTitle(pair.second);
+            } else if (header.intent != null) {
+                setSelectedHeader(header);
+                mTitleStack.clear();
+                startActivity(header.intent);
             } else {
-                title = header.getTitle(getResources());
+                throw new IllegalStateException(
+                        "Can't switch to header that has no Fragment nor Intent");
             }
-            final TitlePair pair = new TitlePair(0, title);
-            mTitleStack.add(pair);
-            setTitle(title);
         }
     }
 
+    private CharSequence getHeaderTitle(Header header) {
+        final CharSequence title;
+        if (header.fragment.equals(DashboardSummary.class.getName())) {
+            title = getResources().getString(R.string.settings_label);
+        } else {
+            title = header.getTitle(getResources());
+        }
+        return title;
+    }
+
     private void setSelectedHeader(Header header) {
+        if (header == null) {
+            mCurrentHeader = null;
+            return;
+        }
+        // Update selected Header into Drawer only if it is not "Add Account"
+        if (header.id == R.id.account_add) {
+            mDrawer.clearChoices();
+            return;
+        }
         mCurrentHeader = header;
         int index = mHeaders.indexOf(header);
         if (mDrawer != null) {
@@ -1623,24 +1645,6 @@
         }
     }
 
-    /**
-     * Called when the user selects an item in the header list.  The default
-     * implementation will call either
-     * {@link #startWithFragment(String, android.os.Bundle, android.app.Fragment, int, int, CharSequence)}
-     * or {@link #switchToHeader(com.android.settings.SettingsActivity.Header, boolean)}
-     * as appropriate.
-     *
-     * @param header The header that was selected.
-     */
-    private void onHeaderClick(Header header) {
-        if (header == null) return;
-        if (header.fragment != null) {
-            switchToHeader(header, false);
-        } else if (header.intent != null) {
-            startActivity(header.intent);
-        }
-    }
-
     @Override
     public boolean shouldUpRecreateTask(Intent targetIntent) {
         return super.shouldUpRecreateTask(new Intent(this, SettingsActivity.class));