blob: e10f2184508b4c68595b16f7a44f5091bf5165c4 [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;
satok863fcd62011-06-21 17:38:02 +090050 private static final int DO_VIEW_CLICKED = 115;
Devin Taylor0c33ed22010-02-23 13:26:46 -060051
52 HandlerCaller mCaller;
53 InputMethodSession mInputMethodSession;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080054
55 // NOTE: we should have a cache of these.
56 static class InputMethodEventCallbackWrapper implements InputMethodSession.EventCallback {
57 final IInputMethodCallback mCb;
58 InputMethodEventCallbackWrapper(IInputMethodCallback cb) {
59 mCb = cb;
60 }
61 public void finishedEvent(int seq, boolean handled) {
62 try {
63 mCb.finishedEvent(seq, handled);
64 } catch (RemoteException e) {
65 }
66 }
67 }
68
69 public IInputMethodSessionWrapper(Context context,
70 InputMethodSession inputMethodSession) {
71 mCaller = new HandlerCaller(context, this);
72 mInputMethodSession = inputMethodSession;
73 }
74
75 public InputMethodSession getInternalInputMethodSession() {
76 return mInputMethodSession;
77 }
78
79 public void executeMessage(Message msg) {
Ken Wakasaa308c032011-01-25 14:02:07 +090080 if (mInputMethodSession == null) return;
81
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082 switch (msg.what) {
83 case DO_FINISH_INPUT:
84 mInputMethodSession.finishInput();
85 return;
86 case DO_DISPLAY_COMPLETIONS:
87 mInputMethodSession.displayCompletions((CompletionInfo[])msg.obj);
88 return;
89 case DO_UPDATE_EXTRACTED_TEXT:
90 mInputMethodSession.updateExtractedText(msg.arg1,
91 (ExtractedText)msg.obj);
92 return;
93 case DO_DISPATCH_KEY_EVENT: {
94 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
95 mInputMethodSession.dispatchKeyEvent(msg.arg1,
96 (KeyEvent)args.arg1,
97 new InputMethodEventCallbackWrapper(
98 (IInputMethodCallback)args.arg2));
99 mCaller.recycleArgs(args);
100 return;
101 }
102 case DO_DISPATCH_TRACKBALL_EVENT: {
103 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
104 mInputMethodSession.dispatchTrackballEvent(msg.arg1,
105 (MotionEvent)args.arg1,
106 new InputMethodEventCallbackWrapper(
107 (IInputMethodCallback)args.arg2));
108 mCaller.recycleArgs(args);
109 return;
110 }
111 case DO_UPDATE_SELECTION: {
112 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
113 mInputMethodSession.updateSelection(args.argi1, args.argi2,
114 args.argi3, args.argi4, args.argi5, args.argi6);
115 mCaller.recycleArgs(args);
116 return;
117 }
118 case DO_UPDATE_CURSOR: {
119 mInputMethodSession.updateCursor((Rect)msg.obj);
120 return;
121 }
122 case DO_APP_PRIVATE_COMMAND: {
123 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
124 mInputMethodSession.appPrivateCommand((String)args.arg1,
125 (Bundle)args.arg2);
126 mCaller.recycleArgs(args);
127 return;
128 }
The Android Open Source Project4df24232009-03-05 14:34:35 -0800129 case DO_TOGGLE_SOFT_INPUT: {
130 mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2);
131 return;
132 }
Devin Taylor0c33ed22010-02-23 13:26:46 -0600133 case DO_FINISH_SESSION: {
134 mInputMethodSession = null;
135 return;
136 }
satok863fcd62011-06-21 17:38:02 +0900137 case DO_VIEW_CLICKED: {
138 mInputMethodSession.viewClicked(msg.arg1 == 1);
139 return;
140 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141 }
142 Log.w(TAG, "Unhandled message code: " + msg.what);
143 }
144
145 public void finishInput() {
146 mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT));
147 }
148
149 public void displayCompletions(CompletionInfo[] completions) {
150 mCaller.executeOrSendMessage(mCaller.obtainMessageO(
151 DO_DISPLAY_COMPLETIONS, completions));
152 }
153
154 public void updateExtractedText(int token, ExtractedText text) {
155 mCaller.executeOrSendMessage(mCaller.obtainMessageIO(
156 DO_UPDATE_EXTRACTED_TEXT, token, text));
157 }
158
159 public void dispatchKeyEvent(int seq, KeyEvent event, IInputMethodCallback callback) {
160 mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_KEY_EVENT, seq,
161 event, callback));
162 }
163
164 public void dispatchTrackballEvent(int seq, MotionEvent event, IInputMethodCallback callback) {
165 mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_TRACKBALL_EVENT, seq,
166 event, callback));
167 }
168
169 public void updateSelection(int oldSelStart, int oldSelEnd,
170 int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) {
171 mCaller.executeOrSendMessage(mCaller.obtainMessageIIIIII(DO_UPDATE_SELECTION,
172 oldSelStart, oldSelEnd, newSelStart, newSelEnd,
173 candidatesStart, candidatesEnd));
174 }
satok863fcd62011-06-21 17:38:02 +0900175
176 public void viewClicked(boolean focusChanged) {
177 mCaller.executeOrSendMessage(mCaller.obtainMessageI(DO_VIEW_CLICKED, focusChanged ? 1 : 0));
178 }
179
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 public void updateCursor(Rect newCursor) {
181 mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_UPDATE_CURSOR,
182 newCursor));
183 }
184
185 public void appPrivateCommand(String action, Bundle data) {
186 mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_APP_PRIVATE_COMMAND, action, data));
187 }
The Android Open Source Project4df24232009-03-05 14:34:35 -0800188
189 public void toggleSoftInput(int showFlags, int hideFlags) {
190 mCaller.executeOrSendMessage(mCaller.obtainMessageII(DO_TOGGLE_SOFT_INPUT, showFlags, hideFlags));
191 }
Devin Taylor0c33ed22010-02-23 13:26:46 -0600192
193 public void finishSession() {
194 mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION));
195 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800196}