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;
20aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
21aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawaimport android.annotation.NonNull;
22aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawaimport android.annotation.Nullable;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo;
31cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunneimport android.view.inputmethod.CorrectionInfo;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedTextRequest;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
349f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawaimport android.view.inputmethod.InputConnectionInspector;
359f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawaimport android.view.inputmethod.InputConnectionInspector.MissingMethodFlags;
36152944f4909c47917473293b258d266435c6ab35Yohei Yukawaimport android.view.inputmethod.InputContentInfo;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawapublic abstract class IInputConnectionWrapper extends IInputContext.Stub {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String TAG = "IInputConnectionWrapper";
40a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_TEXT_AFTER_CURSOR = 10;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_TEXT_BEFORE_CURSOR = 20;
43a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    private static final int DO_GET_SELECTED_TEXT = 25;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_CURSOR_CAPS_MODE = 30;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_GET_EXTRACTED_TEXT = 40;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_COMMIT_TEXT = 50;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_COMMIT_COMPLETION = 55;
48cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne    private static final int DO_COMMIT_CORRECTION = 56;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_SET_SELECTION = 57;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_PERFORM_EDITOR_ACTION = 58;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_PERFORM_CONTEXT_MENU_ACTION = 59;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_SET_COMPOSING_TEXT = 60;
53a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    private static final int DO_SET_COMPOSING_REGION = 63;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_FINISH_COMPOSING_TEXT = 65;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_SEND_KEY_EVENT = 70;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_DELETE_SURROUNDING_TEXT = 80;
57c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    private static final int DO_DELETE_SURROUNDING_TEXT_IN_CODE_POINTS = 81;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_BEGIN_BATCH_EDIT = 90;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_END_BATCH_EDIT = 95;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_REPORT_FULLSCREEN_MODE = 100;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_PERFORM_PRIVATE_COMMAND = 120;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DO_CLEAR_META_KEY_STATES = 130;
63a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa    private static final int DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO = 140;
649f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa    private static final int DO_CLOSE_CONNECTION = 150;
65adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa    private static final int DO_COMMIT_CONTENT = 160;
66a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
67aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @GuardedBy("mLock")
68aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @Nullable
69aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    private InputConnection mInputConnection;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Looper mMainLooper;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Handler mH;
73aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    private Object mLock = new Object();
74aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @GuardedBy("mLock")
75aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    private boolean mFinished = false;
761544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa    @GuardedBy("mLock")
771544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa    private String mInputMethodId;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class SomeArgs {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object arg1;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object arg2;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IInputContextCallback callback;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int seq;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class MyHandler extends Handler {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MyHandler(Looper looper) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(looper);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            executeMessage(msg);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
97aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    public IInputConnectionWrapper(Looper mainLooper, @NonNull InputConnection inputConnection) {
98aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        mInputConnection = inputConnection;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainLooper = mainLooper;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH = new MyHandler(mMainLooper);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
103aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    @Nullable
104aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    public InputConnection getInputConnection() {
105aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        synchronized (mLock) {
106aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa            return mInputConnection;
107aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        }
108aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    }
109aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
110aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    protected boolean isFinished() {
111aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        synchronized (mLock) {
112aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa            return mFinished;
113aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa        }
114aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    }
115aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
1161544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa    public String getInputMethodId() {
1171544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa        synchronized (mLock) {
1181544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa            return mInputMethodId;
1191544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa        }
1201544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa    }
1211544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa
1221544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa    public void setInputMethodId(final String inputMethodId) {
1231544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa        synchronized (mLock) {
1241544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa            mInputMethodId = inputMethodId;
1251544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa        }
1261544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa    }
1271544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa
128159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa    abstract protected boolean isActive();
129159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa
130159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa    /**
131159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     * Called when the user took some actions that should be taken into consideration to update the
132159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     * LRU list for input method rotation.
133159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     */
134159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa    abstract protected void onUserAction();
135159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa
136159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa    /**
137159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     * Called when the input method started or stopped full-screen mode.
1381544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa     * @param enabled {@code true} if the input method starts full-screen mode.
1391544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa     * @param calledInBackground {@code true} if this input connection is in a state when incoming
1401544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa     * events are usually ignored.
141159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa     */
1421544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa    abstract protected void onReportFullscreenMode(boolean enabled, boolean calledInBackground);
143159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextAfterCursor(int length, int flags, int seq, IInputContextCallback callback) {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIISC(DO_GET_TEXT_AFTER_CURSOR, length, flags, seq, callback));
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextBeforeCursor(int length, int flags, int seq, IInputContextCallback callback) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIISC(DO_GET_TEXT_BEFORE_CURSOR, length, flags, seq, callback));
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
152a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    public void getSelectedText(int flags, int seq, IInputContextCallback callback) {
153a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani        dispatchMessage(obtainMessageISC(DO_GET_SELECTED_TEXT, flags, seq, callback));
154a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    }
155a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getCursorCapsMode(int reqModes, int seq, IInputContextCallback callback) {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageISC(DO_GET_CURSOR_CAPS_MODE, reqModes, seq, callback));
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getExtractedText(ExtractedTextRequest request,
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags, int seq, IInputContextCallback callback) {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIOSC(DO_GET_EXTRACTED_TEXT, flags,
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                request, seq, callback));
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void commitText(CharSequence text, int newCursorPosition) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIO(DO_COMMIT_TEXT, newCursorPosition, text));
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void commitCompletion(CompletionInfo text) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageO(DO_COMMIT_COMPLETION, text));
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
174cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne    public void commitCorrection(CorrectionInfo info) {
175cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne        dispatchMessage(obtainMessageO(DO_COMMIT_CORRECTION, info));
176cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne    }
177cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelection(int start, int end) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_SET_SELECTION, start, end));
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performEditorAction(int id) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_PERFORM_EDITOR_ACTION, id, 0));
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performContextMenuAction(int id) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_PERFORM_CONTEXT_MENU_ACTION, id, 0));
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
190a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    public void setComposingRegion(int start, int end) {
191a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani        dispatchMessage(obtainMessageII(DO_SET_COMPOSING_REGION, start, end));
192a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani    }
193a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setComposingText(CharSequence text, int newCursorPosition) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageIO(DO_SET_COMPOSING_TEXT, newCursorPosition, text));
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishComposingText() {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessage(DO_FINISH_COMPOSING_TEXT));
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendKeyEvent(KeyEvent event) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageO(DO_SEND_KEY_EVENT, event));
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearMetaKeyStates(int states) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_CLEAR_META_KEY_STATES, states, 0));
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
210c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    public void deleteSurroundingText(int beforeLength, int afterLength) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_DELETE_SURROUNDING_TEXT,
212c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                beforeLength, afterLength));
213c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    }
214c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa
215c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa    public void deleteSurroundingTextInCodePoints(int beforeLength, int afterLength) {
216c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa        dispatchMessage(obtainMessageII(DO_DELETE_SURROUNDING_TEXT_IN_CODE_POINTS,
217c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                beforeLength, afterLength));
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void beginBatchEdit() {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessage(DO_BEGIN_BATCH_EDIT));
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endBatchEdit() {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessage(DO_END_BATCH_EDIT));
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reportFullscreenMode(boolean enabled) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageII(DO_REPORT_FULLSCREEN_MODE, enabled ? 1 : 0, 0));
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performPrivateCommand(String action, Bundle data) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchMessage(obtainMessageOO(DO_PERFORM_PRIVATE_COMMAND, action, data));
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
235adb435835fb9a5f2bb74d29930b239dde18504a7satok
236a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa    public void requestUpdateCursorAnchorInfo(int cursorUpdateMode, int seq,
2370023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa            IInputContextCallback callback) {
238a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa        dispatchMessage(obtainMessageISC(DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO, cursorUpdateMode,
239a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa                seq, callback));
2400023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa    }
2410023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa
2429f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa    public void closeConnection() {
2439f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa        dispatchMessage(obtainMessage(DO_CLOSE_CONNECTION));
244aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa    }
245aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
24645700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa    public void commitContent(InputContentInfo inputContentInfo, int flags, Bundle opts,
247152944f4909c47917473293b258d266435c6ab35Yohei Yukawa            int seq, IInputContextCallback callback) {
24845700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        dispatchMessage(obtainMessageIOOSC(DO_COMMIT_CONTENT, flags, inputContentInfo, opts, seq,
24945700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa                callback));
250152944f4909c47917473293b258d266435c6ab35Yohei Yukawa    }
251152944f4909c47917473293b258d266435c6ab35Yohei Yukawa
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchMessage(Message msg) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If we are calling this from the main thread, then we can call
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // right through.  Otherwise, we need to send the message to the
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // main thread.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Looper.myLooper() == mMainLooper) {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            executeMessage(msg);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.recycle();
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessage(msg);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
264aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void executeMessage(Message msg) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_TEXT_AFTER_CURSOR: {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
270aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getTextAfterCursor on inactive InputConnection");
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        args.callback.setTextAfterCursor(null, args.seq);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    args.callback.setTextAfterCursor(ic.getTextAfterCursor(
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            msg.arg1, msg.arg2), args.seq);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setTextAfterCursor", e);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_TEXT_BEFORE_CURSOR: {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
286aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getTextBeforeCursor on inactive InputConnection");
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        args.callback.setTextBeforeCursor(null, args.seq);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    args.callback.setTextBeforeCursor(ic.getTextBeforeCursor(
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            msg.arg1, msg.arg2), args.seq);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setTextBeforeCursor", e);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
299a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            case DO_GET_SELECTED_TEXT: {
300a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                SomeArgs args = (SomeArgs)msg.obj;
301a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                try {
302aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
303a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    if (ic == null || !isActive()) {
304a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                        Log.w(TAG, "getSelectedText on inactive InputConnection");
305a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                        args.callback.setSelectedText(null, args.seq);
306a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                        return;
307a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    }
308a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    args.callback.setSelectedText(ic.getSelectedText(
309a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                            msg.arg1), args.seq);
310a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                } catch (RemoteException e) {
311a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    Log.w(TAG, "Got RemoteException calling setSelectedText", e);
312a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                }
313a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                return;
314a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_CURSOR_CAPS_MODE: {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
318aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getCursorCapsMode on inactive InputConnection");
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        args.callback.setCursorCapsMode(0, args.seq);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    args.callback.setCursorCapsMode(ic.getCursorCapsMode(msg.arg1),
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            args.seq);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setCursorCapsMode", e);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_GET_EXTRACTED_TEXT: {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
334aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ic == null || !isActive()) {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "getExtractedText on inactive InputConnection");
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        args.callback.setExtractedText(null, args.seq);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    args.callback.setExtractedText(ic.getExtractedText(
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (ExtractedTextRequest)args.arg1, msg.arg1), args.seq);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Got RemoteException calling setExtractedText", e);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_COMMIT_TEXT: {
348aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "commitText on inactive InputConnection");
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.commitText((CharSequence)msg.obj, msg.arg1);
354159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa                onUserAction();
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_SET_SELECTION: {
358aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "setSelection on inactive InputConnection");
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.setSelection(msg.arg1, msg.arg2);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_PERFORM_EDITOR_ACTION: {
367aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "performEditorAction on inactive InputConnection");
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.performEditorAction(msg.arg1);
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_PERFORM_CONTEXT_MENU_ACTION: {
376aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "performContextMenuAction on inactive InputConnection");
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.performContextMenuAction(msg.arg1);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_COMMIT_COMPLETION: {
385aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "commitCompletion on inactive InputConnection");
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.commitCompletion((CompletionInfo)msg.obj);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
393cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne            case DO_COMMIT_CORRECTION: {
394aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
395cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                if (ic == null || !isActive()) {
396cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                    Log.w(TAG, "commitCorrection on inactive InputConnection");
397cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                    return;
398cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                }
399cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                ic.commitCorrection((CorrectionInfo)msg.obj);
400cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne                return;
401cf9cf2f40efc4ccf3f73e6fdb07725d9c00c4f91Gilles Debunne            }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_SET_COMPOSING_TEXT: {
403aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "setComposingText on inactive InputConnection");
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.setComposingText((CharSequence)msg.obj, msg.arg1);
409159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa                onUserAction();
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
412a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            case DO_SET_COMPOSING_REGION: {
413aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
414a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                if (ic == null || !isActive()) {
415a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    Log.w(TAG, "setComposingRegion on inactive InputConnection");
416a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                    return;
417a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                }
418a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                ic.setComposingRegion(msg.arg1, msg.arg2);
419a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani                return;
420a90b7f0125389b9e1040d2be82aad4ef74ea6071Amith Yamasani            }
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_FINISH_COMPOSING_TEXT: {
422aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Note we do NOT check isActive() here, because this is safe
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for an IME to call at any time, and we need to allow it
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // through to clean up our state after the IME has switched to
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // another client.
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "finishComposingText on inactive InputConnection");
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.finishComposingText();
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_SEND_KEY_EVENT: {
435aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "sendKeyEvent on inactive InputConnection");
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.sendKeyEvent((KeyEvent)msg.obj);
441159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa                onUserAction();
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_CLEAR_META_KEY_STATES: {
445aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "clearMetaKeyStates on inactive InputConnection");
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.clearMetaKeyStates(msg.arg1);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_DELETE_SURROUNDING_TEXT: {
454aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "deleteSurroundingText on inactive InputConnection");
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.deleteSurroundingText(msg.arg1, msg.arg2);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
462c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa            case DO_DELETE_SURROUNDING_TEXT_IN_CODE_POINTS: {
463aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
464c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                if (ic == null || !isActive()) {
465c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                    Log.w(TAG, "deleteSurroundingTextInCodePoints on inactive InputConnection");
466c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                    return;
467c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                }
468c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                ic.deleteSurroundingTextInCodePoints(msg.arg1, msg.arg2);
469c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa                return;
470c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa            }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_BEGIN_BATCH_EDIT: {
472aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "beginBatchEdit on inactive InputConnection");
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.beginBatchEdit();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_END_BATCH_EDIT: {
481aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "endBatchEdit on inactive InputConnection");
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.endBatchEdit();
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_REPORT_FULLSCREEN_MODE: {
490aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
4911544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                boolean isBackground = false;
4921544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                if (ic == null || !isActive()) {
493da589dffddaf4046d3b4fd8d14d5f984a1c4324aAndrei Stingaceanu                    Log.w(TAG, "reportFullscreenMode on inexistent InputConnection");
4941544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                    isBackground = true;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
496159dd47db34151314e2449347251ad32b30e5ea1Yohei Yukawa                final boolean enabled = msg.arg1 == 1;
4971544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                if (!isBackground) {
4981544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                    ic.reportFullscreenMode(enabled);
4991544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                }
5001544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                // Due to the nature of asynchronous event handling, currently InputMethodService
5011544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                // has relied on the fact that #reportFullscreenMode() can be handled even when the
5021544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                // InputConnection is inactive.  We have to notify this event to InputMethodManager.
5031544def0facda69c210b0ae64b17394ea2860d39Yohei Yukawa                onReportFullscreenMode(enabled, isBackground);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DO_PERFORM_PRIVATE_COMMAND: {
507aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                InputConnection ic = getInputConnection();
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ic == null || !isActive()) {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "performPrivateCommand on inactive InputConnection");
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SomeArgs args = (SomeArgs)msg.obj;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ic.performPrivateCommand((String)args.arg1,
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (Bundle)args.arg2);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
517a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa            case DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO: {
5180023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                SomeArgs args = (SomeArgs)msg.obj;
5190023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                try {
520aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
5210023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                    if (ic == null || !isActive()) {
5220023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                        Log.w(TAG, "requestCursorAnchorInfo on inactive InputConnection");
523a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa                        args.callback.setRequestUpdateCursorAnchorInfoResult(false, args.seq);
5240023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                        return;
5250023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                    }
526a277db28e990d1f6f74ace0c32fe92401660a840Yohei Yukawa                    args.callback.setRequestUpdateCursorAnchorInfoResult(
527d8636ea7ca78df83d6b04088eab7853f15f3e999Yohei Yukawa                            ic.requestCursorUpdates(msg.arg1), args.seq);
5280023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                } catch (RemoteException e) {
5290023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                    Log.w(TAG, "Got RemoteException calling requestCursorAnchorInfo", e);
5300023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                }
5310023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa                return;
5320023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa            }
5339f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa            case DO_CLOSE_CONNECTION: {
534aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                // Note that we do not need to worry about race condition here, because 1) mFinished
535aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                // is updated only inside this block, and 2) the code here is running on a Handler
5369f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                // hence we assume multiple DO_CLOSE_CONNECTION messages will not be handled at the
537aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                // same time.
538aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                if (isFinished()) {
539aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    return;
540aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                }
541aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                try {
542aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    InputConnection ic = getInputConnection();
543aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // Note we do NOT check isActive() here, because this is safe
544aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // for an IME to call at any time, and we need to allow it
545aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // through to clean up our state after the IME has switched to
546aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    // another client.
547aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    if (ic == null) {
548aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                        return;
549aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    }
5509f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                    @MissingMethodFlags
5519f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                    final int missingMethods = InputConnectionInspector.getMissingMethodFlags(ic);
5529f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                    if ((missingMethods & MissingMethodFlags.CLOSE_CONNECTION) == 0) {
5539f9afe526d1f8ad17c628fc9e1e839725ffe913eYohei Yukawa                        ic.closeConnection();
554aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    }
555aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                } finally {
556aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    synchronized (mLock) {
557aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                        mInputConnection = null;
558aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                        mFinished = true;
559aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                    }
560aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                }
561aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa                return;
562aaa38c9f1ae019f0fe8c3ba80630f26e582cc89cYohei Yukawa            }
563adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa            case DO_COMMIT_CONTENT: {
56445700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa                final int flags = msg.arg1;
565f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                final boolean grantUriPermission =
566f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                        (flags & InputConnection.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0;
567152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                SomeArgs args = (SomeArgs) msg.obj;
568152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                try {
569152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    InputConnection ic = getInputConnection();
570152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    if (ic == null || !isActive()) {
571adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                        Log.w(TAG, "commitContent on inactive InputConnection");
572adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                        args.callback.setCommitContentResult(false, args.seq);
573152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                        return;
574152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    }
575152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    final InputContentInfo inputContentInfo = (InputContentInfo) args.arg1;
576152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    if (inputContentInfo == null || !inputContentInfo.validate()) {
577adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                        Log.w(TAG, "commitContent with invalid inputContentInfo="
578152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                                + inputContentInfo);
579adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                        args.callback.setCommitContentResult(false, args.seq);
580152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                        return;
581152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                    }
582f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    if (grantUriPermission) {
58393278ca144bef7d8af7a014e278f552da1fcb38cYohei Yukawa                        try {
58493278ca144bef7d8af7a014e278f552da1fcb38cYohei Yukawa                            inputContentInfo.requestPermission();
58593278ca144bef7d8af7a014e278f552da1fcb38cYohei Yukawa                        } catch (Exception e) {
58693278ca144bef7d8af7a014e278f552da1fcb38cYohei Yukawa                            Log.e(TAG, "InputConnectionInfo.requestPermission() failed", e);
58793278ca144bef7d8af7a014e278f552da1fcb38cYohei Yukawa                            args.callback.setCommitContentResult(false, args.seq);
58893278ca144bef7d8af7a014e278f552da1fcb38cYohei Yukawa                            return;
58993278ca144bef7d8af7a014e278f552da1fcb38cYohei Yukawa                        }
590f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    }
591f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    final boolean result =
592f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                            ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2);
593f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    // If this request is not handled, then there is no reason to keep the URI
594f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    // permission.
595f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    if (grantUriPermission && !result) {
596f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                        inputContentInfo.releasePermission();
597f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    }
598f3806f57a59ede663f3fa2ad1f5080bdbf20e372Yohei Yukawa                    args.callback.setCommitContentResult(result, args.seq);
599152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                } catch (RemoteException e) {
600adebb52588b098a1af678d4e33a234ef1ce783b2Yohei Yukawa                    Log.w(TAG, "Got RemoteException calling commitContent", e);
601152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                }
602152944f4909c47917473293b258d266435c6ab35Yohei Yukawa                return;
603152944f4909c47917473293b258d266435c6ab35Yohei Yukawa            }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.w(TAG, "Unhandled message code: " + msg.what);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessage(int what) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageII(int what, int arg1, int arg2) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, arg2);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
615c89e22a6ff227089fde26daea186346029d1b32cYohei Yukawa
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageO(int what, Object arg1) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, 0, 0, arg1);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageISC(int what, int arg1, int seq, IInputContextCallback callback) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SomeArgs args = new SomeArgs();
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.callback = callback;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.seq = seq;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, 0, args);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageIISC(int what, int arg1, int arg2, int seq, IInputContextCallback callback) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SomeArgs args = new SomeArgs();
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.callback = callback;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.seq = seq;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, arg2, args);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6330023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa
63445700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa    Message obtainMessageIOOSC(int what, int arg1, Object objArg1, Object objArg2, int seq,
635152944f4909c47917473293b258d266435c6ab35Yohei Yukawa            IInputContextCallback callback) {
6360023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa        SomeArgs args = new SomeArgs();
63745700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        args.arg1 = objArg1;
63845700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        args.arg2 = objArg2;
6390023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa        args.callback = callback;
6400023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa        args.seq = seq;
64145700fa135e83ed44e4b69ca60cf12960a5898d7Yohei Yukawa        return mH.obtainMessage(what, arg1, 0, args);
6420023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa    }
6430023d0e0c4f5339b299d1eacbd4e7181c2fd271fYohei Yukawa
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageIOSC(int what, int arg1, Object arg2, int seq,
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IInputContextCallback callback) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SomeArgs args = new SomeArgs();
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.arg1 = arg2;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.callback = callback;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.seq = seq;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, 0, args);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageIO(int what, int arg1, Object arg2) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, arg1, 0, arg2);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Message obtainMessageOO(int what, Object arg1, Object arg2) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SomeArgs args = new SomeArgs();
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.arg1 = arg1;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.arg2 = arg2;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mH.obtainMessage(what, 0, 0, args);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
664