Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e3849af authored by Satoshi Kataoka's avatar Satoshi Kataoka Committed by satok
Browse files

Receive a user dictionary callback from Settings application

Bug: 7725834

The callback is sent when the user adds a word to the user dictionary.

Change-Id: Ieee9bfd50a9adbed1a769e3cd95d9cb2815c34b4
parent 9a147340
Loading
Loading
Loading
Loading
+66 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ import android.graphics.drawable.Drawable;
import android.inputmethodservice.ExtractEditText;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.os.SystemClock;
import android.provider.Settings;
import android.text.DynamicLayout;
@@ -187,6 +189,8 @@ public class Editor {

    private TextView mTextView;

    private final UserDictionaryListener mUserDictionaryListener = new UserDictionaryListener();

    Editor(TextView textView) {
        mTextView = textView;
    }
@@ -2602,6 +2606,11 @@ public class Editor {
                Intent intent = new Intent(Settings.ACTION_USER_DICTIONARY_INSERT);
                intent.putExtra("word", originalText);
                intent.putExtra("locale", mTextView.getTextServicesLocale().toString());
                // Put a listener to replace the original text with a word which the user
                // modified in a user dictionary dialog.
                mUserDictionaryListener.waitForUserDictionaryAdded(
                        mTextView, originalText, spanStart, spanEnd);
                intent.putExtra("listener", new Messenger(mUserDictionaryListener));
                intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
                mTextView.getContext().startActivity(intent);
                // There is no way to know if the word was indeed added. Re-check.
@@ -3820,4 +3829,61 @@ public class Editor {
        boolean mContentChanged;
        int mChangedStart, mChangedEnd, mChangedDelta;
    }

    /**
     * @hide
     */
    public static class UserDictionaryListener extends Handler {
        public TextView mTextView;
        public String mOriginalWord;
        public int mWordStart;
        public int mWordEnd;

        public void waitForUserDictionaryAdded(
                TextView tv, String originalWord, int spanStart, int spanEnd) {
            mTextView = tv;
            mOriginalWord = originalWord;
            mWordStart = spanStart;
            mWordEnd = spanEnd;
        }

        @Override
        public void handleMessage(Message msg) {
            final int code = msg.what;
            if (code == 0) { /* CODE_WORD_ADDED */
                if (!(msg.obj instanceof Bundle)) {
                    Log.w(TAG, "Illegal message. Abort handling onUserDictionaryAdded.");
                    return;
                }
                final Bundle bundle = (Bundle)msg.obj;
                final String originalWord = bundle.getString("originalWord");
                final String addedWord = bundle.getString("word");
                onUserDictionaryAdded(originalWord, addedWord);
            }
        }

        private void onUserDictionaryAdded(String originalWord, String addedWord) {
            if (TextUtils.isEmpty(mOriginalWord) || TextUtils.isEmpty(addedWord)) {
                return;
            }
            if (mWordStart < 0 || mWordEnd >= mTextView.length()) {
                return;
            }
            if (!mOriginalWord.equals(originalWord)) {
                return;
            }
            if (originalWord.equals(addedWord)) {
                return;
            }
            final Editable editable = (Editable) mTextView.getText();
            final String currentWord = editable.toString().substring(mWordStart, mWordEnd);
            if (!currentWord.equals(originalWord)) {
                return;
            }
            mTextView.replaceText_internal(mWordStart, mWordEnd, addedWord);
            // Move cursor at the end of the replaced word
            final int newCursorPosition = mWordStart + addedWord.length();
            mTextView.setCursorPosition_internal(newCursorPosition, newCursorPosition);
        }
    }
}