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

Commit 0995398e authored by Jean Chalard's avatar Jean Chalard
Browse files

Don't change the text in reaction to a user dict add

This is a confusing interface. The user should be able
to edit the word in the dialog, and the text should be
unchanged.

Bug: 9902905
Change-Id: I24e93df37583f6051046fd6a84a4cbb10d99c046
parent 737d2c0b
Loading
Loading
Loading
Loading
+0 −66
Original line number Diff line number Diff line
@@ -205,8 +205,6 @@ public class Editor {

    private TextView mTextView;

    private final UserDictionaryListener mUserDictionaryListener = new UserDictionaryListener();

    Editor(TextView textView) {
        mTextView = textView;
    }
@@ -2707,9 +2705,6 @@ public class Editor {
                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.
@@ -3915,67 +3910,6 @@ public class Editor {
        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) {
            switch(msg.what) {
                case 0: /* CODE_WORD_ADDED */
                case 2: /* CODE_ALREADY_PRESENT */
                    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);
                    return;
                default:
                    return;
            }
        }

        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);
        }
    }

    public static class UndoInputFilter implements InputFilter {
        final Editor mEditor;