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
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index eecf7a2..df9b9ad 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -928,17 +928,31 @@
*/
public void startPreferencePanelAsUser(String fragmentClass, Bundle args, int titleRes,
CharSequence titleText, UserHandle userHandle) {
- String title = null;
- if (titleRes < 0) {
- if (titleText != null) {
- title = titleText.toString();
- } else {
- // There not much we can do in that case
- title = "";
+ // 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) {
+ title = titleText.toString();
+ } else {
+ // There not much we can do in that case
+ title = "";
+ }
}
+ Utils.startWithFragmentAsUser(this, fragmentClass, args,
+ titleRes, title, mIsShortcut, userHandle);
}
- Utils.startWithFragmentAsUser(this, fragmentClass, args,
- titleRes, title, mIsShortcut, userHandle);
}
/**
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index e3c8dab..8d01eea 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -259,14 +259,8 @@
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));
- }
+ caller.startPreferencePanelAsUser(PowerUsageDetail.class.getName(), args,
+ R.string.details_title, null, new UserHandle(userId));
}
public static final int ACTION_DISPLAY_SETTINGS = 1;