Merge "Call back to whom requested to add a word to the user dict" into jb-mr1.1-dev
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
index e52ab7a..627e7c6 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
@@ -21,6 +21,9 @@
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
 import android.view.View;
 
 public class UserDictionaryAddWordActivity extends Activity {
@@ -30,6 +33,9 @@
     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 CODE_WORD_ADDED = 0;
+    private static final int CODE_CANCEL = 1;
+
     private UserDictionaryAddWordContents mContents;
 
     @Override
@@ -67,12 +73,29 @@
         mContents.saveStateIntoBundle(outState);
     }
 
+    private void reportBackToCaller(final Bundle result) {
+        final Intent senderIntent = getIntent();
+        final Object listener = senderIntent.getExtras().get("listener");
+        if (!(listener instanceof Messenger)) return; // This will work if listener is null too.
+        final Messenger messenger = (Messenger)listener;
+
+        final Message m = Message.obtain();
+        m.obj = result;
+        m.what = (null != result) ? CODE_WORD_ADDED : CODE_CANCEL;
+        try {
+            messenger.send(m);
+        } catch (RemoteException e) {
+            // Couldn't report back, but there is nothing we can do to fix it
+        }
+    }
+
     public void onClickCancel(final View v) {
+        reportBackToCaller(null);
         finish();
     }
 
     public void onClickConfirm(final View v) {
-        mContents.apply(this);
+        reportBackToCaller(mContents.apply(this));
         finish();
     }
 }
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java
index e46b19c..f28b4e5 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java
@@ -43,6 +43,8 @@
     public static final String EXTRA_WORD = "word";
     public static final String EXTRA_SHORTCUT = "shortcut";
     public static final String EXTRA_LOCALE = "locale";
+    public static final String EXTRA_ORIGINAL_WORD = "originalWord";
+    public static final String EXTRA_ORIGINAL_SHORTCUT = "originalShortcut";
 
     public static final int MODE_EDIT = 0;
     public static final int MODE_INSERT = 1;
@@ -82,9 +84,13 @@
 
     /* package */ void saveStateIntoBundle(final Bundle outState) {
         outState.putString(EXTRA_WORD, mWordEditText.getText().toString());
+        outState.putString(EXTRA_ORIGINAL_WORD, mOldWord);
         if (null != mShortcutEditText) {
             outState.putString(EXTRA_SHORTCUT, mShortcutEditText.getText().toString());
         }
+        if (null != mOldShortcut) {
+            outState.putString(EXTRA_ORIGINAL_SHORTCUT, mOldShortcut);
+        }
         outState.putString(EXTRA_LOCALE, mLocale);
     }
 
@@ -97,7 +103,7 @@
         // If we are in add mode, nothing was added, so we don't need to do anything.
     }
 
-    /* package */ void apply(final Context context) {
+    /* package */ Bundle apply(final Context context) {
         final ContentResolver resolver = context.getContentResolver();
         if (MODE_EDIT == mMode && !TextUtils.isEmpty(mOldWord)) {
             // Mode edit: remove the old entry.
@@ -117,13 +123,13 @@
         }
         if (TextUtils.isEmpty(newWord)) {
             // If the word is somehow empty, don't insert it.
-            return;
+            return null;
         }
         // If there is no shortcut, and the word already exists in the database, then we
         // should not insert, because either A. the word exists with no shortcut, in which
         // case the exact same thing we want to insert is already there, or B. the word
         // exists with at least one shortcut, in which case it has priority on our word.
-        if (hasWord(newWord, context)) return;
+        if (hasWord(newWord, context)) return null;
 
         // Disallow duplicates. If the same word with no shortcut is defined, remove it; if
         // the same word with the same shortcut is defined, remove it; but we don't mind if
@@ -139,6 +145,10 @@
         UserDictionary.Words.addWord(context, newWord.toString(),
                 FREQUENCY_FOR_USER_DICTIONARY_ADDS, newShortcut,
                 TextUtils.isEmpty(mLocale) ? null : Utils.createLocaleFromString(mLocale));
+
+        final Bundle returnValues = new Bundle();
+        saveStateIntoBundle(returnValues);
+        return returnValues;
     }
 
     private static final String[] HAS_WORD_PROJECTION = { UserDictionary.Words.WORD };