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;