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

Commit d033285c authored by Lifu Tang's avatar Lifu Tang
Browse files

Worked around back button navigation issue

Calling startWithFragmentAsUser() without specifying FLAG_ACTIVITY_NEW_TASK to
the intent starting the fragment could cause a native stack corruption. See
b/17523189. However, adding that flag and start the preference panel with the
same UserHandler will make it impossible to use back button to return to the
previous screen. See b/20042570.

We work around this issue by adding FLAG_ACTIVITY_NEW_TASK to the intent, while
doing another check here to call startPreferencePanel() instead of
startWithFragmentAsUser() when we're calling it as the same user.

Bug: 20042570
Change-Id: I26b269414f410912b77aaa553a3fccebfa148659
parent 390910b3
Loading
Loading
Loading
Loading
+23 −9
Original line number Diff line number Diff line
@@ -928,6 +928,19 @@ public class SettingsActivity extends Activity
     */
    public void startPreferencePanelAsUser(String fragmentClass, Bundle args, int titleRes,
            CharSequence titleText, UserHandle userHandle) {
        // This is a workaround.
        //
        // Calling startWithFragmentAsUser() without specifying FLAG_ACTIVITY_NEW_TASK to the intent
        // starting the fragment could cause a native stack corruption. See b/17523189. However,
        // adding that flag and start the preference panel with the same UserHandler will make it
        // impossible to use back button to return to the previous screen. See b/20042570.
        //
        // We work around this issue by adding FLAG_ACTIVITY_NEW_TASK to the intent, while doing
        // another check here to call startPreferencePanel() instead of startWithFragmentAsUser()
        // when we're calling it as the same user.
        if (userHandle.getIdentifier() == UserHandle.myUserId()) {
            startPreferencePanel(fragmentClass, args, titleRes, titleText, null, 0);
        } else {
            String title = null;
            if (titleRes < 0) {
                if (titleText != null) {
@@ -940,6 +953,7 @@ public class SettingsActivity extends Activity
            Utils.startWithFragmentAsUser(this, fragmentClass, args,
                    titleRes, title, mIsShortcut, userHandle);
        }
    }

    /**
     * Called by a preference panel fragment to finish itself.
+2 −8
Original line number Diff line number Diff line
@@ -259,15 +259,9 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
        args.putIntArray(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
        args.putDoubleArray(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);

        // This is a workaround, see b/17523189
        if (userId == UserHandle.myUserId()) {
            caller.startPreferencePanel(PowerUsageDetail.class.getName(), args,
                    R.string.details_title, null, null, 0);
        } else {
        caller.startPreferencePanelAsUser(PowerUsageDetail.class.getName(), args,
                R.string.details_title, null, new UserHandle(userId));
    }
    }

    public static final int ACTION_DISPLAY_SETTINGS = 1;
    public static final int ACTION_WIFI_SETTINGS = 2;