Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 832e5461 authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

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
parent 0b63458c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1536,6 +1536,10 @@
                <action android:name="android.settings.SYNC_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </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 android:name="com.android.settings.accounts.AddAccountSettings"
+16 −7
Original line number Diff line number Diff line
@@ -613,9 +613,9 @@ public class SettingsActivity extends Activity
                // 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 @@ public class SettingsActivity extends Activity
    }

    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 @@ public class SettingsActivity extends Activity
        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 @@ public class SettingsActivity extends Activity
        // 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);