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
This commit is contained in:
Fabrice Di Meglio
2014-03-06 19:12:14 -08:00
parent 0b63458c0b
commit 832e546185
2 changed files with 20 additions and 7 deletions

View File

@@ -1536,6 +1536,10 @@
<action android:name="android.settings.SYNC_SETTINGS" /> <action android:name="android.settings.SYNC_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.accounts.AccountSyncSettings" />
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/account_settings" />
</activity> </activity>
<activity android:name="com.android.settings.accounts.AddAccountSettings" <activity android:name="com.android.settings.accounts.AddAccountSettings"

View File

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