Merge "Browser: fix force close in rotating set-homepage dialog"
diff --git a/src/com/android/browser/preferences/GeneralPreferencesFragment.java b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
index c018474..2453f46 100644
--- a/src/com/android/browser/preferences/GeneralPreferencesFragment.java
+++ b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
@@ -17,6 +17,9 @@
 package com.android.browser.preferences;
 
 import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.content.res.Resources;
@@ -103,7 +106,7 @@
                 settings.setHomePage(HomeProvider.MOST_VISITED);
             }
             if (OTHER.equals(objValue)) {
-                promptForHomepage((ListPreference) pref);
+                promptForHomepage();
                 return false;
             }
             pref.setSummary(getHomepageSummary());
@@ -114,48 +117,10 @@
         return true;
     }
 
-    void promptForHomepage(final ListPreference pref) {
-        final BrowserSettings settings = BrowserSettings.getInstance();
-        final EditText editText = new EditText(getActivity());
-        editText.setInputType(InputType.TYPE_CLASS_TEXT
-                | InputType.TYPE_TEXT_VARIATION_URI);
-        editText.setText(settings.getHomePage());
-        editText.setSelectAllOnFocus(true);
-        editText.setSingleLine(true);
-        editText.setImeActionLabel(null, EditorInfo.IME_ACTION_DONE);
-        final AlertDialog dialog = new AlertDialog.Builder(getActivity())
-                .setView(editText)
-                .setPositiveButton(android.R.string.ok, new OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        String homepage = editText.getText().toString().trim();
-                        homepage = UrlUtils.smartUrlFilter(homepage);
-                        settings.setHomePage(homepage);
-                        pref.setValue(getHomepageValue());
-                        pref.setSummary(getHomepageSummary());
-                    }
-                })
-                .setNegativeButton(android.R.string.cancel, new OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        dialog.cancel();
-                    }
-                })
-                .setTitle(R.string.pref_set_homepage_to)
-                .create();
-        editText.setOnEditorActionListener(new OnEditorActionListener() {
-            @Override
-            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-                if (actionId == EditorInfo.IME_ACTION_DONE) {
-                    dialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
-                    return true;
-                }
-                return false;
-            }
-        });
-        dialog.getWindow().setSoftInputMode(
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
-        dialog.show();
+    void promptForHomepage() {
+        MyAlertDialogFragment fragment = MyAlertDialogFragment.newInstance();
+        fragment.setTargetFragment(this, -1);
+        fragment.show(getActivity().getFragmentManager(), "setHomepage dialog");
     }
 
     String getHomepageValue() {
@@ -211,4 +176,70 @@
                 (PreferenceScreen)findPreference(PreferenceKeys.PREF_AUTOFILL_PROFILE);
         autoFillSettings.setDependency(PreferenceKeys.PREF_AUTOFILL_ENABLED);
     }
+
+    /*
+      Add this class to manage AlertDialog lifecycle.
+    */
+    public static class MyAlertDialogFragment extends DialogFragment {
+        public static MyAlertDialogFragment newInstance() {
+            MyAlertDialogFragment frag = new MyAlertDialogFragment();
+            return frag;
+        }
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            final BrowserSettings settings = BrowserSettings.getInstance();
+            final EditText editText = new EditText(getActivity());
+            editText.setInputType(InputType.TYPE_CLASS_TEXT
+                    | InputType.TYPE_TEXT_VARIATION_URI);
+            editText.setText(settings.getHomePage());
+            editText.setSelectAllOnFocus(true);
+            editText.setSingleLine(true);
+            editText.setImeActionLabel(null, EditorInfo.IME_ACTION_DONE);
+            final AlertDialog dialog = new AlertDialog.Builder(getActivity())
+                    .setView(editText)
+                    .setPositiveButton(android.R.string.ok, new OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            String homepage = editText.getText().toString().trim();
+                            homepage = UrlUtils.smartUrlFilter(homepage);
+                            settings.setHomePage(homepage);
+                            Fragment frag = getTargetFragment();
+                            if (frag == null || !(frag instanceof GeneralPreferencesFragment)) {
+                                Log.e("MyAlertDialogFragment", "get target fragment error!");
+                                return;
+                            }
+                            GeneralPreferencesFragment target = (GeneralPreferencesFragment)frag;
+                            ListPreference pref = (ListPreference) target.
+                                    findPreference(PREF_HOMEPAGE_PICKER);
+                            pref.setValue(target.getHomepageValue());
+                            pref.setSummary(target.getHomepageSummary());
+                        }
+                    })
+                    .setNegativeButton(android.R.string.cancel, new OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            dialog.cancel();
+                        }
+                    })
+                    .setTitle(R.string.pref_set_homepage_to)
+                    .create();
+
+            editText.setOnEditorActionListener(new OnEditorActionListener() {
+                @Override
+                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+                    if (actionId == EditorInfo.IME_ACTION_DONE) {
+                        dialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+                        return true;
+                    }
+                    return false;
+                }
+            });
+
+            dialog.getWindow().setSoftInputMode(
+                    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+
+            return dialog;
+        }
+    }
 }