IInputMethodSessionWrapper.java revision ed218c706d9e91e75b94c448cee2e6150aaee57f
1/*
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
17package android.inputmethodservice;
18
19import com.android.internal.os.HandlerCaller;
20import com.android.internal.os.SomeArgs;
21import com.android.internal.view.IInputMethodCallback;
22import com.android.internal.view.IInputMethodSession;
23
24import android.content.Context;
25import android.graphics.Rect;
26import android.os.Bundle;
27import android.os.Message;
28import android.os.RemoteException;
29import android.util.Log;
30import android.view.KeyEvent;
31import android.view.MotionEvent;
32import android.view.inputmethod.CompletionInfo;
33import android.view.inputmethod.ExtractedText;
34import android.view.inputmethod.InputMethodSession;
35
36class IInputMethodSessionWrapper extends IInputMethodSession.Stub
37        implements HandlerCaller.Callback {
38    private static final String TAG = "InputMethodWrapper";
39    private static final boolean DEBUG = false;
40
41    private static final int DO_FINISH_INPUT = 60;
42    private static final int DO_DISPLAY_COMPLETIONS = 65;
43    private static final int DO_UPDATE_EXTRACTED_TEXT = 67;
44    private static final int DO_DISPATCH_KEY_EVENT = 70;
45    private static final int DO_DISPATCH_TRACKBALL_EVENT = 80;
46    private static final int DO_DISPATCH_GENERIC_MOTION_EVENT = 85;
47    private static final int DO_UPDATE_SELECTION = 90;
48    private static final int DO_UPDATE_CURSOR = 95;
49    private static final int DO_APP_PRIVATE_COMMAND = 100;
50    private static final int DO_TOGGLE_SOFT_INPUT = 105;
51    private static final int DO_FINISH_SESSION = 110;
52    private static final int DO_VIEW_CLICKED = 115;
53
54    HandlerCaller mCaller;
55    InputMethodSession mInputMethodSession;
56
57    // NOTE: we should have a cache of these.
58    static class InputMethodEventCallbackWrapper implements InputMethodSession.EventCallback {
59        final IInputMethodCallback mCb;
60        InputMethodEventCallbackWrapper(IInputMethodCallback cb) {
61            mCb = cb;
62        }
63        public void finishedEvent(int seq, boolean handled) {
64            try {
65                mCb.finishedEvent(seq, handled);
66            } catch (RemoteException e) {
67            }
68        }
69    }
70
71    public IInputMethodSessionWrapper(Context context,
72            InputMethodSession inputMethodSession) {
73        mCaller = new HandlerCaller(context, null,
74                this, true /*asyncHandler*/);
75        mInputMethodSession = inputMethodSession;
76    }
77
78    public InputMethodSession getInternalInputMethodSession() {
79        return mInputMethodSession;
80    }
81
82    public void executeMessage(Message msg) {
83        if (mInputMethodSession == null) return;
84
85        switch (msg.what) {
86            case DO_FINISH_INPUT:
87                mInputMethodSession.finishInput();
88                return;
89            case DO_DISPLAY_COMPLETIONS:
90                mInputMethodSession.displayCompletions((CompletionInfo[])msg.obj);
91                return;
92            case DO_UPDATE_EXTRACTED_TEXT:
93                mInputMethodSession.updateExtractedText(msg.arg1,
94                        (ExtractedText)msg.obj);
95                return;
96            case DO_DISPATCH_KEY_EVENT: {
97                SomeArgs args = (SomeArgs)msg.obj;
98                mInputMethodSession.dispatchKeyEvent(msg.arg1,
99                        (KeyEvent)args.arg1,
100                        new InputMethodEventCallbackWrapper(
101                                (IInputMethodCallback)args.arg2));
102                args.recycle();
103                return;
104            }
105            case DO_DISPATCH_TRACKBALL_EVENT: {
106                SomeArgs args = (SomeArgs)msg.obj;
107                mInputMethodSession.dispatchTrackballEvent(msg.arg1,
108                        (MotionEvent)args.arg1,
109                        new InputMethodEventCallbackWrapper(
110                                (IInputMethodCallback)args.arg2));
111                args.recycle();
112                return;
113            }
114            case DO_DISPATCH_GENERIC_MOTION_EVENT: {
115                SomeArgs args = (SomeArgs)msg.obj;
116                mInputMethodSession.dispatchGenericMotionEvent(msg.arg1,
117                        (MotionEvent)args.arg1,
118                        new InputMethodEventCallbackWrapper(
119                                (IInputMethodCallback)args.arg2));
120                args.recycle();
121                return;
122            }
123            case DO_UPDATE_SELECTION: {
124                SomeArgs args = (SomeArgs)msg.obj;
125                mInputMethodSession.updateSelection(args.argi1, args.argi2,
126                        args.argi3, args.argi4, args.argi5, args.argi6);
127                args.recycle();
128                return;
129            }
130            case DO_UPDATE_CURSOR: {
131                mInputMethodSession.updateCursor((Rect)msg.obj);
132                return;
133            }
134            case DO_APP_PRIVATE_COMMAND: {
135                SomeArgs args = (SomeArgs)msg.obj;
136                mInputMethodSession.appPrivateCommand((String)args.arg1,
137                        (Bundle)args.arg2);
138                args.recycle();
139                return;
140            }
141            case DO_TOGGLE_SOFT_INPUT: {
142                mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2);
143                return;
144            }
145            case DO_FINISH_SESSION: {
146                mInputMethodSession = null;
147                return;
148            }
149            case DO_VIEW_CLICKED: {
150                mInputMethodSession.viewClicked(msg.arg1 == 1);
151                return;
152            }
153        }
154        Log.w(TAG, "Unhandled message code: " + msg.what);
155    }
156
157    public void finishInput() {
158        mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT));
159    }
160
161    public void displayCompletions(CompletionInfo[] completions) {
162        mCaller.executeOrSendMessage(mCaller.obtainMessageO(
163                DO_DISPLAY_COMPLETIONS, completions));
164    }
165
166    public void updateExtractedText(int token, ExtractedText text) {
167        mCaller.executeOrSendMessage(mCaller.obtainMessageIO(
168                DO_UPDATE_EXTRACTED_TEXT, token, text));
169    }
170
171    public void dispatchKeyEvent(int seq, KeyEvent event, IInputMethodCallback callback) {
172        mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_KEY_EVENT, seq,
173                event, callback));
174    }
175
176    public void dispatchTrackballEvent(int seq, MotionEvent event, IInputMethodCallback callback) {
177        mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_TRACKBALL_EVENT, seq,
178                event, callback));
179    }
180
181    public void dispatchGenericMotionEvent(int seq, MotionEvent event,
182            IInputMethodCallback callback) {
183        mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_GENERIC_MOTION_EVENT, seq,
184                event, callback));
185    }
186
187    public void updateSelection(int oldSelStart, int oldSelEnd,
188            int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) {
189        mCaller.executeOrSendMessage(mCaller.obtainMessageIIIIII(DO_UPDATE_SELECTION,
190                oldSelStart, oldSelEnd, newSelStart, newSelEnd,
191                candidatesStart, candidatesEnd));
192    }
193
194    public void viewClicked(boolean focusChanged) {
195        mCaller.executeOrSendMessage(mCaller.obtainMessageI(DO_VIEW_CLICKED, focusChanged ? 1 : 0));
196    }
197
198    public void updateCursor(Rect newCursor) {
199        mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_UPDATE_CURSOR,
200                newCursor));
201    }
202
203    public void appPrivateCommand(String action, Bundle data) {
204        mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_APP_PRIVATE_COMMAND, action, data));
205    }
206
207    public void toggleSoftInput(int showFlags, int hideFlags) {
208        mCaller.executeOrSendMessage(mCaller.obtainMessageII(DO_TOGGLE_SOFT_INPUT, showFlags, hideFlags));
209    }
210
211    public void finishSession() {
212        mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION));
213    }
214}
215