115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawaimport com.android.internal.annotations.GuardedBy;
20ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawaimport com.android.internal.os.SomeArgs;
21aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
22aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawaimport android.annotation.NonNull;
23aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawaimport android.annotation.Nullable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo;
32cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunneimport android.view.inputmethod.CorrectionInfo;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedTextRequest;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
359f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawaimport android.view.inputmethod.InputConnectionInspector;
369f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawaimport android.view.inputmethod.InputConnectionInspector.MissingMethodFlags;
37152944f4909c47917473293b258d266435c6ab35Yohei Yukawaimport android.view.inputmethod.InputContentInfo;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawapublic abstract class IInputConnectionWrapper extends IInputContext.Stub {
4077e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa    private static final String TAG = "IInputConnectionWrapper";
4177e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa    private static final boolean DEBUG = false;
42a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_TEXT_AFTER_CURSOR = 10;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_TEXT_BEFORE_CURSOR = 20;
45a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    private static final int DO_GET_SELECTED_TEXT = 25;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_CURSOR_CAPS_MODE = 30;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_EXTRACTED_TEXT = 40;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_COMMIT_TEXT = 50;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_COMMIT_COMPLETION = 55;
50cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne    private static final int DO_COMMIT_CORRECTION = 56;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_SET_SELECTION = 57;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_PERFORM_EDITOR_ACTION = 58;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_PERFORM_CONTEXT_MENU_ACTION = 59;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_SET_COMPOSING_TEXT = 60;
55a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    private static final int DO_SET_COMPOSING_REGION = 63;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_FINISH_COMPOSING_TEXT = 65;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_SEND_KEY_EVENT = 70;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_DELETE_SURROUNDING_TEXT = 80;
59c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    private static final int DO_DELETE_SURROUNDING_TEXT_IN_CODE_POINTS = 81;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_BEGIN_BATCH_EDIT = 90;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_END_BATCH_EDIT = 95;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_PERFORM_PRIVATE_COMMAND = 120;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_CLEAR_META_KEY_STATES = 130;
64a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa    private static final int DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO = 140;
659f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa    private static final int DO_CLOSE_CONNECTION = 150;
66adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa    private static final int DO_COMMIT_CONTENT = 160;
67a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
68aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @GuardedBy("mLock")
69aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @Nullable
70aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    private InputConnection mInputConnection;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Looper mMainLooper;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Handler mH;
74aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    private Object mLock = new Object();
75aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @GuardedBy("mLock")
76aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    private boolean mFinished = false;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class MyHandler extends Handler {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MyHandler(Looper looper) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(looper);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            executeMessage(msg);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    public IInputConnectionWrapper(Looper mainLooper, @NonNull InputConnection inputConnection) {
90aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        mInputConnection = inputConnection;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainLooper = mainLooper;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH = new MyHandler(mMainLooper);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @Nullable
96aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    public InputConnection getInputConnection() {
97aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        synchronized (mLock) {
98aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa            return mInputConnection;
99aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        }
100aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    }
101aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
102aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    protected boolean isFinished() {
103aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        synchronized (mLock) {
104aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa            return mFinished;
105aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        }
106aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    }
107aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
108159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa    abstract protected boolean isActive();
109159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa
110159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa    /**
111159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     * Called when the user took some actions that should be taken into consideration to update the
112159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     * LRU list for input method rotation.
113159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     */
114159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa    abstract protected void onUserAction();
115159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextAfterCursor(int length, int flags, int seq, IInputContextCallback callback) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIISC(DO_GET_TEXT_AFTER_CURSOR, length, flags, seq, callback));
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextBeforeCursor(int length, int flags, int seq, IInputContextCallback callback) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIISC(DO_GET_TEXT_BEFORE_CURSOR, length, flags, seq, callback));
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
124a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    public void getSelectedText(int flags, int seq, IInputContextCallback callback) {
125a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani        dispatchMessage(obtainMessageISC(DO_GET_SELECTED_TEXT, flags, seq, callback));
126a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    }
127a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getCursorCapsMode(int reqModes, int seq, IInputContextCallback callback) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageISC(DO_GET_CURSOR_CAPS_MODE, reqModes, seq, callback));
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getExtractedText(ExtractedTextRequest request,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags, int seq, IInputContextCallback callback) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIOSC(DO_GET_EXTRACTED_TEXT, flags,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                request, seq, callback));
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void commitText(CharSequence text, int newCursorPosition) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIO(DO_COMMIT_TEXT, newCursorPosition, text));
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void commitCompletion(CompletionInfo text) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageO(DO_COMMIT_COMPLETION, text));
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
146cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne    public void commitCorrection(CorrectionInfo info) {
147cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne        dispatchMessage(obtainMessageO(DO_COMMIT_CORRECTION, info));
148cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne    }
149cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelection(int start, int end) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_SET_SELECTION, start, end));
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performEditorAction(int id) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_PERFORM_EDITOR_ACTION, id, 0));
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performContextMenuAction(int id) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_PERFORM_CONTEXT_MENU_ACTION, id, 0));
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
162a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    public void setComposingRegion(int start, int end) {
163a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani        dispatchMessage(obtainMessageII(DO_SET_COMPOSING_REGION, start, end));
164a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    }
165a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setComposingText(CharSequence text, int newCursorPosition) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIO(DO_SET_COMPOSING_TEXT, newCursorPosition, text));
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishComposingText() {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessage(DO_FINISH_COMPOSING_TEXT));
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendKeyEvent(KeyEvent event) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageO(DO_SEND_KEY_EVENT, event));
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearMetaKeyStates(int states) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_CLEAR_META_KEY_STATES, states, 0));
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
182c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    public void deleteSurroundingText(int beforeLength, int afterLength) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_DELETE_SURROUNDING_TEXT,
184c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                beforeLength, afterLength));
185c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    }
186c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa
187c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    public void deleteSurroundingTextInCodePoints(int beforeLength, int afterLength) {
188c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa        dispatchMessage(obtainMessageII(DO_DELETE_SURROUNDING_TEXT_IN_CODE_POINTS,
189c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                beforeLength, afterLength));
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void beginBatchEdit() {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessage(DO_BEGIN_BATCH_EDIT));
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endBatchEdit() {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessage(DO_END_BATCH_EDIT));
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performPrivateCommand(String action, Bundle data) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageOO(DO_PERFORM_PRIVATE_COMMAND, action, data));
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
203adb435835fb9a5f2bb74d29930b239dde18504a7satok
204a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa    public void requestUpdateCursorAnchorInfo(int cursorUpdateMode, int seq,
2050023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa            IInputContextCallback callback) {
206a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa        dispatchMessage(obtainMessageISC(DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO, cursorUpdateMode,
207a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa                seq, callback));
2080023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa    }
2090023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa
2109f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa    public void closeConnection() {
2119f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa        dispatchMessage(obtainMessage(DO_CLOSE_CONNECTION));
212aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    }
213aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
21445700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa    public void commitContent(InputContentInfo inputContentInfo, int flags, Bundle opts,
215152944f4909c47917473293b258d266435c6ab35Yohei Yukawa            int seq, IInputContextCallback callback) {
21645700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        dispatchMessage(obtainMessageIOOSC(DO_COMMIT_CONTENT, flags, inputContentInfo, opts, seq,
21745700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa                callback));
218152944f4909c47917473293b258d266435c6ab35Yohei Yukawa    }
219152944f4909c47917473293b258d266435c6ab35Yohei Yukawa
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchMessage(Message msg) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If we are calling this from the main thread, then we can call
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // right through.  Otherwise, we need to send the message to the
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // main thread.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Looper.myLooper() == mMainLooper) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            executeMessage(msg);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.recycle();
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessage(msg);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
232aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void executeMessage(Message msg) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_TEXT_AFTER_CURSOR: {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
238ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final IInputContextCallback callback = (IInputContextCallback) args.arg6;
239ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final int callbackSeq = args.argi6;
240aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getTextAfterCursor on inactive InputConnection");
243ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setTextAfterCursor(null, callbackSeq);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
246ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    callback.setTextAfterCursor(ic.getTextAfterCursor(
247ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                            msg.arg1, msg.arg2), callbackSeq);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setTextAfterCursor", e);
250ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
251ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_TEXT_BEFORE_CURSOR: {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
258ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final IInputContextCallback callback = (IInputContextCallback) args.arg6;
259ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final int callbackSeq = args.argi6;
260aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getTextBeforeCursor on inactive InputConnection");
263ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setTextBeforeCursor(null, callbackSeq);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
266ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    callback.setTextBeforeCursor(ic.getTextBeforeCursor(
267ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                            msg.arg1, msg.arg2), callbackSeq);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setTextBeforeCursor", e);
270ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
271ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
275a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            case DO_GET_SELECTED_TEXT: {
276a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                SomeArgs args = (SomeArgs)msg.obj;
277a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                try {
278ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final IInputContextCallback callback = (IInputContextCallback) args.arg6;
279ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final int callbackSeq = args.argi6;
280aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
281a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    if (ic == null || !isActive()) {
282a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                        Log.w(TAG, "getSelectedText on inactive InputConnection");
283ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setSelectedText(null, callbackSeq);
284a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                        return;
285a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    }
286ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    callback.setSelectedText(ic.getSelectedText(
287ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                            msg.arg1), callbackSeq);
288a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                } catch (RemoteException e) {
289a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    Log.w(TAG, "Got RemoteException calling setSelectedText", e);
290ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
291ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
292a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                }
293a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                return;
294a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_CURSOR_CAPS_MODE: {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
298ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final IInputContextCallback callback = (IInputContextCallback) args.arg6;
299ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final int callbackSeq = args.argi6;
300aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getCursorCapsMode on inactive InputConnection");
303ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setCursorCapsMode(0, callbackSeq);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
306ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    callback.setCursorCapsMode(ic.getCursorCapsMode(msg.arg1),
307ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                            callbackSeq);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setCursorCapsMode", e);
310ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
311ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_EXTRACTED_TEXT: {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
318ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final IInputContextCallback callback = (IInputContextCallback) args.arg6;
319ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final int callbackSeq = args.argi6;
320aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getExtractedText on inactive InputConnection");
323ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setExtractedText(null, callbackSeq);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
326ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    callback.setExtractedText(ic.getExtractedText(
327ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                            (ExtractedTextRequest)args.arg1, msg.arg1), callbackSeq);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setExtractedText", e);
330ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
331ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_COMMIT_TEXT: {
336aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "commitText on inactive InputConnection");
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.commitText((CharSequence)msg.obj, msg.arg1);
342159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa                onUserAction();
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_SET_SELECTION: {
346aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "setSelection on inactive InputConnection");
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.setSelection(msg.arg1, msg.arg2);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_PERFORM_EDITOR_ACTION: {
355aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "performEditorAction on inactive InputConnection");
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.performEditorAction(msg.arg1);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_PERFORM_CONTEXT_MENU_ACTION: {
364aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "performContextMenuAction on inactive InputConnection");
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.performContextMenuAction(msg.arg1);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_COMMIT_COMPLETION: {
373aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "commitCompletion on inactive InputConnection");
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.commitCompletion((CompletionInfo)msg.obj);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
381cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne            case DO_COMMIT_CORRECTION: {
382aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
383cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                if (ic == null || !isActive()) {
384cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                    Log.w(TAG, "commitCorrection on inactive InputConnection");
385cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                    return;
386cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                }
387cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                ic.commitCorrection((CorrectionInfo)msg.obj);
388cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                return;
389cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne            }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_SET_COMPOSING_TEXT: {
391aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "setComposingText on inactive InputConnection");
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.setComposingText((CharSequence)msg.obj, msg.arg1);
397159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa                onUserAction();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
400a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            case DO_SET_COMPOSING_REGION: {
401aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
402a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                if (ic == null || !isActive()) {
403a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    Log.w(TAG, "setComposingRegion on inactive InputConnection");
404a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    return;
405a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                }
406a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                ic.setComposingRegion(msg.arg1, msg.arg2);
407a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                return;
408a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_FINISH_COMPOSING_TEXT: {
41077e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                if (isFinished()) {
41177e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                    // In this case, #finishComposingText() is guaranteed to be called already.
41277e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                    // There should be no negative impact if we ignore this call silently.
41377e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                    if (DEBUG) {
41477e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                        Log.w(TAG, "Bug 35301295: Redundant finishComposingText.");
41577e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                    }
41677e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                    return;
41777e51831a448b03cbeeea8ea286b1d584dca74d4Yohei Yukawa                }
418aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Note we do NOT check isActive() here, because this is safe
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for an IME to call at any time, and we need to allow it
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // through to clean up our state after the IME has switched to
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // another client.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null) {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "finishComposingText on inactive InputConnection");
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.finishComposingText();
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_SEND_KEY_EVENT: {
431aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "sendKeyEvent on inactive InputConnection");
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.sendKeyEvent((KeyEvent)msg.obj);
437159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa                onUserAction();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_CLEAR_META_KEY_STATES: {
441aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "clearMetaKeyStates on inactive InputConnection");
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.clearMetaKeyStates(msg.arg1);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_DELETE_SURROUNDING_TEXT: {
450aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "deleteSurroundingText on inactive InputConnection");
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.deleteSurroundingText(msg.arg1, msg.arg2);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
458c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa            case DO_DELETE_SURROUNDING_TEXT_IN_CODE_POINTS: {
459aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
460c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                if (ic == null || !isActive()) {
461c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                    Log.w(TAG, "deleteSurroundingTextInCodePoints on inactive InputConnection");
462c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                    return;
463c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                }
464c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                ic.deleteSurroundingTextInCodePoints(msg.arg1, msg.arg2);
465c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                return;
466c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa            }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_BEGIN_BATCH_EDIT: {
468aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "beginBatchEdit on inactive InputConnection");
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.beginBatchEdit();
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_END_BATCH_EDIT: {
477aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "endBatchEdit on inactive InputConnection");
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.endBatchEdit();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_PERFORM_PRIVATE_COMMAND: {
486ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                final SomeArgs args = (SomeArgs) msg.obj;
487ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                try {
488ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final String action = (String) args.arg1;
489ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final Bundle data = (Bundle) args.arg2;
490ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    InputConnection ic = getInputConnection();
491ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    if (ic == null || !isActive()) {
492ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        Log.w(TAG, "performPrivateCommand on inactive InputConnection");
493ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        return;
494ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    }
495ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    ic.performPrivateCommand(action, data);
496ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
497ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4993dd5fbc569ac67f34e887da5d101e5984ade3945Yohei Yukawa                return;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
501a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa            case DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO: {
5020023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                SomeArgs args = (SomeArgs)msg.obj;
5030023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                try {
504ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final IInputContextCallback callback = (IInputContextCallback) args.arg6;
505ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final int callbackSeq = args.argi6;
506aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
5070023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                    if (ic == null || !isActive()) {
5080023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                        Log.w(TAG, "requestCursorAnchorInfo on inactive InputConnection");
509ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setRequestUpdateCursorAnchorInfoResult(false, callbackSeq);
5100023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                        return;
5110023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                    }
512ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    callback.setRequestUpdateCursorAnchorInfoResult(
513ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                            ic.requestCursorUpdates(msg.arg1), callbackSeq);
5140023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                } catch (RemoteException e) {
5150023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                    Log.w(TAG, "Got RemoteException calling requestCursorAnchorInfo", e);
516ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
517ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
5180023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                }
5190023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                return;
5200023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa            }
5219f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa            case DO_CLOSE_CONNECTION: {
522aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                // Note that we do not need to worry about race condition here, because 1) mFinished
523aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                // is updated only inside this block, and 2) the code here is running on a Handler
5249f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                // hence we assume multiple DO_CLOSE_CONNECTION messages will not be handled at the
525aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                // same time.
526aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                if (isFinished()) {
527aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    return;
528aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                }
529aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                try {
530aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
531aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // Note we do NOT check isActive() here, because this is safe
532aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // for an IME to call at any time, and we need to allow it
533aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // through to clean up our state after the IME has switched to
534aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // another client.
535aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    if (ic == null) {
536aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                        return;
537aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    }
5389f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                    @MissingMethodFlags
5399f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                    final int missingMethods = InputConnectionInspector.getMissingMethodFlags(ic);
5409f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                    if ((missingMethods & MissingMethodFlags.CLOSE_CONNECTION) == 0) {
5419f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                        ic.closeConnection();
542aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    }
543aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                } finally {
544aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    synchronized (mLock) {
545aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                        mInputConnection = null;
546aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                        mFinished = true;
547aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    }
548aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                }
549aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                return;
550aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa            }
551adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa            case DO_COMMIT_CONTENT: {
55245700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa                final int flags = msg.arg1;
553152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                SomeArgs args = (SomeArgs) msg.obj;
554152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                try {
555ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final IInputContextCallback callback = (IInputContextCallback) args.arg6;
556ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    final int callbackSeq = args.argi6;
557152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    InputConnection ic = getInputConnection();
558152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    if (ic == null || !isActive()) {
559adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                        Log.w(TAG, "commitContent on inactive InputConnection");
560ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setCommitContentResult(false, callbackSeq);
561152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                        return;
562152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    }
563152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    final InputContentInfo inputContentInfo = (InputContentInfo) args.arg1;
564152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    if (inputContentInfo == null || !inputContentInfo.validate()) {
565adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                        Log.w(TAG, "commitContent with invalid inputContentInfo="
566152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                                + inputContentInfo);
567ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                        callback.setCommitContentResult(false, callbackSeq);
568152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                        return;
569152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    }
570f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    final boolean result =
571f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                            ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2);
572ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    callback.setCommitContentResult(result, callbackSeq);
573152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                } catch (RemoteException e) {
574adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                    Log.w(TAG, "Got RemoteException calling commitContent", e);
575ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                } finally {
576ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa                    args.recycle();
577152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                }
578152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                return;
579152944f4909c47917473293b258d266435c6ab35Yohei Yukawa            }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "Unhandled message code: " + msg.what);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
583ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessage(int what) {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what);
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
587ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageII(int what, int arg1, int arg2) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, arg2);
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
591c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageO(int what, Object arg1) {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, 0, 0, arg1);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
595ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa
596ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa    Message obtainMessageISC(int what, int arg1, int callbackSeq, IInputContextCallback callback) {
597ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        final SomeArgs args = SomeArgs.obtain();
598ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.arg6 = callback;
599ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.argi6 = callbackSeq;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, 0, args);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
602ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa
603ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa    Message obtainMessageIISC(int what, int arg1, int arg2, int callbackSeq,
604ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa            IInputContextCallback callback) {
605ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        final SomeArgs args = SomeArgs.obtain();
606ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.arg6 = callback;
607ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.argi6 = callbackSeq;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, arg2, args);
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6100023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa
611ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa    Message obtainMessageIOOSC(int what, int arg1, Object objArg1, Object objArg2, int callbackSeq,
612152944f4909c47917473293b258d266435c6ab35Yohei Yukawa            IInputContextCallback callback) {
613ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        final SomeArgs args = SomeArgs.obtain();
61445700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        args.arg1 = objArg1;
61545700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        args.arg2 = objArg2;
616ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.arg6 = callback;
617ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.argi6 = callbackSeq;
61845700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        return mH.obtainMessage(what, arg1, 0, args);
6190023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa    }
6200023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa
621ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa    Message obtainMessageIOSC(int what, int arg1, Object arg2, int callbackSeq,
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IInputContextCallback callback) {
623ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        final SomeArgs args = SomeArgs.obtain();
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.arg1 = arg2;
625ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.arg6 = callback;
626ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        args.argi6 = callbackSeq;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, 0, args);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
629ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageIO(int what, int arg1, Object arg2) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, 0, arg2);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
633ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageOO(int what, Object arg1, Object arg2) {
635ce82eb2d865e5ee1b69705ca7a0aedd0e92d0d4eYohei Yukawa        final SomeArgs args = SomeArgs.obtain();
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.arg1 = arg1;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.arg2 = arg2;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, 0, 0, args);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
641