Have the add dialog maintain state across screen rotation

Change-Id: I44d61018e0ed4de32b0a8da3ecba999831987956
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 517d81d..5185f9a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -467,6 +467,7 @@
                   android:label="@string/user_dict_settings_titlebar"
                   android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"
                   android:windowSoftInputMode="stateVisible"
+                  android:noHistory="true"
                   android:excludeFromRecents="true">
             <intent-filter>
                 <action android:name="com.android.settings.USER_DICTIONARY_INSERT" />
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
index 17c986a..0f89a95 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
@@ -46,6 +46,10 @@
     public static final String EXTRA_LOCALE = "locale";
     private static final int FREQUENCY_FOR_USER_DICTIONARY_ADDS = 250;
 
+    private static final String STATE_KEY_IS_OPEN = "isOpen";
+    private static final String STATE_KEY_WORD = "word";
+    private static final String STATE_KEY_LOCALE = "locale";
+
     public static final String MODE_EDIT_ACTION = "com.android.settings.USER_DICTIONARY_EDIT";
     public static final String MODE_INSERT_ACTION = "com.android.settings.USER_DICTIONARY_INSERT";
     private static final int MODE_EDIT = 0;
@@ -56,6 +60,8 @@
     private String mOldWord;
     private String mLocale; // may not be null: will be converted to default locale if received null
 
+    private boolean mIsShowingMoreOptions = false;
+
     @Override
     public void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -70,20 +76,49 @@
             // Can never come here because we only support these two actions in the manifest
             throw new RuntimeException("Unsupported action: " + action);
         }
+
+        String savedWord = null;
+        String savedLocale = null;
+        if (null != savedInstanceState) {
+            mIsShowingMoreOptions =
+                    savedInstanceState.getBoolean(STATE_KEY_IS_OPEN, mIsShowingMoreOptions);
+            savedWord = savedInstanceState.getString(STATE_KEY_WORD);
+            savedLocale = savedInstanceState.getString(STATE_KEY_LOCALE);
+        }
+
         mOldWord = intent.getStringExtra(EXTRA_WORD);
-        final String locale = intent.getStringExtra(EXTRA_LOCALE); // this may be null
-        mLocale = null == locale ? Locale.getDefault().toString() : locale;
+        if (null != savedLocale) {
+            mLocale = savedLocale;
+        } else {
+            final String locale = intent.getStringExtra(EXTRA_LOCALE); // this may be null
+            mLocale = null == locale ? Locale.getDefault().toString() : locale;
+        }
         mEditText = (EditText)findViewById(R.id.user_dictionary_add_word_text);
-        if (null != mOldWord) {
+        if (null != savedWord) {
+            mEditText.setText(savedWord);
+            mEditText.setSelection(savedWord.length());
+        } else if (null != mOldWord) {
             mEditText.setText(mOldWord);
             mEditText.setSelection(mOldWord.length());
         }
+
+        if (mIsShowingMoreOptions) {
+            onClickMoreOptions(findViewById(R.id.user_dictionary_settings_add_dialog_more_options));
+        }
+
         final ViewGroup v = (ViewGroup)findViewById(R.id.user_dict_settings_add_dialog_top);
         final LayoutTransition transition = new LayoutTransition();
         transition.setStartDelay(LayoutTransition.APPEARING, 0);
         v.setLayoutTransition(transition);
     }
 
+    @Override
+    public void onSaveInstanceState(final Bundle outState) {
+        outState.putBoolean(STATE_KEY_IS_OPEN, mIsShowingMoreOptions);
+        outState.putString(STATE_KEY_WORD, mEditText.getText().toString());
+        outState.putString(STATE_KEY_LOCALE, mLocale);
+    }
+
     public void onClickCancel(final View v) {
         finish();
     }
@@ -184,6 +219,7 @@
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         localeSpinner.setAdapter(adapter);
         localeSpinner.setOnItemSelectedListener(this);
+        mIsShowingMoreOptions = true;
     }
 
     public void onClickLessOptions(final View v) {
@@ -194,6 +230,7 @@
                 .setVisibility(View.VISIBLE);
         findViewById(R.id.user_dictionary_settings_add_dialog_less_options)
                 .setVisibility(View.GONE);
+        mIsShowingMoreOptions = false;
     }
 
     @Override