blob: df8cf9a8164f0fadda65327b313ead3949b1a0b3 [file] [log] [blame]
Kenny Root15a4d2f2010-03-11 18:20:12 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080017package android.inputmethodservice;
18
19import com.android.internal.os.HandlerCaller;
20import com.android.internal.view.IInputMethodCallback;
21import com.android.internal.view.IInputMethodSession;
22
23import android.content.Context;
24import android.graphics.Rect;
25import android.os.Bundle;
26import android.os.Message;
27import android.os.RemoteException;
28import android.util.Log;
29import android.view.KeyEvent;
30import android.view.MotionEvent;
31import android.view.inputmethod.CompletionInfo;
32import android.view.inputmethod.ExtractedText;
33import android.view.inputmethod.InputMethodSession;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034
35class IInputMethodSessionWrapper extends IInputMethodSession.Stub
36 implements HandlerCaller.Callback {
37 private static final String TAG = "InputMethodWrapper";
38 private static final boolean DEBUG = false;
39
40 private static final int DO_FINISH_INPUT = 60;
41 private static final int DO_DISPLAY_COMPLETIONS = 65;
42 private static final int DO_UPDATE_EXTRACTED_TEXT = 67;
43 private static final int DO_DISPATCH_KEY_EVENT = 70;
44 private static final int DO_DISPATCH_TRACKBALL_EVENT = 80;
45 private static final int DO_UPDATE_SELECTION = 90;
46 private static final int DO_UPDATE_CURSOR = 95;
47 private static final int DO_APP_PRIVATE_COMMAND = 100;
The Android Open Source Project4df24232009-03-05 14:34:35 -080048 private static final int DO_TOGGLE_SOFT_INPUT = 105;
Devin Taylor0c33ed22010-02-23 13:26:46 -060049 private static final int DO_FINISH_SESSION = 110;
50
51 HandlerCaller mCaller;
52 InputMethodSession mInputMethodSession;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080053
54 // NOTE: we should have a cache of these.
55 static class InputMethodEventCallbackWrapper implements InputMethodSession.EventCallback {
56 final IInputMethodCallback mCb;
57 InputMethodEventCallbackWrapper(IInputMethodCallback cb) {
58 mCb = cb;
59 }
60 public void finishedEvent(int seq, boolean handled) {
61 try {
62 mCb.finishedEvent(seq, handled);
63 } catch (RemoteException e) {
64 }
65 }
66 }
67
68 public IInputMethodSessionWrapper(Context context,
69 InputMethodSession inputMethodSession) {
70 mCaller = new HandlerCaller(context, this);
71 mInputMethodSession = inputMethodSession;
72 }
73
74 public InputMethodSession getInternalInputMethodSession() {
75 return mInputMethodSession;
76 }
77
78 public void executeMessage(Message msg) {
Ken Wakasaa308c032011-01-25 14:02:07 +090079 if (mInputMethodSession == null) return;
80
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081 switch (msg.what) {
82 case DO_FINISH_INPUT:
83 mInputMethodSession.finishInput();
84 return;
85 case DO_DISPLAY_COMPLETIONS:
86 mInputMethodSession.displayCompletions((CompletionInfo[])msg.obj);
87 return;
88 case DO_UPDATE_EXTRACTED_TEXT:
89 mInputMethodSession.updateExtractedText(msg.arg1,
90 (ExtractedText)msg.obj);
91 return;
92 case DO_DISPATCH_KEY_EVENT: {
93 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
94 mInputMethodSession.dispatchKeyEvent(msg.arg1,
95 (KeyEvent)args.arg1,
96 new InputMethodEventCallbackWrapper(
97 (IInputMethodCallback)args.arg2));
98 mCaller.recycleArgs(args);
99 return;
100 }
101 case DO_DISPATCH_TRACKBALL_EVENT: {
102 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
103 mInputMethodSession.dispatchTrackballEvent(msg.arg1,
104 (MotionEvent)args.arg1,
105 new InputMethodEventCallbackWrapper(
106 (IInputMethodCallback)args.arg2));
107 mCaller.recycleArgs(args);
108 return;
109 }
110 case DO_UPDATE_SELECTION: {
111 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
112 mInputMethodSession.updateSelection(args.argi1, args.argi2,
113 args.argi3, args.argi4, args.argi5, args.argi6);
114 mCaller.recycleArgs(args);
115 return;
116 }
117 case DO_UPDATE_CURSOR: {
118 mInputMethodSession.updateCursor((Rect)msg.obj);
119 return;
120 }
121 case DO_APP_PRIVATE_COMMAND: {
122 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
123 mInputMethodSession.appPrivateCommand((String)args.arg1,
124 (Bundle)args.arg2);
125 mCaller.recycleArgs(args);
126 return;
127 }
The Android Open Source Project4df24232009-03-05 14:34:35 -0800128 case DO_TOGGLE_SOFT_INPUT: {
129 mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2);
130 return;
131 }
Devin Taylor0c33ed22010-02-23 13:26:46 -0600132 case DO_FINISH_SESSION: {
133 mInputMethodSession = null;
134 return;
135 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800136 }
137 Log.w(TAG, "Unhandled message code: " + msg.what);
138 }
139
140 public void finishInput() {
141 mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT));
142 }
143
144 public void displayCompletions(CompletionInfo[] completions) {
145 mCaller.executeOrSendMessage(mCaller.obtainMessageO(
146 DO_DISPLAY_COMPLETIONS, completions));
147 }
148
149 public void updateExtractedText(int token, ExtractedText text) {
150 mCaller.executeOrSendMessage(mCaller.obtainMessageIO(
151 DO_UPDATE_EXTRACTED_TEXT, token, text));
152 }
153
154 public void dispatchKeyEvent(int seq, KeyEvent event, IInputMethodCallback callback) {
155 mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_KEY_EVENT, seq,
156 event, callback));
157 }
158
159 public void dispatchTrackballEvent(int seq, MotionEvent event, IInputMethodCallback callback) {
160 mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_TRACKBALL_EVENT, seq,
161 event, callback));
162 }
163
164 public void updateSelection(int oldSelStart, int oldSelEnd,
165 int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) {
166 mCaller.executeOrSendMessage(mCaller.obtainMessageIIIIII(DO_UPDATE_SELECTION,
167 oldSelStart, oldSelEnd, newSelStart, newSelEnd,
168 candidatesStart, candidatesEnd));
169 }
170
171 public void updateCursor(Rect newCursor) {
172 mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_UPDATE_CURSOR,
173 newCursor));
174 }
175
176 public void appPrivateCommand(String action, Bundle data) {
177 mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_APP_PRIVATE_COMMAND, action, data));
178 }
The Android Open Source Project4df24232009-03-05 14:34:35 -0800179
180 public void toggleSoftInput(int showFlags, int hideFlags) {
181 mCaller.executeOrSendMessage(mCaller.obtainMessageII(DO_TOGGLE_SOFT_INPUT, showFlags, hideFlags));
182 }
Devin Taylor0c33ed22010-02-23 13:26:46 -0600183
184 public void finishSession() {
185 mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION));
186 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800187}