3244931 ANR while in settings attempting to enable Accessibility->Talkabout (IKXEVEREST-1847)

Change-Id: Ifea9324671d0e80a417f4b2fe6dbbe981f8b0679
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index a2f701d..6f0c91f 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -23,7 +23,6 @@
 import android.content.ContentResolver;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceFragment;
@@ -49,9 +48,6 @@
 
     private SettingsDialogFragment mDialogFragment;
 
-    private int mResultCode = Activity.RESULT_CANCELED;
-    private Intent mResultData;
-
     private Button mNextButton;
 
     @Override
@@ -114,18 +110,55 @@
     }
 
     public static class SettingsDialogFragment extends DialogFragment {
+        private static final String KEY_DIALOG_ID = "key_dialog_id";
+        private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
+
         private int mDialogId;
 
-        private DialogCreatable mFragment;
+        private Fragment mParentFragment;
+
+        public SettingsDialogFragment() {
+            /* do nothing */
+        }
 
         public SettingsDialogFragment(DialogCreatable fragment, int dialogId) {
             mDialogId = dialogId;
-            mFragment = fragment;
+            if (!(fragment instanceof Fragment)) {
+                throw new IllegalArgumentException("fragment argument must be an instance of "
+                        + Fragment.class.getName());
+            }
+            mParentFragment = (Fragment) fragment;
+        }
+
+        @Override
+        public void onActivityCreated(Bundle savedInstanceState) {
+            if (savedInstanceState != null) {
+                mDialogId = savedInstanceState.getInt(KEY_DIALOG_ID, 0);
+                int mParentFragmentId = savedInstanceState.getInt(KEY_PARENT_FRAGMENT_ID, -1);
+                if (mParentFragmentId > -1) {
+                    mParentFragment = getFragmentManager().findFragmentById(mParentFragmentId);
+                    if (!(mParentFragment instanceof DialogCreatable)) {
+                        throw new IllegalArgumentException(
+                                KEY_PARENT_FRAGMENT_ID + " must implement "
+                                        + DialogCreatable.class.getName());
+                    }
+                }
+            }
+            super.onActivityCreated(savedInstanceState);
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            if (mParentFragment != null) {
+                outState.putInt(KEY_DIALOG_ID, mDialogId);
+                outState.putInt(KEY_PARENT_FRAGMENT_ID, mParentFragment.getId());
+            }
         }
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return mFragment.onCreateDialog(mDialogId);
+            return ((DialogCreatable) mParentFragment).onCreateDialog(mDialogId);
         }
 
         public int getDialogId() {