19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.view;
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputContext;
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo;
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedText;
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedTextRequest;
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class InputConnectionWrapper implements InputConnection {
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAX_WAIT_TIME_MILLIS = 2000;
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final IInputContext mIInputContext;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class InputContextCallback extends IInputContextCallback.Stub {
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final String TAG = "InputConnectionWrapper.ICC";
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSeq;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mHaveValue;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mTextBeforeCursor;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mTextAfterCursor;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ExtractedText mExtractedText;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mCursorCapsMode;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // A 'pool' of one InputContextCallback.  Each ICW request will attempt to gain
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // exclusive access to this object.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static InputContextCallback sInstance = new InputContextCallback();
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static int sSequenceNumber = 1;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns an InputContextCallback object that is guaranteed not to be in use by
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * any other thread.  The returned object's 'have value' flag is cleared and its expected
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * sequence number is set to a new integer.  We use a sequence number so that replies that
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * occur after a timeout has expired are not interpreted as replies to a later request.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static InputContextCallback getInstance() {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (InputContextCallback.class) {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Return sInstance if it's non-null, otherwise construct a new callback
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputContextCallback callback;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sInstance != null) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    callback = sInstance;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sInstance = null;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Reset the callback
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    callback.mHaveValue = false;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    callback = new InputContextCallback();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Set the sequence number
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                callback.mSeq = sSequenceNumber++;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return callback;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Makes the given InputContextCallback available for use in the future.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void dispose() {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (InputContextCallback.class) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If sInstance is non-null, just let this object be garbage-collected
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sInstance == null) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Allow any objects being held to be gc'ed
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTextAfterCursor = null;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTextBeforeCursor = null;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mExtractedText = null;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sInstance = this;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setTextBeforeCursor(CharSequence textBeforeCursor, int seq) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (seq == mSeq) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTextBeforeCursor = textBeforeCursor;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHaveValue = true;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Got out-of-sequence callback " + seq + " (expected " + mSeq
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ") in setTextBeforeCursor, ignoring.");
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setTextAfterCursor(CharSequence textAfterCursor, int seq) {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (seq == mSeq) {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTextAfterCursor = textAfterCursor;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHaveValue = true;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Got out-of-sequence callback " + seq + " (expected " + mSeq
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ") in setTextAfterCursor, ignoring.");
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setCursorCapsMode(int capsMode, int seq) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (seq == mSeq) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCursorCapsMode = capsMode;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHaveValue = true;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Got out-of-sequence callback " + seq + " (expected " + mSeq
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ") in setCursorCapsMode, ignoring.");
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setExtractedText(ExtractedText extractedText, int seq) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (seq == mSeq) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mExtractedText = extractedText;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHaveValue = true;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "Got out-of-sequence callback " + seq + " (expected " + mSeq
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ") in setExtractedText, ignoring.");
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Waits for a result for up to {@link #MAX_WAIT_TIME_MILLIS} milliseconds.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <p>The caller must be synchronized on this callback object.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void waitForResultLocked() {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long startTime = SystemClock.uptimeMillis();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long endTime = startTime + MAX_WAIT_TIME_MILLIS;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (!mHaveValue) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long remainingTime = endTime - SystemClock.uptimeMillis();
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (remainingTime <= 0) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Timed out waiting on IInputContextCallback");
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wait(remainingTime);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public InputConnectionWrapper(IInputContext inputContext) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIInputContext = inputContext;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getTextAfterCursor(int length, int flags) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence value = null;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputContextCallback callback = InputContextCallback.getInstance();
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.getTextAfterCursor(length, flags, callback.mSeq, callback);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (callback) {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                callback.waitForResultLocked();
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (callback.mHaveValue) {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    value = callback.mTextAfterCursor;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            callback.dispose();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return value;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getTextBeforeCursor(int length, int flags) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence value = null;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputContextCallback callback = InputContextCallback.getInstance();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.getTextBeforeCursor(length, flags, callback.mSeq, callback);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (callback) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                callback.waitForResultLocked();
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (callback.mHaveValue) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    value = callback.mTextBeforeCursor;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            callback.dispose();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return value;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getCursorCapsMode(int reqModes) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = 0;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputContextCallback callback = InputContextCallback.getInstance();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.getCursorCapsMode(reqModes, callback.mSeq, callback);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (callback) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                callback.waitForResultLocked();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (callback.mHaveValue) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    value = callback.mCursorCapsMode;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            callback.dispose();
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return value;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ExtractedText value = null;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputContextCallback callback = InputContextCallback.getInstance();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.getExtractedText(request, flags, callback.mSeq, callback);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (callback) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                callback.waitForResultLocked();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (callback.mHaveValue) {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    value = callback.mExtractedText;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            callback.dispose();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return value;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean commitText(CharSequence text, int newCursorPosition) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.commitText(text, newCursorPosition);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean commitCompletion(CompletionInfo text) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.commitCompletion(text);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setSelection(int start, int end) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.setSelection(start, end);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performEditorAction(int actionCode) {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.performEditorAction(actionCode);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performContextMenuAction(int id) {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.performContextMenuAction(id);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setComposingText(CharSequence text, int newCursorPosition) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.setComposingText(text, newCursorPosition);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean finishComposingText() {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.finishComposingText();
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean beginBatchEdit() {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.beginBatchEdit();
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean endBatchEdit() {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.endBatchEdit();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean sendKeyEvent(KeyEvent event) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.sendKeyEvent(event);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean clearMetaKeyStates(int states) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.clearMetaKeyStates(states);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteSurroundingText(int leftLength, int rightLength) {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.deleteSurroundingText(leftLength, rightLength);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean reportFullscreenMode(boolean enabled) {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.reportFullscreenMode(enabled);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performPrivateCommand(String action, Bundle data) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIInputContext.performPrivateCommand(action, data);
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
352