Fix bug #13322417 stability-sys: Java crash in com.android.settings:
...java.lang.NullPointerException: Attempt to read from field
... 'long com.android.settings.SettingsActivity$Header.id' on a null object reference

- fix the AndroidManifest for missing meta data
- fix NPE causes in getHeaderTitle()
- update how we are putting Fragments on the BackStack

Change-Id: Ifc0bba744c3b2a0603c2f11f711ef493cbacc9d2
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 6b7bdc9..00e65f2 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -613,9 +613,9 @@
                 // the headers.
                 final int initialTitleResId = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0);
                 mInitialTitle = (initialTitleResId > 0) ? getText(initialTitleResId) : getTitle();
-
-                switchToHeader(initialFragment, initialArguments, true, mInitialTitle);
-                setSelectedHeaderByFragmentName(initialFragment);
+                setTitle(mInitialTitle);
+                switchToHeaderInner(initialFragment, initialArguments, true, false, mInitialTitle);
+                setSelectedHeaderByTopLevelId(mTopLevelHeaderId);
                 mInitialHeader = mCurrentHeader;
             } else {
                 // If there are headers, then at this point we need to show
@@ -800,6 +800,7 @@
     }
 
     private CharSequence getHeaderTitle(Header header) {
+        if (header == null || header.fragment == null) return getTitle();
         final CharSequence title;
         if (header.fragment.equals(DashboardSummary.class.getName())) {
             title = getResources().getString(R.string.settings_label);
@@ -809,12 +810,11 @@
         return title;
     }
 
-
-    private void setSelectedHeaderByFragmentName(String fragmentName) {
+    private void setSelectedHeaderByTopLevelId(int topLevelId) {
         final int count = mHeaders.size();
         for (int n = 0; n < count; n++) {
             Header h = mHeaders.get(n);
-            if (h.fragment != null && h.fragment.equals(fragmentName)) {
+            if (h.id == topLevelId) {
                 setSelectedHeader(h);
                 return;
             }
@@ -855,7 +855,16 @@
         // For switching to another Header it should be a different one
         if (mCurrentHeader == null || header.id != mCurrentHeader.id) {
             if (header.fragment != null) {
-                boolean addToBackStack = !initial && header.id != mInitialHeader.id;
+                boolean addToBackStack;
+                if (initial) {
+                    addToBackStack = false;
+                } else {
+                    if (header.id != mInitialHeader.id) {
+                        addToBackStack = true;
+                    } else {
+                        addToBackStack = (mTopLevelHeaderId > 0);
+                    }
+                }
                 switchToHeaderInner(header.fragment, header.fragmentArguments, validate,
                         addToBackStack, getHeaderTitle(header));
                 setSelectedHeader(header);