Move adding word functionality to the new interface

Step 4

Bug: 5306641
Change-Id: I150fd93e9802e92b4cf084867f0a9d1bc382cdae
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d3fcf45..517d81d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -470,6 +470,7 @@
                   android:excludeFromRecents="true">
             <intent-filter>
                 <action android:name="com.android.settings.USER_DICTIONARY_INSERT" />
+                <action android:name="com.android.settings.USER_DICTIONARY_EDIT" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
diff --git a/res/layout/user_dictionary_add_word.xml b/res/layout/user_dictionary_add_word.xml
index c6fe7de..39d4fb7 100644
--- a/res/layout/user_dictionary_add_word.xml
+++ b/res/layout/user_dictionary_add_word.xml
@@ -84,8 +84,8 @@
               style="?android:attr/buttonBarButtonStyle"
               android:textSize="14sp"
               android:text="@string/user_dict_settings_add_dialog_confirm"
-              android:layout_height="wrap_content" />
+              android:layout_height="wrap_content"
+              android:onClick="onClickConfirm" />
     </LinearLayout>
   </LinearLayout>
-
 </LinearLayout>
diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java
index 496947b..f4206eb 100644
--- a/src/com/android/settings/UserDictionarySettings.java
+++ b/src/com/android/settings/UserDictionarySettings.java
@@ -20,6 +20,7 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.ListFragment;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -44,16 +45,13 @@
 import android.widget.SimpleCursorAdapter;
 import android.widget.TextView;
 
-import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
+import com.android.settings.inputmethod.UserDictionaryAddWordActivity;
 
 import java.util.Locale;
 
-public class UserDictionarySettings extends ListFragment implements DialogCreatable {
+public class UserDictionarySettings extends ListFragment {
     private static final String TAG = "UserDictionarySettings";
 
-    private static final String INSTANCE_KEY_DIALOG_EDITING_WORD = "DIALOG_EDITING_WORD";
-    private static final String INSTANCE_KEY_ADDED_WORD = "DIALOG_ADDED_WORD";
-
     private static final String[] QUERY_PROJECTION = {
         UserDictionary.Words._ID, UserDictionary.Words.WORD
     };
@@ -70,26 +68,12 @@
 
     private static final String DELETE_SELECTION = UserDictionary.Words.WORD + "=?";
 
-    private static final String EXTRA_WORD = "word";
-
     private static final int OPTIONS_MENU_ADD = Menu.FIRST;
 
-    private static final int DIALOG_ADD_OR_EDIT = 0;
-
-    private static final int FREQUENCY_FOR_USER_DICTIONARY_ADDS = 250;
-
-    /** The word being edited in the dialog (null means the user is adding a word). */
-    private String mDialogEditingWord;
-
     private Cursor mCursor;
 
     protected String mLocale;
 
-    private boolean mAddedWordAlready;
-    private boolean mAutoReturn;
-
-    private SettingsDialogFragment mDialogFragment;
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -135,31 +119,6 @@
 
         setHasOptionsMenu(true);
 
-        if (savedInstanceState != null) {
-            mDialogEditingWord = savedInstanceState.getString(INSTANCE_KEY_DIALOG_EDITING_WORD);
-            mAddedWordAlready = savedInstanceState.getBoolean(INSTANCE_KEY_ADDED_WORD, false);
-        }
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        final Intent intent = getActivity().getIntent();
-        if (!mAddedWordAlready
-                && intent.getAction().equals("com.android.settings.USER_DICTIONARY_INSERT")) {
-            final String word = intent.getStringExtra(EXTRA_WORD);
-            mAutoReturn = true;
-            if (word != null) {
-                showAddOrEditDialog(word);
-            }
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putString(INSTANCE_KEY_DIALOG_EDITING_WORD, mDialogEditingWord);
-        outState.putBoolean(INSTANCE_KEY_ADDED_WORD, mAddedWordAlready);
     }
 
     private Cursor createCursor(final String locale) {
@@ -216,9 +175,18 @@
         return true;
     }
 
-    private void showAddOrEditDialog(String editingWord) {
-        mDialogEditingWord = editingWord;
-        showDialog(DIALOG_ADD_OR_EDIT);
+    /**
+     * Add or edit a word. If editingWord is null, it's an add; otherwise, it's an edit.
+     * @param editingWord the word to edit, or null if it's an add.
+     */
+    private void showAddOrEditDialog(final String editingWord) {
+        final Intent intent = new Intent(null == editingWord
+                ? UserDictionaryAddWordActivity.MODE_INSERT_ACTION
+                : UserDictionaryAddWordActivity.MODE_EDIT_ACTION);
+        // The following are fine if they are null
+        intent.putExtra(UserDictionaryAddWordActivity.EXTRA_WORD, editingWord);
+        intent.putExtra(UserDictionaryAddWordActivity.EXTRA_LOCALE, mLocale);
+        startActivity(intent);
     }
 
     private String getWord(int position) {
@@ -231,81 +199,8 @@
                 mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD));
     }
 
-    @Override
-    public Dialog onCreateDialog(int id) {
-        final Activity activity = getActivity();
-        final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
-        final LayoutInflater inflater = LayoutInflater.from(dialogBuilder.getContext());
-        final View content = inflater.inflate(R.layout.dialog_edittext, null);
-        final EditText editText = (EditText) content.findViewById(R.id.edittext);
-        editText.setText(mDialogEditingWord);
-        // No prediction in soft keyboard mode. TODO: Create a better way to disable prediction
-        editText.setInputType(InputType.TYPE_CLASS_TEXT 
-                | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
-
-        AlertDialog dialog = dialogBuilder
-                .setTitle(mDialogEditingWord != null 
-                        ? R.string.user_dict_settings_edit_dialog_title 
-                        : R.string.user_dict_settings_add_dialog_title)
-                .setView(content)
-                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        onAddOrEditFinished(editText.getText().toString());
-                        if (mAutoReturn) activity.onBackPressed();
-                    }})
-                .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        if (mAutoReturn) activity.onBackPressed();
-                    }})
-                .create();
-        dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
-        return dialog;
-    }
-
-    private void showDialog(int dialogId) {
-        if (mDialogFragment != null) {
-            Log.e(TAG, "Old dialog fragment not null!");
-        }
-        mDialogFragment = new SettingsDialogFragment(this, dialogId);
-        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
-    }
-
-    private void onAddOrEditFinished(String word) {
-        if (mDialogEditingWord != null) {
-            // The user was editing a word, so do a delete/add
-            deleteWord(mDialogEditingWord);
-        }
-
-        // Disallow duplicates
-        deleteWord(word);
-
-        // TODO: present UI for picking whether to add word to all locales, or current.
-        if (null == mLocale) {
-            // Null means insert with the default system locale.
-            UserDictionary.Words.addWord(getActivity(), word.toString(),
-                    FREQUENCY_FOR_USER_DICTIONARY_ADDS, UserDictionary.Words.LOCALE_TYPE_CURRENT);
-        } else if ("".equals(mLocale)) {
-            // Empty string means insert for all languages.
-            UserDictionary.Words.addWord(getActivity(), word.toString(),
-                    FREQUENCY_FOR_USER_DICTIONARY_ADDS, UserDictionary.Words.LOCALE_TYPE_ALL);
-        } else {
-            // TODO: fix the framework so that it can accept a locale when we add a word
-            // to the user dictionary instead of querying the system locale.
-            final Locale prevLocale = Locale.getDefault();
-            Locale.setDefault(Utils.createLocaleFromString(mLocale));
-            UserDictionary.Words.addWord(getActivity(), word.toString(),
-                    FREQUENCY_FOR_USER_DICTIONARY_ADDS, UserDictionary.Words.LOCALE_TYPE_CURRENT);
-            Locale.setDefault(prevLocale);
-        }
-        if (null != mCursor && !mCursor.requery()) {
-            throw new IllegalStateException("can't requery on already-closed cursor.");
-        }
-        mAddedWordAlready = true;
-    }
-
-    private void deleteWord(String word) {
-        getActivity().getContentResolver().delete(
+    public static void deleteWord(final String word, final ContentResolver resolver) {
+        resolver.delete(
                 UserDictionary.Words.CONTENT_URI, DELETE_SELECTION, new String[] { word });
     }
 
@@ -355,7 +250,8 @@
         }
 
         public void onClick(View v) {
-            mSettings.deleteWord((String) v.getTag());
+            UserDictionarySettings.deleteWord((String) v.getTag(),
+                    mSettings.getActivity().getContentResolver());
         }
     }
 }
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
index 61c4e3c..6d9e6ea 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
@@ -17,30 +17,93 @@
 package com.android.settings.inputmethod;
 
 import com.android.settings.R;
+import com.android.settings.UserDictionarySettings;
+import com.android.settings.Utils;
+
+import java.util.Locale;
 
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
+import android.provider.UserDictionary;
+import android.text.TextUtils;
 import android.view.View;
 import android.widget.EditText;
 
 public class UserDictionaryAddWordActivity extends Activity {
-    private static final String EXTRA_WORD = "word";
+    public static final String EXTRA_WORD = "word";
+    public static final String EXTRA_LOCALE = "locale";
+    private static final int FREQUENCY_FOR_USER_DICTIONARY_ADDS = 250;
+
+    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;
+    private static final int MODE_INSERT = 1;
 
     private EditText mEditText;
+    private int mMode; // Either MODE_EDIT or MODE_INSERT
+    private String mOldWord;
+    private String mLocale; // may be null
 
     @Override
     public void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.user_dictionary_add_word);
         final Intent intent = getIntent();
-        final String word = intent.getStringExtra(EXTRA_WORD);
+        final String action = intent.getAction();
+        if (MODE_EDIT_ACTION.equals(action)) {
+            mMode = MODE_EDIT;
+        } else if (MODE_INSERT_ACTION.equals(action)) {
+            mMode = MODE_INSERT;
+        } else {
+            // Can never come here because we only support these two actions in the manifest
+            throw new RuntimeException("Unsupported action: " + action);
+        }
+        mOldWord = intent.getStringExtra(EXTRA_WORD);
+        mLocale = intent.getStringExtra(EXTRA_LOCALE); // this may be null
         mEditText = (EditText)findViewById(R.id.user_dictionary_add_word_text);
-        mEditText.setText(word);
-        mEditText.setSelection(word.length());
+        if (null != mOldWord) {
+            mEditText.setText(mOldWord);
+            mEditText.setSelection(mOldWord.length());
+        }
     }
 
     public void onClickCancel(final View v) {
         finish();
     }
+
+    public void onClickConfirm(final View v) {
+        if (MODE_EDIT == mMode && !TextUtils.isEmpty(mOldWord)) {
+            UserDictionarySettings.deleteWord(mOldWord, this.getContentResolver());
+        }
+        final String newWord = mEditText.getText().toString();
+        if (TextUtils.isEmpty(newWord)) {
+            // If the word is somehow empty, don't insert it.
+            // TODO: grey out the Ok button when the text is empty?
+            finish();
+            return;
+        }
+        // Disallow duplicates.
+        // TODO: Redefine the logic when we support shortcuts.
+        UserDictionarySettings.deleteWord(newWord, this.getContentResolver());
+
+        if (null == mLocale) {
+            // Null means insert with the default system locale.
+            UserDictionary.Words.addWord(this, newWord.toString(),
+                    FREQUENCY_FOR_USER_DICTIONARY_ADDS, UserDictionary.Words.LOCALE_TYPE_CURRENT);
+        } else if ("".equals(mLocale)) {
+            // Empty string means insert for all languages.
+            UserDictionary.Words.addWord(this, newWord.toString(),
+                    FREQUENCY_FOR_USER_DICTIONARY_ADDS, UserDictionary.Words.LOCALE_TYPE_ALL);
+        } else {
+            // TODO: fix the framework so that it can accept a locale when we add a word
+            // to the user dictionary instead of querying the system locale.
+            final Locale prevLocale = Locale.getDefault();
+            Locale.setDefault(Utils.createLocaleFromString(mLocale));
+            UserDictionary.Words.addWord(this, newWord.toString(),
+                    FREQUENCY_FOR_USER_DICTIONARY_ADDS, UserDictionary.Words.LOCALE_TYPE_CURRENT);
+            Locale.setDefault(prevLocale);
+        }
+        finish();
+    }
 }