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 android.inputmethodservice; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.HandlerCaller; 20758143ecfedbe08cc6c4fed0ad8ad7a854194ca4Svetoslav Ganovimport com.android.internal.os.SomeArgs; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputMethodSession; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 26c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brownimport android.os.Looper; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 29c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brownimport android.util.SparseArray; 30c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brownimport android.view.InputChannel; 31c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brownimport android.view.InputDevice; 32c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brownimport android.view.InputEvent; 33c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brownimport android.view.InputEventReceiver; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedText; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodSession; 39c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawaimport android.view.inputmethod.CursorAnchorInfo; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass IInputMethodSessionWrapper extends IInputMethodSession.Stub 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements HandlerCaller.Callback { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "InputMethodWrapper"; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DO_FINISH_INPUT = 60; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DO_DISPLAY_COMPLETIONS = 65; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DO_UPDATE_EXTRACTED_TEXT = 67; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DO_UPDATE_SELECTION = 90; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DO_UPDATE_CURSOR = 95; 50c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa private static final int DO_UPDATE_CURSOR_ANCHOR_INFO = 99; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DO_APP_PRIVATE_COMMAND = 100; 524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private static final int DO_TOGGLE_SOFT_INPUT = 105; 530c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor private static final int DO_FINISH_SESSION = 110; 54863fcd62171e55bc9f2105d9fb5877df982454d8satok private static final int DO_VIEW_CLICKED = 115; 550c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor 560c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor HandlerCaller mCaller; 570c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor InputMethodSession mInputMethodSession; 58c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown InputChannel mChannel; 59c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown ImeInputEventReceiver mReceiver; 60c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInputMethodSessionWrapper(Context context, 62c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown InputMethodSession inputMethodSession, InputChannel channel) { 63ed218c706d9e91e75b94c448cee2e6150aaee57fMita Yun mCaller = new HandlerCaller(context, null, 64ed218c706d9e91e75b94c448cee2e6150aaee57fMita Yun this, true /*asyncHandler*/); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodSession = inputMethodSession; 66c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mChannel = channel; 67c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (channel != null) { 68c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mReceiver = new ImeInputEventReceiver(channel, context.getMainLooper()); 69c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputMethodSession getInternalInputMethodSession() { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInputMethodSession; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void executeMessage(Message msg) { 78c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (mInputMethodSession == null) { 79857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard // The session has been finished. Args needs to be recycled 80857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard // for cases below. 81857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard switch (msg.what) { 82857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard case DO_UPDATE_SELECTION: 83857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard case DO_APP_PRIVATE_COMMAND: { 84857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard SomeArgs args = (SomeArgs)msg.obj; 85857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard args.recycle(); 86857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard } 87857cdff07862b34d6f5f1815dec1d1e509594e35Henrik Baard } 88c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown return; 89c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 90a308c0326bef49293396ceca843bb595139ba38fKen Wakasa 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DO_FINISH_INPUT: 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodSession.finishInput(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DO_DISPLAY_COMPLETIONS: 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodSession.displayCompletions((CompletionInfo[])msg.obj); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DO_UPDATE_EXTRACTED_TEXT: 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodSession.updateExtractedText(msg.arg1, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (ExtractedText)msg.obj); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DO_UPDATE_SELECTION: { 103758143ecfedbe08cc6c4fed0ad8ad7a854194ca4Svetoslav Ganov SomeArgs args = (SomeArgs)msg.obj; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodSession.updateSelection(args.argi1, args.argi2, 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.argi3, args.argi4, args.argi5, args.argi6); 106758143ecfedbe08cc6c4fed0ad8ad7a854194ca4Svetoslav Ganov args.recycle(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DO_UPDATE_CURSOR: { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodSession.updateCursor((Rect)msg.obj); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 113c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa case DO_UPDATE_CURSOR_ANCHOR_INFO: { 114c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa mInputMethodSession.updateCursorAnchorInfo((CursorAnchorInfo)msg.obj); 115c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa return; 116c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DO_APP_PRIVATE_COMMAND: { 118758143ecfedbe08cc6c4fed0ad8ad7a854194ca4Svetoslav Ganov SomeArgs args = (SomeArgs)msg.obj; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodSession.appPrivateCommand((String)args.arg1, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (Bundle)args.arg2); 121758143ecfedbe08cc6c4fed0ad8ad7a854194ca4Svetoslav Ganov args.recycle(); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case DO_TOGGLE_SOFT_INPUT: { 1254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2); 1264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 1274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 1280c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor case DO_FINISH_SESSION: { 129c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown doFinishSession(); 1300c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor return; 1310c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor } 132863fcd62171e55bc9f2105d9fb5877df982454d8satok case DO_VIEW_CLICKED: { 133863fcd62171e55bc9f2105d9fb5877df982454d8satok mInputMethodSession.viewClicked(msg.arg1 == 1); 134863fcd62171e55bc9f2105d9fb5877df982454d8satok return; 135863fcd62171e55bc9f2105d9fb5877df982454d8satok } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unhandled message code: " + msg.what); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 139c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 140c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown private void doFinishSession() { 141c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mInputMethodSession = null; 142c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (mReceiver != null) { 143c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mReceiver.dispose(); 144c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mReceiver = null; 145c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 146c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (mChannel != null) { 147c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mChannel.dispose(); 148c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mChannel = null; 149c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 150c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 151c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 152c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishInput() { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT)); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 157c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void displayCompletions(CompletionInfo[] completions) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCaller.executeOrSendMessage(mCaller.obtainMessageO( 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DO_DISPLAY_COMPLETIONS, completions)); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 162c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 163c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateExtractedText(int token, ExtractedText text) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCaller.executeOrSendMessage(mCaller.obtainMessageIO( 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DO_UPDATE_EXTRACTED_TEXT, token, text)); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 168b38070caa5143ab9fd1883e0c7c879533a480bc7Victoria Lease 169c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateSelection(int oldSelStart, int oldSelEnd, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCaller.executeOrSendMessage(mCaller.obtainMessageIIIIII(DO_UPDATE_SELECTION, 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldSelStart, oldSelEnd, newSelStart, newSelEnd, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project candidatesStart, candidatesEnd)); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 176863fcd62171e55bc9f2105d9fb5877df982454d8satok 177c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 178863fcd62171e55bc9f2105d9fb5877df982454d8satok public void viewClicked(boolean focusChanged) { 179c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.executeOrSendMessage( 180c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.obtainMessageI(DO_VIEW_CLICKED, focusChanged ? 1 : 0)); 181863fcd62171e55bc9f2105d9fb5877df982454d8satok } 182863fcd62171e55bc9f2105d9fb5877df982454d8satok 183c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateCursor(Rect newCursor) { 185c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.executeOrSendMessage( 186c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.obtainMessageO(DO_UPDATE_CURSOR, newCursor)); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 188c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 189c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 190c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa public void updateCursorAnchorInfo(CursorAnchorInfo cursorAnchorInfo) { 191c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa mCaller.executeOrSendMessage( 192c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa mCaller.obtainMessageO(DO_UPDATE_CURSOR_ANCHOR_INFO, cursorAnchorInfo)); 193c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa } 194c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa 195c2ddd6023688db5ecf6c586e05f55e262b4a802eYohei Yukawa @Override 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void appPrivateCommand(String action, Bundle data) { 197c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.executeOrSendMessage( 198c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.obtainMessageOO(DO_APP_PRIVATE_COMMAND, action, data)); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 200c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 201c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 2024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void toggleSoftInput(int showFlags, int hideFlags) { 203c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.executeOrSendMessage( 204c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mCaller.obtainMessageII(DO_TOGGLE_SOFT_INPUT, showFlags, hideFlags)); 2054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 2060c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor 207c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 2080c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor public void finishSession() { 2090c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION)); 2100c33ed2992b2eb484c229fd3322df14d97c10caaDevin Taylor } 211c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 212c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown private final class ImeInputEventReceiver extends InputEventReceiver 213c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown implements InputMethodSession.EventCallback { 214c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown private final SparseArray<InputEvent> mPendingEvents = new SparseArray<InputEvent>(); 215c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 216c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown public ImeInputEventReceiver(InputChannel inputChannel, Looper looper) { 217c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown super(inputChannel, looper); 218c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 219c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 220c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 221c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown public void onInputEvent(InputEvent event) { 222c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (mInputMethodSession == null) { 223c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown // The session has been finished. 224c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown finishInputEvent(event, false); 225c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown return; 226c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 227c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 228c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown final int seq = event.getSequenceNumber(); 229c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mPendingEvents.put(seq, event); 230c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (event instanceof KeyEvent) { 231c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown KeyEvent keyEvent = (KeyEvent)event; 232c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mInputMethodSession.dispatchKeyEvent(seq, keyEvent, this); 233c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } else { 234c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown MotionEvent motionEvent = (MotionEvent)event; 235c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_TRACKBALL)) { 236c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mInputMethodSession.dispatchTrackballEvent(seq, motionEvent, this); 237c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } else { 238c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mInputMethodSession.dispatchGenericMotionEvent(seq, motionEvent, this); 239c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 240c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 241c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 242c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown 243c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown @Override 244c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown public void finishedEvent(int seq, boolean handled) { 245c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown int index = mPendingEvents.indexOfKey(seq); 246c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown if (index >= 0) { 247c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown InputEvent event = mPendingEvents.valueAt(index); 248c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown mPendingEvents.removeAt(index); 249c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown finishInputEvent(event, handled); 250c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 251c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 252c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 254