blob: a8a53466c8f14304de630e4412cac5a548cfa5f2 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2007-2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * 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, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
16
17package android.view.inputmethod;
18
19import android.os.Bundle;
satokadb43582011-03-09 10:08:47 +090020import android.os.IBinder;
21import android.text.style.CorrectionSpan;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080022import android.view.KeyCharacterMap;
23import android.view.KeyEvent;
24
25/**
26 * The InputConnection interface is the communication channel from an
27 * {@link InputMethod} back to the application that is receiving its input. It
28 * is used to perform such things as reading text around the cursor,
29 * committing text to the text box, and sending raw key events to the application.
30 *
31 * <p>Implementations of this interface should generally be done by
32 * subclassing {@link BaseInputConnection}.
33 */
34public interface InputConnection {
35 /**
36 * Flag for use with {@link #getTextAfterCursor} and
37 * {@link #getTextBeforeCursor} to have style information returned along
38 * with the text. If not set, you will receive only the raw text. If
39 * set, you may receive a complex CharSequence of both text and style
40 * spans.
41 */
42 static final int GET_TEXT_WITH_STYLES = 0x0001;
43
44 /**
45 * Flag for use with {@link #getExtractedText} to indicate you would
46 * like to receive updates when the extracted text changes.
47 */
48 public static final int GET_EXTRACTED_TEXT_MONITOR = 0x0001;
49
50 /**
51 * Get <var>n</var> characters of text before the current cursor position.
52 *
53 * <p>This method may fail either if the input connection has become invalid
54 * (such as its process crashing) or the client is taking too long to
55 * respond with the text (it is given a couple seconds to return).
56 * In either case, a null is returned.
57 *
58 * @param n The expected length of the text.
59 * @param flags Supplies additional options controlling how the text is
60 * returned. May be either 0 or {@link #GET_TEXT_WITH_STYLES}.
61 *
62 * @return Returns the text before the cursor position; the length of the
63 * returned text might be less than <var>n</var>.
64 */
65 public CharSequence getTextBeforeCursor(int n, int flags);
66
67 /**
68 * Get <var>n</var> characters of text after the current cursor position.
69 *
70 * <p>This method may fail either if the input connection has become invalid
71 * (such as its process crashing) or the client is taking too long to
72 * respond with the text (it is given a couple seconds to return).
73 * In either case, a null is returned.
74 *
75 * @param n The expected length of the text.
76 * @param flags Supplies additional options controlling how the text is
77 * returned. May be either 0 or {@link #GET_TEXT_WITH_STYLES}.
78 *
79 * @return Returns the text after the cursor position; the length of the
80 * returned text might be less than <var>n</var>.
81 */
82 public CharSequence getTextAfterCursor(int n, int flags);
83
84 /**
Amith Yamasania90b7f02010-08-25 18:27:20 -070085 * Gets the selected text, if any.
86 *
87 * <p>This method may fail if either the input connection has become
88 * invalid (such as its process crashing) or the client is taking too
89 * long to respond with the text (it is given a couple of seconds to return).
90 * In either case, a null is returned.
91 *
92 * @param flags Supplies additional options controlling how the text is
93 * returned. May be either 0 or {@link #GET_TEXT_WITH_STYLES}.
94 * @return Returns the text that is currently selected, if any, or null if
95 * no text is selected.
96 */
97 public CharSequence getSelectedText(int flags);
98
99 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800100 * Retrieve the current capitalization mode in effect at the current
101 * cursor position in the text. See
102 * {@link android.text.TextUtils#getCapsMode TextUtils.getCapsMode} for
103 * more information.
104 *
105 * <p>This method may fail either if the input connection has become invalid
106 * (such as its process crashing) or the client is taking too long to
107 * respond with the text (it is given a couple seconds to return).
108 * In either case, a 0 is returned.
109 *
110 * @param reqModes The desired modes to retrieve, as defined by
111 * {@link android.text.TextUtils#getCapsMode TextUtils.getCapsMode}. These
112 * constants are defined so that you can simply pass the current
113 * {@link EditorInfo#inputType TextBoxAttribute.contentType} value
114 * directly in to here.
115 *
116 * @return Returns the caps mode flags that are in effect.
117 */
118 public int getCursorCapsMode(int reqModes);
119
120 /**
121 * Retrieve the current text in the input connection's editor, and monitor
122 * for any changes to it. This function returns with the current text,
123 * and optionally the input connection can send updates to the
124 * input method when its text changes.
125 *
126 * <p>This method may fail either if the input connection has become invalid
127 * (such as its process crashing) or the client is taking too long to
128 * respond with the text (it is given a couple seconds to return).
129 * In either case, a null is returned.
130 *
131 * @param request Description of how the text should be returned.
132 * @param flags Additional options to control the client, either 0 or
133 * {@link #GET_EXTRACTED_TEXT_MONITOR}.
134 *
135 * @return Returns an ExtractedText object describing the state of the
136 * text view and containing the extracted text itself.
137 */
138 public ExtractedText getExtractedText(ExtractedTextRequest request,
139 int flags);
140
141 /**
142 * Delete <var>leftLength</var> characters of text before the current cursor
143 * position, and delete <var>rightLength</var> characters of text after the
144 * current cursor position, excluding composing text.
145 *
146 * @param leftLength The number of characters to be deleted before the
147 * current cursor position.
148 * @param rightLength The number of characters to be deleted after the
149 * current cursor position.
150 *
151 * @return Returns true on success, false if the input connection is no longer
152 * valid.
153 */
The Android Open Source Projectb2a3dd82009-03-09 11:52:12 -0700154 public boolean deleteSurroundingText(int leftLength, int rightLength);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800155
156 /**
157 * Set composing text around the current cursor position with the given text,
158 * and set the new cursor position. Any composing text set previously will
159 * be removed automatically.
160 *
161 * @param text The composing text with styles if necessary. If no style
162 * object attached to the text, the default style for composing text
163 * is used. See {#link android.text.Spanned} for how to attach style
164 * object to the text. {#link android.text.SpannableString} and
165 * {#link android.text.SpannableStringBuilder} are two
166 * implementations of the interface {#link android.text.Spanned}.
167 * @param newCursorPosition The new cursor position around the text. If
168 * > 0, this is relative to the end of the text - 1; if <= 0, this
169 * is relative to the start of the text. So a value of 1 will
170 * always advance you to the position after the full text being
171 * inserted. Note that this means you can't position the cursor
172 * within the text, because the editor can make modifications to
173 * the text you are providing so it is not possible to correctly
174 * specify locations there.
175 *
176 * @return Returns true on success, false if the input connection is no longer
177 * valid.
178 */
179 public boolean setComposingText(CharSequence text, int newCursorPosition);
180
181 /**
Amith Yamasania90b7f02010-08-25 18:27:20 -0700182 * Mark a certain region of text as composing text. Any composing text set
183 * previously will be removed automatically. The default style for composing
184 * text is used.
185 *
186 * @param start the position in the text at which the composing region begins
187 * @param end the position in the text at which the composing region ends
188 * @return Returns true on success, false if the input connection is no longer
189 * valid.
190 */
191 public boolean setComposingRegion(int start, int end);
192
193 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800194 * Have the text editor finish whatever composing text is currently
195 * active. This simply leaves the text as-is, removing any special
196 * composing styling or other state that was around it. The cursor
197 * position remains unchanged.
198 */
199 public boolean finishComposingText();
200
201 /**
202 * Commit text to the text box and set the new cursor position.
203 * Any composing text set previously will be removed
204 * automatically.
205 *
206 * @param text The committed text.
207 * @param newCursorPosition The new cursor position around the text. If
208 * > 0, this is relative to the end of the text - 1; if <= 0, this
209 * is relative to the start of the text. So a value of 1 will
210 * always advance you to the position after the full text being
211 * inserted. Note that this means you can't position the cursor
212 * within the text, because the editor can make modifications to
213 * the text you are providing so it is not possible to correctly
214 * specify locations there.
215 *
216 *
217 * @return Returns true on success, false if the input connection is no longer
218 * valid.
219 */
220 public boolean commitText(CharSequence text, int newCursorPosition);
221
222 /**
223 * Commit a completion the user has selected from the possible ones
224 * previously reported to {@link InputMethodSession#displayCompletions
225 * InputMethodSession.displayCompletions()}. This will result in the
226 * same behavior as if the user had selected the completion from the
227 * actual UI.
228 *
229 * @param text The committed completion.
230 *
231 * @return Returns true on success, false if the input connection is no longer
232 * valid.
233 */
234 public boolean commitCompletion(CompletionInfo text);
235
236 /**
Gilles Debunnecf9cf2f2010-12-08 17:43:58 -0800237 * Commit a correction automatically performed on the raw user's input. A typical example would
238 * be to correct typos using a dictionary.
239 *
240 * @param correctionInfo Detailed information about the correction.
241 *
242 * @return True on success, false if the input connection is no longer valid.
243 */
244 public boolean commitCorrection(CorrectionInfo correctionInfo);
245
246 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800247 * Set the selection of the text editor. To set the cursor position,
248 * start and end should have the same value.
249 * @return Returns true on success, false if the input connection is no longer
250 * valid.
251 */
252 public boolean setSelection(int start, int end);
253
254 /**
255 * Have the editor perform an action it has said it can do.
256 *
257 * @param editorAction This must be one of the action constants for
258 * {@link EditorInfo#imeOptions EditorInfo.editorType}, such as
259 * {@link EditorInfo#IME_ACTION_GO EditorInfo.EDITOR_ACTION_GO}.
260 *
261 * @return Returns true on success, false if the input connection is no longer
262 * valid.
263 */
264 public boolean performEditorAction(int editorAction);
265
266 /**
267 * Perform a context menu action on the field. The given id may be one of:
268 * {@link android.R.id#selectAll},
269 * {@link android.R.id#startSelectingText}, {@link android.R.id#stopSelectingText},
270 * {@link android.R.id#cut}, {@link android.R.id#copy},
271 * {@link android.R.id#paste}, {@link android.R.id#copyUrl},
272 * or {@link android.R.id#switchInputMethod}
273 */
274 public boolean performContextMenuAction(int id);
275
276 /**
277 * Tell the editor that you are starting a batch of editor operations.
278 * The editor will try to avoid sending you updates about its state
279 * until {@link #endBatchEdit} is called.
280 */
281 public boolean beginBatchEdit();
282
283 /**
284 * Tell the editor that you are done with a batch edit previously
285 * initiated with {@link #endBatchEdit}.
286 */
287 public boolean endBatchEdit();
288
289 /**
290 * Send a key event to the process that is currently attached through
291 * this input connection. The event will be dispatched like a normal
292 * key event, to the currently focused; this generally is the view that
293 * is providing this InputConnection, but due to the asynchronous nature
294 * of this protocol that can not be guaranteed and the focus may have
295 * changed by the time the event is received.
296 *
297 * <p>
298 * This method can be used to send key events to the application. For
299 * example, an on-screen keyboard may use this method to simulate a hardware
300 * keyboard. There are three types of standard keyboards, numeric (12-key),
301 * predictive (20-key) and ALPHA (QWERTY). You can specify the keyboard type
302 * by specify the device id of the key event.
303 *
304 * <p>
305 * You will usually want to set the flag
306 * {@link KeyEvent#FLAG_SOFT_KEYBOARD KeyEvent.FLAG_SOFT_KEYBOARD} on all
307 * key event objects you give to this API; the flag will not be set
308 * for you.
309 *
310 * @param event The key event.
311 *
312 * @return Returns true on success, false if the input connection is no longer
313 * valid.
314 *
315 * @see KeyEvent
316 * @see KeyCharacterMap#NUMERIC
317 * @see KeyCharacterMap#PREDICTIVE
318 * @see KeyCharacterMap#ALPHA
319 */
320 public boolean sendKeyEvent(KeyEvent event);
321
322 /**
323 * Clear the given meta key pressed states in the given input connection.
324 *
325 * @param states The states to be cleared, may be one or more bits as
326 * per {@link KeyEvent#getMetaState() KeyEvent.getMetaState()}.
327 *
328 * @return Returns true on success, false if the input connection is no longer
329 * valid.
330 */
331 public boolean clearMetaKeyStates(int states);
332
333 /**
334 * Called by the IME to tell the client when it switches between fullscreen
335 * and normal modes. This will normally be called for you by the standard
336 * implementation of {@link android.inputmethodservice.InputMethodService}.
337 */
338 public boolean reportFullscreenMode(boolean enabled);
339
340 /**
341 * API to send private commands from an input method to its connected
342 * editor. This can be used to provide domain-specific features that are
343 * only known between certain input methods and their clients. Note that
344 * because the InputConnection protocol is asynchronous, you have no way
345 * to get a result back or know if the client understood the command; you
346 * can use the information in {@link EditorInfo} to determine if
347 * a client supports a particular command.
348 *
349 * @param action Name of the command to be performed. This <em>must</em>
350 * be a scoped name, i.e. prefixed with a package name you own, so that
351 * different developers will not create conflicting commands.
352 * @param data Any data to include with the command.
353 * @return Returns true if the command was sent (whether or not the
354 * associated editor understood it), false if the input connection is no longer
355 * valid.
356 */
357 public boolean performPrivateCommand(String action, Bundle data);
satokadb43582011-03-09 10:08:47 +0900358
359 /**
360 * Add a correction span.
361 */
362 public boolean setCorrectionSpan(IBinder token, CorrectionSpan correctionSpan, int start,
363 int end, int flags);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800364}