IInputMethodSessionWrapper.java revision 0c33ed2992b2eb484c229fd3322df14d97c10caa
1package android.inputmethodservice;
2
3import com.android.internal.os.HandlerCaller;
4import com.android.internal.view.IInputMethodCallback;
5import com.android.internal.view.IInputMethodSession;
6
7import android.content.Context;
8import android.graphics.Rect;
9import android.os.Bundle;
10import android.os.Message;
11import android.os.RemoteException;
12import android.util.Log;
13import android.view.KeyEvent;
14import android.view.MotionEvent;
15import android.view.inputmethod.CompletionInfo;
16import android.view.inputmethod.ExtractedText;
17import android.view.inputmethod.InputMethodSession;
18import android.view.inputmethod.EditorInfo;
19
20class IInputMethodSessionWrapper extends IInputMethodSession.Stub
21        implements HandlerCaller.Callback {
22    private static final String TAG = "InputMethodWrapper";
23    private static final boolean DEBUG = false;
24
25    private static final int DO_FINISH_INPUT = 60;
26    private static final int DO_DISPLAY_COMPLETIONS = 65;
27    private static final int DO_UPDATE_EXTRACTED_TEXT = 67;
28    private static final int DO_DISPATCH_KEY_EVENT = 70;
29    private static final int DO_DISPATCH_TRACKBALL_EVENT = 80;
30    private static final int DO_UPDATE_SELECTION = 90;
31    private static final int DO_UPDATE_CURSOR = 95;
32    private static final int DO_APP_PRIVATE_COMMAND = 100;
33    private static final int DO_TOGGLE_SOFT_INPUT = 105;
34    private static final int DO_FINISH_SESSION = 110;
35
36    HandlerCaller mCaller;
37    InputMethodSession mInputMethodSession;
38
39    // NOTE: we should have a cache of these.
40    static class InputMethodEventCallbackWrapper implements InputMethodSession.EventCallback {
41        final IInputMethodCallback mCb;
42        InputMethodEventCallbackWrapper(IInputMethodCallback cb) {
43            mCb = cb;
44        }
45        public void finishedEvent(int seq, boolean handled) {
46            try {
47                mCb.finishedEvent(seq, handled);
48            } catch (RemoteException e) {
49            }
50        }
51    }
52
53    public IInputMethodSessionWrapper(Context context,
54            InputMethodSession inputMethodSession) {
55        mCaller = new HandlerCaller(context, this);
56        mInputMethodSession = inputMethodSession;
57    }
58
59    public InputMethodSession getInternalInputMethodSession() {
60        return mInputMethodSession;
61    }
62
63    public void executeMessage(Message msg) {
64        switch (msg.what) {
65            case DO_FINISH_INPUT:
66                mInputMethodSession.finishInput();
67                return;
68            case DO_DISPLAY_COMPLETIONS:
69                mInputMethodSession.displayCompletions((CompletionInfo[])msg.obj);
70                return;
71            case DO_UPDATE_EXTRACTED_TEXT:
72                mInputMethodSession.updateExtractedText(msg.arg1,
73                        (ExtractedText)msg.obj);
74                return;
75            case DO_DISPATCH_KEY_EVENT: {
76                HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
77                mInputMethodSession.dispatchKeyEvent(msg.arg1,
78                        (KeyEvent)args.arg1,
79                        new InputMethodEventCallbackWrapper(
80                                (IInputMethodCallback)args.arg2));
81                mCaller.recycleArgs(args);
82                return;
83            }
84            case DO_DISPATCH_TRACKBALL_EVENT: {
85                HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
86                mInputMethodSession.dispatchTrackballEvent(msg.arg1,
87                        (MotionEvent)args.arg1,
88                        new InputMethodEventCallbackWrapper(
89                                (IInputMethodCallback)args.arg2));
90                mCaller.recycleArgs(args);
91                return;
92            }
93            case DO_UPDATE_SELECTION: {
94                HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
95                mInputMethodSession.updateSelection(args.argi1, args.argi2,
96                        args.argi3, args.argi4, args.argi5, args.argi6);
97                mCaller.recycleArgs(args);
98                return;
99            }
100            case DO_UPDATE_CURSOR: {
101                mInputMethodSession.updateCursor((Rect)msg.obj);
102                return;
103            }
104            case DO_APP_PRIVATE_COMMAND: {
105                HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
106                mInputMethodSession.appPrivateCommand((String)args.arg1,
107                        (Bundle)args.arg2);
108                mCaller.recycleArgs(args);
109                return;
110            }
111            case DO_TOGGLE_SOFT_INPUT: {
112                mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2);
113                return;
114            }
115            case DO_FINISH_SESSION: {
116                mInputMethodSession = null;
117                return;
118            }
119        }
120        Log.w(TAG, "Unhandled message code: " + msg.what);
121    }
122
123    public void finishInput() {
124        mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_INPUT));
125    }
126
127    public void displayCompletions(CompletionInfo[] completions) {
128        mCaller.executeOrSendMessage(mCaller.obtainMessageO(
129                DO_DISPLAY_COMPLETIONS, completions));
130    }
131
132    public void updateExtractedText(int token, ExtractedText text) {
133        mCaller.executeOrSendMessage(mCaller.obtainMessageIO(
134                DO_UPDATE_EXTRACTED_TEXT, token, text));
135    }
136
137    public void dispatchKeyEvent(int seq, KeyEvent event, IInputMethodCallback callback) {
138        mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_KEY_EVENT, seq,
139                event, callback));
140    }
141
142    public void dispatchTrackballEvent(int seq, MotionEvent event, IInputMethodCallback callback) {
143        mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_TRACKBALL_EVENT, seq,
144                event, callback));
145    }
146
147    public void updateSelection(int oldSelStart, int oldSelEnd,
148            int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) {
149        mCaller.executeOrSendMessage(mCaller.obtainMessageIIIIII(DO_UPDATE_SELECTION,
150                oldSelStart, oldSelEnd, newSelStart, newSelEnd,
151                candidatesStart, candidatesEnd));
152    }
153
154    public void updateCursor(Rect newCursor) {
155        mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_UPDATE_CURSOR,
156                newCursor));
157    }
158
159    public void appPrivateCommand(String action, Bundle data) {
160        mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_APP_PRIVATE_COMMAND, action, data));
161    }
162
163    public void toggleSoftInput(int showFlags, int hideFlags) {
164        mCaller.executeOrSendMessage(mCaller.obtainMessageII(DO_TOGGLE_SOFT_INPUT, showFlags, hideFlags));
165    }
166
167    public void finishSession() {
168        mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION));
169    }
170}
171