InputMethodManager.java revision 04ddf3c0508f3d50e6ab82cecc0adc92f52b7803
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007-2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * License for the specific language governing permissions and limitations under 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view.inputmethod; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 198cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.os.HandlerCaller; 208cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.view.IInputConnectionWrapper; 218cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.view.IInputContext; 228cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.view.IInputMethodCallback; 238cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.view.IInputMethodClient; 248cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.view.IInputMethodManager; 258cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.view.IInputMethodSession; 268cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunneimport com.android.internal.view.InputBindResult; 278cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunne 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.os.ResultReceiver; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 3804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brownimport android.os.SystemClock; 39f9f01008624e2d28c15a90d942fa36f98c8c967dsatokimport android.text.style.SuggestionSpan; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.PrintWriterPrinter; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 466dd005b48138708762bfade0081d031a2a4a3822Dianne Hackbornimport android.view.ViewRootImpl; 47d4723bb415dc70008c744d1027c3e3d9473adfe1Gilles Debunne 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 504e4569dab5c75804b01a19b2d6e6101b445c1c68satokimport java.util.ArrayList; 51f3db1af8d55ab247b6db67baf4fe772c18f33cabsatokimport java.util.HashMap; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 53f3db1af8d55ab247b6db67baf4fe772c18f33cabsatokimport java.util.Map; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.concurrent.CountDownLatch; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.concurrent.TimeUnit; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Central system API to the overall input method framework (IMF) architecture, 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which arbitrates interaction between applications and the current input method. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can retrieve an instance of this interface with 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#getSystemService(String) Context.getSystemService()}. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here: 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ArchitectureOverview">Architecture Overview</a> 66384f8bad60037855d2a43d7c661ca1b75ccd08baKen Wakasa * <li><a href="#Applications">Applications</a> 67384f8bad60037855d2a43d7c661ca1b75ccd08baKen Wakasa * <li><a href="#InputMethods">Input Methods</a> 68384f8bad60037855d2a43d7c661ca1b75ccd08baKen Wakasa * <li><a href="#Security">Security</a> 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ArchitectureOverview"></a> 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Architecture Overview</h3> 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are three primary parties involved in the input method 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * framework (IMF) architecture:</p> 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The <strong>input method manager</strong> as expressed by this class 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the central point of the system that manages interaction between all 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other parts. It is expressed as the client-side API here which exists 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in each application context and communicates with a global system service 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that manages the interaction across all processes. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> An <strong>input method (IME)</strong> implements a particular 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interaction model allowing the user to generate text. The system binds 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the current input method that is use, causing it to be created and run, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and tells it when to hide and show its UI. Only one IME is running at a time. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Multiple <strong>client applications</strong> arbitrate with the input 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method manager for input focus and control over the state of the IME. Only 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one such client is ever active (working with the IME) at a time. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Applications"></a> 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Applications</h3> 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In most cases, applications that are using the standard 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.TextView} or its subclasses will have little they need 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do to work well with soft input methods. The main things you need to 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be aware of are:</p> 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 1028cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunne * <li> Properly set the {@link android.R.attr#inputType} in your editable 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text views, so that the input method will have enough context to help the 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user in entering text into them. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Deal well with losing screen space when the input method is 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * displayed. Ideally an application should handle its window being resized 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * smaller, but it can rely on the system performing panning of the window 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. You should set the {@link android.R.attr#windowSoftInputMode} 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute on your activity or the corresponding values on windows you 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * create to help the system determine whether to pan or resize (it will 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * try to determine this automatically but may get it wrong). 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> You can also control the preferred soft input state (open, closed, etc) 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for your window using the same {@link android.R.attr#windowSoftInputMode} 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>More finer-grained control is available through the APIs here to directly 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interact with the IMF and its IME -- either showing or hiding the input 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * area, letting the user pick an input method, etc.</p> 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For the rare people amongst us writing their own text editors, you 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will need to implement {@link android.view.View#onCreateInputConnection} 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return a new instance of your own {@link InputConnection} interface 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allowing the IME to interact with your editor.</p> 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="InputMethods"></a> 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Input Methods</h3> 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An input method (IME) is implemented 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a {@link android.app.Service}, typically deriving from 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.inputmethodservice.InputMethodService}. It must provide 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the core {@link InputMethod} interface, though this is normally handled by 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.inputmethodservice.InputMethodService} and implementors will 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only need to deal with the higher-level API there.</p> 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the {@link android.inputmethodservice.InputMethodService} class for 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more information on implementing IMEs. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Security"></a> 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Security</h3> 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are a lot of security issues associated with input methods, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * since they essentially have freedom to completely drive the UI and monitor 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * everything the user enters. The Android input method framework also allows 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * arbitrary third party IMEs, so care must be taken to restrict their 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection and interactions.</p> 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here are some key points about the security architecture behind the 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IMF:</p> 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>Only the system is allowed to directly access an IME's 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethod} interface, via the 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.Manifest.permission#BIND_INPUT_METHOD} permission. This is 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enforced in the system by not binding to an input method service that does 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not require this permission, so the system can guarantee no other untrusted 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clients are accessing the current input method outside of its control.</p> 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>There may be many client processes of the IMF, but only one may 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be active at a time. The inactive clients can not interact with key 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parts of the IMF through the mechanisms described below.</p> 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>Clients of an input method are only given access to its 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodSession} interface. One instance of this interface is 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created for each client, and only calls from the session associated with 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the active client will be processed by the current IME. This is enforced 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by {@link android.inputmethodservice.AbstractInputMethodService} for normal 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IMEs, but must be explicitly handled by an IME that is customizing the 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * raw {@link InputMethodSession} implementation.</p> 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>Only the active client's {@link InputConnection} will accept 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * operations. The IMF tells each client process whether it is active, and 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the framework enforces that in inactive processes calls on to the current 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * InputConnection will be ignored. This ensures that the current IME can 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only deliver events and text edits to the UI that the user sees as 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being in focus.</p> 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>An IME can never interact with an {@link InputConnection} while 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the screen is off. This is enforced by making all clients inactive while 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the screen is off, and prevents bad IMEs from driving the UI when the user 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can not be aware of its behavior.</p> 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A client application can ask that the system let the user pick a 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new IME, but can not programmatically switch to one itself. This avoids 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * malicious applications from switching the user to their own IME, which 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remains running when the user navigates away to another application. An 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME, on the other hand, <em>is</em> allowed to programmatically switch 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system to another IME, since it already has full control of user 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input.</p> 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>The user must explicitly enable a new IME in settings before 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * they can switch to it, to confirm with the system that they know about it 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and want to make it available for use.</p> 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class InputMethodManager { 1994eba271a64b98a5fc38227f40190b879f807acf5Dianne Hackborn static final boolean DEBUG = false; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "InputMethodManager"; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final Object mInstanceSync = new Object(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static InputMethodManager mInstance; 2047663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 2057663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn /** 2067663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * @hide Flag for IInputMethodManager.windowGainedFocus: a view in 2077663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * the window has input focus. 2087663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn */ 2097663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn public static final int CONTROL_WINDOW_VIEW_HAS_FOCUS = 1<<0; 2107663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 2117663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn /** 2127663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * @hide Flag for IInputMethodManager.windowGainedFocus: the focus 2137663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * is a text editor. 2147663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn */ 2157663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn public static final int CONTROL_WINDOW_IS_TEXT_EDITOR = 1<<1; 2167663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 2177663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn /** 2187663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * @hide Flag for IInputMethodManager.windowGainedFocus: this is the first 2197663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * time the window has gotten focus. 2207663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn */ 2217663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn public static final int CONTROL_WINDOW_FIRST = 1<<2; 2227663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 2237663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn /** 2247663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * @hide Flag for IInputMethodManager.startInput: this is the first 2257663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * time the window has gotten focus. 2267663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn */ 2277663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn public static final int CONTROL_START_INITIAL = 1<<8; 2287663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 22904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown /** 23004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown * Timeout in milliseconds for delivering a key to an IME. 23104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown */ 23204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown static final long INPUT_METHOD_NOT_RESPONDING_TIMEOUT = 2500; 23304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 23404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown private static final int MAX_PENDING_EVENT_POOL_SIZE = 4; 23504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IInputMethodManager mService; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Looper mMainLooper; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For scheduling work on the main thread. This also serves as our 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // global lock. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final H mH; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Our generic input connection if the current target does not have its own. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IInputContext mIInputContext; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if this input method client is active, initially false. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mActive = false; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set whenever this client becomes inactive, to know we need to reset 2537663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn * state with the IME the next time we receive focus. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mHasBeenInactive = true; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As reported by IME through InputConnection. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mFullscreenMode; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ----------------------------------------------------------- 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the root view of the overall window that currently has input 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method focus. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mCurRootView; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the view that should currently be served by an input method, 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * regardless of the state of setting that up. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mServedView; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is then next view that will be served by the input method, when 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we get around to updating things. 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mNextServedView; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is set when we are in the process of connecting, to determine 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when we have actually finished. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mServedConnecting; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is non-null when we have connected the served view; it holds 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the attributes that were last retrieved from the served view and given 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the input connection. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditorInfo mCurrentTextBoxAttribute; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The InputConnection that was last retrieved from the served view. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputConnection mServedInputConnection; 294ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn ControlledInputConnectionWrapper mServedInputConnectionWrapper; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The completions that were last provided by the served view. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CompletionInfo[] mCompletions; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cursor position on the screen. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect mTmpCursorRect = new Rect(); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect mCursorRect = new Rect(); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorSelStart; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorSelEnd; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorCandStart; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorCandEnd; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ----------------------------------------------------------- 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sequence number of this binding, as returned by the server. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mBindSequence = -1; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ID of the method we are bound to. 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mCurId; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The actual instance of the method to make calls on it. 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodSession mCurMethod; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent mPendingEventPool; 32404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown int mPendingEventPoolSize; 32504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent mFirstPendingEvent; 32604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ----------------------------------------------------------- 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int MSG_DUMP = 1; 3304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project static final int MSG_BIND = 2; 3314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project static final int MSG_UNBIND = 3; 3324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project static final int MSG_SET_ACTIVE = 4; 33304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown static final int MSG_EVENT_TIMEOUT = 5; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class H extends Handler { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project H(Looper looper) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(looper); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MSG_DUMP: { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doDump((FileDescriptor)args.arg1, 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (PrintWriter)args.arg2, (String[])args.arg3); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((PrintWriter)args.arg2).println("Exception: " + e); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (args.arg4) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((CountDownLatch)args.arg4).countDown(); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case MSG_BIND: { 3574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final InputBindResult res = (InputBindResult)msg.obj; 3584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 3594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mBindSequence < 0 || mBindSequence != res.sequence) { 3604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Log.w(TAG, "Ignoring onBind: cur seq=" + mBindSequence 3614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project + ", given seq=" + res.sequence); 3624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 3634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 3654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod = res.method; 3664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurId = res.id; 3674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mBindSequence = res.sequence; 3684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3697663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn startInputInner(null, 0, 0, 0); 3704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 3714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case MSG_UNBIND: { 3734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final int sequence = msg.arg1; 37406a591cdd6d90600db006906d5d1524d156d6529Dianne Hackborn boolean startInput = false; 3754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 3764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mBindSequence == sequence) { 3774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (false) { 3784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // XXX the server has already unbound! 3794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mCurMethod != null && mCurrentTextBoxAttribute != null) { 3804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 3814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod.finishInput(); 3824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 3834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 3844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project clearBindingLocked(); 3884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 3894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // If we were actively using the last input method, then 3904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // we would like to re-connect to the next input method. 3914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mServedView != null && mServedView.isFocused()) { 3924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mServedConnecting = true; 3934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 394a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn if (mActive) { 39506a591cdd6d90600db006906d5d1524d156d6529Dianne Hackborn startInput = true; 396a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn } 3974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 39906a591cdd6d90600db006906d5d1524d156d6529Dianne Hackborn if (startInput) { 4007663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn startInputInner(null, 0, 0, 0); 40106a591cdd6d90600db006906d5d1524d156d6529Dianne Hackborn } 4024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 4034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 4044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case MSG_SET_ACTIVE: { 4054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final boolean active = msg.arg1 != 0; 4064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 4074df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mActive = active; 4084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mFullscreenMode = false; 4094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (!active) { 4104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // Some other client has starting using the IME, so note 4114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // that this happened and make sure our own editor's 4124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // state is reset. 4134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mHasBeenInactive = true; 4144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 4154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // Note that finishComposingText() is allowed to run 4164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // even when we are not active. 4174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mIInputContext.finishComposingText(); 4184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 4194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 42031e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok // Check focus again in case that "onWindowFocus" is called before 42131e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok // handling this message. 42205a6cbe2863614a1761adc033c905458b27be47esatok if (mServedView != null && mServedView.hasWindowFocus()) { 42305a6cbe2863614a1761adc033c905458b27be47esatok checkFocus(mHasBeenInactive); 42405a6cbe2863614a1761adc033c905458b27be47esatok } 4254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 4264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 4274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 4284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 42904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown case MSG_EVENT_TIMEOUT: { 43004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // Even though the message contains both the sequence number 43104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // and the PendingEvent object itself, we only pass the 43204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // sequence number to the timeoutEvent function because it's 43304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // possible for the PendingEvent object to be dequeued and 43404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // recycled concurrently. To avoid a possible race, we make 43504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // a point of always looking up the PendingEvent within the 43604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // queue given only the sequence number of the event. 43704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown timeoutEvent(msg.arg1); 43804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return; 43904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 444de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard private static class ControlledInputConnectionWrapper extends IInputConnectionWrapper { 445de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard private final InputMethodManager mParentInputMethodManager; 446ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn private boolean mActive; 447de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard 448de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard public ControlledInputConnectionWrapper(final Looper mainLooper, final InputConnection conn, 449de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard final InputMethodManager inputMethodManager) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(mainLooper, conn); 451de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard mParentInputMethodManager = inputMethodManager; 452ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn mActive = true; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4558cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunne @Override 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isActive() { 457ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn return mParentInputMethodManager.mActive && mActive; 458ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn } 459ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn 460ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn void deactivate() { 461ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn mActive = false; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IInputMethodClient.Stub mClient = new IInputMethodClient.Stub() { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No need to check for dump permission, since we only give this 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // interface to the system. 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CountDownLatch latch = new CountDownLatch(1); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HandlerCaller.SomeArgs sargs = new HandlerCaller.SomeArgs(); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg1 = fd; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg2 = fout; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg3 = args; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg4 = latch; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_DUMP, sargs)); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!latch.await(5, TimeUnit.SECONDS)) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fout.println("Timeout waiting for dump"); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fout.println("Interrupted waiting for dump"); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setUsingInputMethod(boolean state) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onBindMethod(InputBindResult res) { 4904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_BIND, res)); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onUnbindMethod(int sequence) { 4944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_UNBIND, sequence, 0)); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setActive(boolean active) { 4984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_SET_ACTIVE, active ? 1 : 0, 0)); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50251bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn final InputConnection mDummyInputConnection = new BaseInputConnection(this, false); 50304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 50404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown final IInputMethodCallback mInputMethodCallback = new IInputMethodCallback.Stub() { 50504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown @Override 50604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public void finishedEvent(int seq, boolean handled) { 50704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown InputMethodManager.this.finishedEvent(seq, handled); 50804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 50904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 51004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown @Override 51104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public void sessionCreated(IInputMethodSession session) { 51204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown // Stub -- not for use in the client. 51304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 51404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown }; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager(IInputMethodManager service, Looper looper) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainLooper = looper; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH = new H(looper); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIInputContext = new ControlledInputConnectionWrapper(looper, 521de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard mDummyInputConnection, this); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInstance == null) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInstance = this; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the global InputMethodManager instance, creating it if it 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doesn't already exist. 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public InputMethodManager getInstance(Context context) { 5344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getInstance(context.getMainLooper()); 5354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn /** 5384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * Internally, the input method manager can't be context-dependent, so 5394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * we have this here for the places that need it. 5404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * @hide 5414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn */ 5424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn static public InputMethodManager getInstance(Looper mainLooper) { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mInstanceSync) { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInstance != null) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInstance; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodManager service = IInputMethodManager.Stub.asInterface(b); 5494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mInstance = new InputMethodManager(service, mainLooper); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInstance; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Private optimization: retrieve the global InputMethodManager instance, 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it exists. 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public InputMethodManager peekInstance() { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInstance; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInputMethodClient getClient() { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClient; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInputContext getInputContext() { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIInputContext; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<InputMethodInfo> getInputMethodList() { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getInputMethodList(); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<InputMethodInfo> getEnabledInputMethodList() { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getEnabledInputMethodList(); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 590d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Returns a list of enabled input method subtypes for the specified input method info. 591d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param imi An input method info whose subtypes list will be returned. 592d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param allowsImplicitlySelectedSubtypes A boolean flag to allow to return the implicitly 593d4fce2b7f1a861590ce84afcf2f569189251bc59satok * selected subtypes. If an input method info doesn't have enabled subtypes, the framework 594d4fce2b7f1a861590ce84afcf2f569189251bc59satok * will implicitly enable subtypes according to the current system language. 595d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 59616331c8a1d33defccc5cbb18694def79196c921bsatok public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi, 59716331c8a1d33defccc5cbb18694def79196c921bsatok boolean allowsImplicitlySelectedSubtypes) { 59867ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok try { 59916331c8a1d33defccc5cbb18694def79196c921bsatok return mService.getEnabledInputMethodSubtypeList(imi, allowsImplicitlySelectedSubtypes); 60067ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok } catch (RemoteException e) { 60167ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok throw new RuntimeException(e); 60267ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok } 60367ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok } 60467ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showStatusIcon(IBinder imeToken, String packageName, int iconId) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.updateStatusIcon(imeToken, packageName, iconId); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void hideStatusIcon(IBinder imeToken) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.updateStatusIcon(imeToken, null, 0); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 622857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato public void setImeWindowStatus(IBinder imeToken, int vis, int backDisposition) { 62306487a58be22b100daf3f950b9a1d25c3ea42aa2satok try { 624857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mService.setImeWindowStatus(imeToken, vis, backDisposition); 62506487a58be22b100daf3f950b9a1d25c3ea42aa2satok } catch (RemoteException e) { 62606487a58be22b100daf3f950b9a1d25c3ea42aa2satok throw new RuntimeException(e); 62706487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 62806487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 62906487a58be22b100daf3f950b9a1d25c3ea42aa2satok 63006487a58be22b100daf3f950b9a1d25c3ea42aa2satok /** @hide */ 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFullscreenMode(boolean fullScreen) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullscreenMode = fullScreen; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 634f9f01008624e2d28c15a90d942fa36f98c8c967dsatok 635f9f01008624e2d28c15a90d942fa36f98c8c967dsatok /** @hide */ 636f9f01008624e2d28c15a90d942fa36f98c8c967dsatok public void registerSuggestionSpansForNotification(SuggestionSpan[] spans) { 637f9f01008624e2d28c15a90d942fa36f98c8c967dsatok try { 638f9f01008624e2d28c15a90d942fa36f98c8c967dsatok mService.registerSuggestionSpansForNotification(spans); 639f9f01008624e2d28c15a90d942fa36f98c8c967dsatok } catch (RemoteException e) { 640f9f01008624e2d28c15a90d942fa36f98c8c967dsatok throw new RuntimeException(e); 641f9f01008624e2d28c15a90d942fa36f98c8c967dsatok } 642f9f01008624e2d28c15a90d942fa36f98c8c967dsatok } 643f9f01008624e2d28c15a90d942fa36f98c8c967dsatok 644f9f01008624e2d28c15a90d942fa36f98c8c967dsatok /** @hide */ 645f9f01008624e2d28c15a90d942fa36f98c8c967dsatok public void notifySuggestionPicked(SuggestionSpan span, String originalString, int index) { 646f9f01008624e2d28c15a90d942fa36f98c8c967dsatok try { 647f9f01008624e2d28c15a90d942fa36f98c8c967dsatok mService.notifySuggestionPicked(span, originalString, index); 648f9f01008624e2d28c15a90d942fa36f98c8c967dsatok } catch (RemoteException e) { 649f9f01008624e2d28c15a90d942fa36f98c8c967dsatok throw new RuntimeException(e); 650f9f01008624e2d28c15a90d942fa36f98c8c967dsatok } 651f9f01008624e2d28c15a90d942fa36f98c8c967dsatok } 652f9f01008624e2d28c15a90d942fa36f98c8c967dsatok 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows you to discover whether the attached input method is running 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in fullscreen mode. Return true if it is fullscreen, entirely covering 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your UI, else returns false. 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isFullscreenMode() { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFullscreenMode; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the given view is the currently active view for the 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input method. 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isActive(View view) { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 669b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return (mServedView == view 670b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || (mServedView != null 671b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project && mServedView.checkInputConnectionProxy(view))) 672b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project && mCurrentTextBoxAttribute != null; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if any view is currently active in the input method. 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isActive() { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServedView != null && mCurrentTextBoxAttribute != null; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the currently served view is accepting full text edits. 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If false, it has no input connection, so can only handle raw key events. 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isAcceptingText() { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServedInputConnection != null; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reset all of the state associated with being bound to an input method. 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearBindingLocked() { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearConnectionLocked(); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBindSequence = -1; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurId = null; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod = null; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reset all of the state associated with a served view being connected 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to an input method 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearConnectionLocked() { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute = null; 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedInputConnection = null; 712ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn if (mServedInputConnectionWrapper != null) { 713ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn mServedInputConnectionWrapper.deactivate(); 714ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn mServedInputConnectionWrapper = null; 715ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disconnect any existing input connection, clearing the served view. 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void finishInputLocked() { 7224478de3c02c1fb2f4f888e696ee1b13721e936d9Jeff Sharkey mCurRootView = null; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedView = null; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView != null) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "FINISH INPUT: " + mServedView); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentTextBoxAttribute != null) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.finishInput(mClient); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 734c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne notifyInputConnectionFinished(); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedView = null; 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCompletions = null; 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = false; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearConnectionLocked(); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 742c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne 743c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne /** 744c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne * Notifies the served view that the current InputConnection will no longer be used. 745c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne */ 746c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne private void notifyInputConnectionFinished() { 747c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne if (mServedView != null && mServedInputConnection != null) { 748c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne // We need to tell the previously served view that it is no 749c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne // longer the input target, so it can reset its state. Schedule 750c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne // this call on its window's Handler so it will be on the correct 751c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne // thread and outside of our lock. 752a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown ViewRootImpl viewRootImpl = mServedView.getViewRootImpl(); 753a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown if (viewRootImpl != null) { 754c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne // This will result in a call to reportFinishInputConnection() below. 755a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown viewRootImpl.dispatchFinishInputConnection(mServedInputConnection); 756c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne } 757c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne } 758c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne } 759c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called from the FINISH_INPUT_CONNECTION message above. 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reportFinishInputConnection(InputConnection ic) { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedInputConnection != ic) { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ic.finishComposingText(); 7679d69ecbf61a4a142c3f4cbb9d5659faa6f85e832Gilles Debunne // To avoid modifying the public InputConnection interface 7689d69ecbf61a4a142c3f4cbb9d5659faa6f85e832Gilles Debunne if (ic instanceof BaseInputConnection) { 7699d69ecbf61a4a142c3f4cbb9d5659faa6f85e832Gilles Debunne ((BaseInputConnection) ic).reportFinish(); 7709d69ecbf61a4a142c3f4cbb9d5659faa6f85e832Gilles Debunne } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 773c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void displayCompletions(View view, CompletionInfo[] completions) { 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 777b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 778b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCompletions = completions; 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod != null) { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.displayCompletions(mCompletions); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateExtractedText(View view, int token, ExtractedText text) { 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 795b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 796b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod != null) { 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.updateExtractedText(token, text); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #showSoftInput} to indicate that this is an implicit 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * request to show the input window, not as the result of a direct request 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the user. The window may not be shown in this case. 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SHOW_IMPLICIT = 0x0001; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #showSoftInput} to indicate that the user has forced 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input method open (such as by long-pressing menu) so it should 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be closed until they explicitly do so. 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SHOW_FORCED = 0x0002; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Synonym for {@link #showSoftInput(View, int, ResultReceiver)} without 8254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * a result receiver: explicitly request that the current input method's 8264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * soft input area be shown to the user, if needed. 8274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 8284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param view The currently focused view, which would like to receive 8294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * soft keyboard input. 8304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 8314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT} bit set. 8324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 8334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public boolean showSoftInput(View view, int flags) { 8344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return showSoftInput(view, flags, null); 8354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 8364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 8384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 8394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 8404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 8414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window was unchanged and remains shown. 8424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 8434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_UNCHANGED_SHOWN = 0; 8444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 8464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 8474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 8484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 8494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window was unchanged and remains hidden. 8504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 8514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_UNCHANGED_HIDDEN = 1; 8524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 8544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 8554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 8564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 8574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window changed from hidden to shown. 8584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 8594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_SHOWN = 2; 8604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 8624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 8634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 8644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 8654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window changed from shown to hidden. 8664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 8674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_HIDDEN = 3; 8684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Explicitly request that the current input method's soft input area be 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown to the user, if needed. Call this if the user interacts with 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your view in such a way that they have expressed they would like to 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * start performing input into it. 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The currently focused view, which would like to receive 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * soft keyboard input. 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT} bit set. 8794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param resultReceiver If non-null, this will be called by the IME when 8804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * it has processed your request to tell you what it has done. The result 8814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * code you receive may be either {@link #RESULT_UNCHANGED_SHOWN}, 8824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_UNCHANGED_HIDDEN}, {@link #RESULT_SHOWN}, or 8834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_HIDDEN}. 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 885ad8484b3799ba7046e57388e34ba9a4c0a971b42Gilles Debunne public boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 888b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 889b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 8904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return mService.showSoftInput(mClient, flags, resultReceiver); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 9034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void showSoftInputUnchecked(int flags, ResultReceiver resultReceiver) { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mService.showSoftInput(mClient, flags, resultReceiver); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #hideSoftInputFromWindow} to indicate that the soft 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input window should only be hidden if it was not explicitly shown 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the user. 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HIDE_IMPLICIT_ONLY = 0x0001; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #hideSoftInputFromWindow} to indicate that the soft 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input window should normally be hidden, unless it was originally 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown with {@link #SHOW_FORCED}. 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HIDE_NOT_ALWAYS = 0x0002; 923c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9257c8c6d689280ecfbd151a2e0cb40341768470676Gilles Debunne * Synonym for {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)} 9264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * without a result: request to hide the soft input window from the 9274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * context of the window that is currently accepting input. 9284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 9294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param windowToken The token of the window that is making the request, 9304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * as returned by {@link View#getWindowToken() View.getWindowToken()}. 9314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 9324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set. 9334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 9344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) { 9354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return hideSoftInputFromWindow(windowToken, flags, null); 9364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 9384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request to hide the soft input window from the context of the window 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is currently accepting input. This should be called as a result 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the user doing some actually than fairly explicitly requests to 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * have the input window hidden. 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param windowToken The token of the window that is making the request, 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as returned by {@link View#getWindowToken() View.getWindowToken()}. 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set. 9484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param resultReceiver If non-null, this will be called by the IME when 9494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * it has processed your request to tell you what it has done. The result 9504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * code you receive may be either {@link #RESULT_UNCHANGED_SHOWN}, 9514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_UNCHANGED_HIDDEN}, {@link #RESULT_SHOWN}, or 9524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_HIDDEN}. 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public boolean hideSoftInputFromWindow(IBinder windowToken, int flags, 9554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project ResultReceiver resultReceiver) { 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView == null || mServedView.getWindowToken() != windowToken) { 9594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return mService.hideSoftInput(mClient, flags, resultReceiver); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 9714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 9724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * This method toggles the input method window display. 9734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If the input window is already displayed, it gets hidden. 9744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If not the input window will be displayed. 9754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param windowToken The token of the window that is making the request, 9764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * as returned by {@link View#getWindowToken() View.getWindowToken()}. 9774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param showFlags Provides additional operating flags. May be 9784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT}, 9794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #SHOW_FORCED} bit set. 9804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param hideFlags Provides additional operating flags. May be 9814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, 9824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #HIDE_NOT_ALWAYS} bit set. 9834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project **/ 9844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void toggleSoftInputFromWindow(IBinder windowToken, int showFlags, int hideFlags) { 9854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 9864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mServedView == null || mServedView.getWindowToken() != windowToken) { 9874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 9884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mCurMethod != null) { 9904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 9914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod.toggleSoftInput(showFlags, hideFlags); 9924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 9934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 9984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /* 9994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * This method toggles the input method window display. 10004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If the input window is already displayed, it gets hidden. 10014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If not the input window will be displayed. 10024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param showFlags Provides additional operating flags. May be 10034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT}, 10044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #SHOW_FORCED} bit set. 10054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param hideFlags Provides additional operating flags. May be 10064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, 10074df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #HIDE_NOT_ALWAYS} bit set. 10084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @hide 10094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 10104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void toggleSoftInput(int showFlags, int hideFlags) { 10114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mCurMethod != null) { 10124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 10134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod.toggleSoftInput(showFlags, hideFlags); 10144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 10154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 10164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 10174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 10184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the input method is currently connected to the given view, 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * restart it with its new contents. You should call this when the text 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within your view changes outside of the normal input method or key 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input flow, such as when an application calls TextView.setText(). 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The view whose text has changed. 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void restartInput(View view) { 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 1030b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 1031b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = true; 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10387663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn startInputInner(null, 0, 0, 0); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10417663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn boolean startInputInner(IBinder windowGainingFocus, int controlFlags, int softInputMode, 10427663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn int windowFlags) { 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view; 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mServedView; 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure we have a window token for the served view. 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: view=" + view); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view == null) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "ABORT input: no served view!"); 10517663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn return false; 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now we need to get an input connection from the served view. 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is complicated in a couple ways: we can't be holding our lock 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when calling out to the view, and we need to make sure we call into 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the view on the same thread that is driving its view hierarchy. 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler vh = view.getHandler(); 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vh == null) { 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the view doesn't have a handler, something has changed out 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // from under us, so just bail. 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "ABORT input: no handler for view!"); 10647663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn return false; 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vh.getLooper() != Looper.myLooper()) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The view is running on a different thread than our own, so 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to reschedule our work for over there. 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: reschedule to view thread"); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vh.post(new Runnable() { 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 10727663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn startInputInner(null, 0, 0, 0); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 10757663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn return false; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Okay we are now ready to call into the served view and have it 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do its stuff. 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Life is good: let's hook everything up! 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditorInfo tba = new EditorInfo(); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tba.packageName = view.getContext().getPackageName(); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tba.fieldId = view.getId(); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputConnection ic = view.onCreateInputConnection(tba); 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: tba=" + tba + " ic=" + ic); 1086c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now that we are locked again, validate that our state hasn't 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changed. 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView != view || !mServedConnecting) { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Something else happened, so abort. 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Starting input: finished by someone else (view=" 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mServedView + " conn=" + mServedConnecting + ")"); 10957663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn return false; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10977663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we already have a text box, then this view is already 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // connected so we want to restart it. 11007663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (mCurrentTextBoxAttribute == null) { 11017663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn controlFlags |= CONTROL_START_INITIAL; 11027663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Hook 'em up and let 'er rip. 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute = tba; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = false; 1107c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne // Notify the served view that its previous input connection is finished 1108c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne notifyInputConnectionFinished(); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedInputConnection = ic; 1110ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn ControlledInputConnectionWrapper servedContext; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ic != null) { 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelStart = tba.initialSelStart; 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelEnd = tba.initialSelEnd; 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandStart = -1; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandEnd = -1; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorRect.setEmpty(); 1117de9dbb05ce57a1617efc131f6a724c2a2b164bf7Jean Chalard servedContext = new ControlledInputConnectionWrapper(vh.getLooper(), ic, this); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project servedContext = null; 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1121ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn if (mServedInputConnectionWrapper != null) { 1122ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn mServedInputConnectionWrapper.deactivate(); 1123ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn } 1124ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn mServedInputConnectionWrapper = servedContext; 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "START INPUT: " + view + " ic=" 11287663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn + ic + " tba=" + tba + " controlFlags=#" 11297663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn + Integer.toHexString(controlFlags)); 11307663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn InputBindResult res; 11317663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (windowGainingFocus != null) { 11327663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn res = mService.windowGainedFocus(mClient, windowGainingFocus, 11337663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn controlFlags, softInputMode, windowFlags, 11347663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn tba, servedContext); 11357663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } else { 11367663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn res = mService.startInput(mClient, 11377663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn servedContext, tba, controlFlags); 11387663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: Bind result=" + res); 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res.id != null) { 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBindSequence = res.sequence; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod = res.method; 114404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mCurId = res.id; 1145560bcb34fad8bfe642d9ab6f38d973185d253af5satok } else if (mCurMethod == null) { 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This means there is no input method available. 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "ABORT input: no input method!"); 11487663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn return true; 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod != null && mCompletions != null) { 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.displayCompletions(mCompletions); 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11617663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 11627663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn return true; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When the focused window is dismissed, this method is called to finish the 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input method started before. 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void windowDismissed(IBinder appWindowToken) { 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView != null && 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedView.getWindowToken() == appWindowToken) { 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finishInputLocked(); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call this when a view receives focus. 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void focusIn(View view) { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusInLocked(view); 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void focusInLocked(View view) { 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "focusIn: " + view); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurRootView != view.getRootView()) { 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a request from a window that isn't in the window with 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IME focus, so ignore it. 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Not IME target window, ignoring"); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedView = view; 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduleCheckFocusLocked(view); 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call this when a view loses focus. 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void focusOut(View view) { 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "focusOut: " + view 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mServedView=" + mServedView 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " winFocus=" + view.hasWindowFocus()); 1213b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view) { 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The following code would auto-hide the IME if we end up 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with no more views with focus. This can happen, however, 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // whenever we go into touch mode, so it ends up hiding 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at times when we don't really want it to. For now it 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // seems better to just turn it all off. 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false && view.hasWindowFocus()) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedView = null; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduleCheckFocusLocked(view); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1227c478c171e92b2f255e9699d9c9306b001368ac20Gilles Debunne static void scheduleCheckFocusLocked(View view) { 1228a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown ViewRootImpl viewRootImpl = view.getViewRootImpl(); 1229a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown if (viewRootImpl != null) { 1230a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown viewRootImpl.dispatchCheckFocus(); 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1233a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown 123431e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok private void checkFocus(boolean forceNewFocus) { 123531e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok if (checkFocusNoStartInput(forceNewFocus)) { 123631e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok startInputInner(null, 0, 0, 0); 123731e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok } 123831e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok } 123931e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void checkFocus() { 124431e4e149941e34cd135dfa0b6d918cc0b3dabbbcsatok checkFocus(false); 1245a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn } 1246a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn 12477663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn private boolean checkFocusNoStartInput(boolean forceNewFocus) { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is called a lot, so short-circuit before locking. 12497663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (mServedView == mNextServedView && !forceNewFocus) { 1250a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn return false; 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1252863fcd62171e55bc9f2105d9fb5877df982454d8satok 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputConnection ic = null; 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 12557663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (mServedView == mNextServedView && !forceNewFocus) { 1256a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn return false; 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "checkFocus: view=" + mServedView 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " next=" + mNextServedView 126005a6cbe2863614a1761adc033c905458b27be47esatok + " forceNewFocus=" + forceNewFocus 126105a6cbe2863614a1761adc033c905458b27be47esatok + " package=" 126205a6cbe2863614a1761adc033c905458b27be47esatok + (mServedView != null ? mServedView.getContext().getPackageName() : "<none>")); 1263a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextServedView == null) { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finishInputLocked(); 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, we used to have a focused view on the window, 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but no longer do. We should make sure the input method is 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no longer shown, since it serves no purpose. 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeCurrentInput(); 1270a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn return false; 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1272a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ic = mServedInputConnection; 1274a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedView = mNextServedView; 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute = null; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCompletions = null; 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = true; 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1280a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ic != null) { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ic.finishComposingText(); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1284a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn 1285a82ba54b0bbc3ff41f29db3998806cb45b261d58Dianne Hackborn return true; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void closeCurrentInput() { 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mService.hideSoftInput(mClient, HIDE_NOT_ALWAYS, null); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12947663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1296c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato * Called by ViewAncestor when its window gets input focus. 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onWindowFocus(View rootView, View focusedView, int softInputMode, 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first, int windowFlags) { 13017663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn boolean forceNewFocus = false; 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "onWindowFocus: " + focusedView 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " softInputMode=" + softInputMode 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " first=" + first + " flags=#" 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(windowFlags)); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHasBeenInactive) { 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Has been inactive! Starting fresh"); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBeenInactive = false; 13107663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn forceNewFocus = true; 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusInLocked(focusedView != null ? focusedView : rootView); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13147663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn 13157663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn int controlFlags = 0; 13167663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (focusedView != null) { 13177663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn controlFlags |= CONTROL_WINDOW_VIEW_HAS_FOCUS; 13187663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (focusedView.onCheckIsTextEditor()) { 13197663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn controlFlags |= CONTROL_WINDOW_IS_TEXT_EDITOR; 13207663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } 13217663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } 13227663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (first) { 13237663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn controlFlags |= CONTROL_WINDOW_FIRST; 13247663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13267663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (checkFocusNoStartInput(forceNewFocus)) { 13277663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn // We need to restart input on the current focus view. This 13287663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn // should be done in conjunction with telling the system service 13297663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn // about the window gaining focus, to help make the transition 13307663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn // smooth. 13317663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn if (startInputInner(rootView.getWindowToken(), 13327663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn controlFlags, softInputMode, windowFlags)) { 13337663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn return; 13347663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } 13357663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn } 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13377663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn // For some reason we didn't do a startInput + windowFocusGain, so 13387663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn // we'll just do a window focus gain and call it a day. 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1341ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn if (DEBUG) Log.v(TAG, "Reporting focus gain, without startInput"); 1342b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mService.windowGainedFocus(mClient, rootView.getWindowToken(), 13437663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn controlFlags, softInputMode, windowFlags, null, null); 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startGettingWindowFocus(View rootView) { 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurRootView = rootView; 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report the current selection range. 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateSelection(View view, int selStart, int selEnd, 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int candidatesStart, int candidatesEnd) { 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 1363b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if ((mServedView != view && (mServedView == null 1364b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) 1365b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || mCurrentTextBoxAttribute == null || mCurMethod == null) { 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCursorSelStart != selStart || mCursorSelEnd != selEnd 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mCursorCandStart != candidatesStart 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mCursorCandEnd != candidatesEnd) { 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "updateSelection"); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "SELECTION CHANGE: " + mCurMethod); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.updateSelection(mCursorSelStart, mCursorSelEnd, 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selStart, selEnd, candidatesStart, candidatesEnd); 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelStart = selStart; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelEnd = selEnd; 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandStart = candidatesStart; 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandEnd = candidatesEnd; 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1390863fcd62171e55bc9f2105d9fb5877df982454d8satok * Notify the event when the user tapped or clicked the text view. 1391863fcd62171e55bc9f2105d9fb5877df982454d8satok */ 1392863fcd62171e55bc9f2105d9fb5877df982454d8satok public void viewClicked(View view) { 1393863fcd62171e55bc9f2105d9fb5877df982454d8satok final boolean focusChanged = mServedView != mNextServedView; 1394863fcd62171e55bc9f2105d9fb5877df982454d8satok checkFocus(); 1395863fcd62171e55bc9f2105d9fb5877df982454d8satok synchronized (mH) { 1396863fcd62171e55bc9f2105d9fb5877df982454d8satok if ((mServedView != view && (mServedView == null 1397863fcd62171e55bc9f2105d9fb5877df982454d8satok || !mServedView.checkInputConnectionProxy(view))) 1398863fcd62171e55bc9f2105d9fb5877df982454d8satok || mCurrentTextBoxAttribute == null || mCurMethod == null) { 1399863fcd62171e55bc9f2105d9fb5877df982454d8satok return; 1400863fcd62171e55bc9f2105d9fb5877df982454d8satok } 1401863fcd62171e55bc9f2105d9fb5877df982454d8satok try { 1402863fcd62171e55bc9f2105d9fb5877df982454d8satok if (DEBUG) Log.v(TAG, "onViewClicked: " + focusChanged); 1403863fcd62171e55bc9f2105d9fb5877df982454d8satok mCurMethod.viewClicked(focusChanged); 1404863fcd62171e55bc9f2105d9fb5877df982454d8satok } catch (RemoteException e) { 1405863fcd62171e55bc9f2105d9fb5877df982454d8satok Log.w(TAG, "IME died: " + mCurId, e); 1406863fcd62171e55bc9f2105d9fb5877df982454d8satok } 1407863fcd62171e55bc9f2105d9fb5877df982454d8satok } 1408863fcd62171e55bc9f2105d9fb5877df982454d8satok } 1409863fcd62171e55bc9f2105d9fb5877df982454d8satok 1410863fcd62171e55bc9f2105d9fb5877df982454d8satok /** 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the current input method wants to watch the location 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the input editor's cursor in its window. 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWatchingCursor(View view) { 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report the current cursor location in its window. 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateCursor(View view, int left, int top, int right, int bottom) { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 1424b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if ((mServedView != view && (mServedView == null 1425b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) 1426b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || mCurrentTextBoxAttribute == null || mCurMethod == null) { 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTmpCursorRect.set(left, top, right, bottom); 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCursorRect.equals(mTmpCursorRect)) { 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "updateCursor"); 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "CURSOR CHANGE: " + mCurMethod); 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.updateCursor(mTmpCursorRect); 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorRect.set(mTmpCursorRect); 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call {@link InputMethodSession#appPrivateCommand(String, Bundle) 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * InputMethodSession.appPrivateCommand()} on the current Input Method. 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view Optional View that is sending the command, or null if 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you want to send the command regardless of the view that is attached 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the input method. 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param action Name of the command to be performed. This <em>must</em> 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a scoped name, i.e. prefixed with a package name you own, so that 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different developers will not create conflicting commands. 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data Any data to include with the command. 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendAppPrivateCommand(View view, String action, Bundle data) { 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 1459b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if ((mServedView != view && (mServedView == null 1460b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mCurrentTextBoxAttribute == null || mCurMethod == null) { 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "APP PRIVATE COMMAND " + action + ": " + data); 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.appPrivateCommand(action, data); 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14722820351489537698ad153c6397edf3270455edc5satok 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14742820351489537698ad153c6397edf3270455edc5satok * Force switch to a new input method component. This can only be called 14752820351489537698ad153c6397edf3270455edc5satok * from an application or a service which has a token of the currently active input method. 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token Supplies the identifying token given to an input method 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started, which allows it to perform this operation on 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * itself. 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The unique identifier for the new input method to be switched to. 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInputMethod(IBinder token, String id) { 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.setInputMethod(token, id); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14882820351489537698ad153c6397edf3270455edc5satok 14892820351489537698ad153c6397edf3270455edc5satok /** 14902820351489537698ad153c6397edf3270455edc5satok * Force switch to a new input method and subtype. This can only be called 14912820351489537698ad153c6397edf3270455edc5satok * from an application or a service which has a token of the currently active input method. 14922820351489537698ad153c6397edf3270455edc5satok * @param token Supplies the identifying token given to an input method 14932820351489537698ad153c6397edf3270455edc5satok * when it was started, which allows it to perform this operation on 14942820351489537698ad153c6397edf3270455edc5satok * itself. 14952820351489537698ad153c6397edf3270455edc5satok * @param id The unique identifier for the new input method to be switched to. 14962820351489537698ad153c6397edf3270455edc5satok * @param subtype The new subtype of the new input method to be switched to. 14972820351489537698ad153c6397edf3270455edc5satok */ 14982820351489537698ad153c6397edf3270455edc5satok public void setInputMethodAndSubtype(IBinder token, String id, InputMethodSubtype subtype) { 14992820351489537698ad153c6397edf3270455edc5satok try { 15002820351489537698ad153c6397edf3270455edc5satok mService.setInputMethodAndSubtype(token, id, subtype); 15012820351489537698ad153c6397edf3270455edc5satok } catch (RemoteException e) { 15022820351489537698ad153c6397edf3270455edc5satok throw new RuntimeException(e); 15032820351489537698ad153c6397edf3270455edc5satok } 15042820351489537698ad153c6397edf3270455edc5satok } 15052820351489537698ad153c6397edf3270455edc5satok 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Close/hide the input method's soft input area, so the user no longer 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sees it or can interact with it. This can only be called 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the currently active input method, as validated by the given token. 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token Supplies the identifying token given to an input method 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started, which allows it to perform this operation on 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * itself. 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 15154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, 15164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #HIDE_NOT_ALWAYS} bit set. 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void hideSoftInputFromInputMethod(IBinder token, int flags) { 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.hideMySoftInput(token, flags); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Show the input method's soft input area, so the user 15284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * sees the input method window and can interact with it. 15294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * This can only be called from the currently active input method, 15304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * as validated by the given token. 15314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 15324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param token Supplies the identifying token given to an input method 15334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * when it was started, which allows it to perform this operation on 15344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * itself. 15354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 15364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT} or 15374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #SHOW_FORCED} bit set. 15384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 15394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void showSoftInputFromInputMethod(IBinder token, int flags) { 15404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 15414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mService.showMySoftInput(token, flags); 15424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 15434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project throw new RuntimeException(e); 15444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 15454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 15464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 15474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchKeyEvent(Context context, int seq, KeyEvent key, 155104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown FinishedEventCallback callback) { 155204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown boolean handled = false; 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "dispatchKeyEvent"); 155504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 155604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (mCurMethod != null) { 155704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (key.getAction() == KeyEvent.ACTION_DOWN 155804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown && key.getKeyCode() == KeyEvent.KEYCODE_SYM) { 155904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown showInputMethodPickerLocked(); 156004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown handled = true; 156104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } else { 156204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown try { 156304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod); 156404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown final long startTime = SystemClock.uptimeMillis(); 156504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mCurMethod.dispatchKeyEvent(seq, key, mInputMethodCallback); 156604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown enqueuePendingEventLocked(startTime, seq, mCurId, callback); 156704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return; 156804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } catch (RemoteException e) { 156904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown Log.w(TAG, "IME died: " + mCurId + " dropping: " + key, e); 157004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 157404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 157504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown callback.finishedEvent(seq, handled); 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchTrackballEvent(Context context, int seq, MotionEvent motion, 158204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown FinishedEventCallback callback) { 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "dispatchTrackballEvent"); 158504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 158604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (mCurMethod != null && mCurrentTextBoxAttribute != null) { 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 158804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (DEBUG) Log.v(TAG, "DISPATCH TRACKBALL: " + mCurMethod); 158904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown final long startTime = SystemClock.uptimeMillis(); 159004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mCurMethod.dispatchTrackballEvent(seq, motion, mInputMethodCallback); 159104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown enqueuePendingEventLocked(startTime, seq, mCurId, callback); 159204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return; 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 159404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown Log.w(TAG, "IME died: " + mCurId + " dropping trackball: " + motion, e); 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 159704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 159804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 159904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown callback.finishedEvent(seq, false); 160004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 160104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 160204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown void finishedEvent(int seq, boolean handled) { 160304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown final FinishedEventCallback callback; 160404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown synchronized (mH) { 160504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent p = dequeuePendingEventLocked(seq); 160604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (p == null) { 160704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return; // spurious, event already finished or timed out 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 160904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mH.removeMessages(MSG_EVENT_TIMEOUT, p); 161004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown callback = p.mCallback; 161104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown recyclePendingEventLocked(p); 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 161304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown callback.finishedEvent(seq, handled); 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1615ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 161604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown void timeoutEvent(int seq) { 161704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown final FinishedEventCallback callback; 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 161904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent p = dequeuePendingEventLocked(seq); 162004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (p == null) { 162104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return; // spurious, event already finished or timed out 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 162304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown long delay = SystemClock.uptimeMillis() - p.mStartTime; 162404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown Log.w(TAG, "Timeout waiting for IME to handle input event after " 162504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown + delay + "ms: " + p.mInputMethodId); 162604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown callback = p.mCallback; 162704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown recyclePendingEventLocked(p); 162804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 162904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown callback.finishedEvent(seq, false); 163004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 163104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 163204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown private void enqueuePendingEventLocked( 163304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown long startTime, int seq, String inputMethodId, FinishedEventCallback callback) { 163404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent p = obtainPendingEventLocked(startTime, seq, inputMethodId, callback); 163504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mNext = mFirstPendingEvent; 163604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mFirstPendingEvent = p; 163704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 163804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown Message msg = mH.obtainMessage(MSG_EVENT_TIMEOUT, seq, 0, p); 163904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown msg.setAsynchronous(true); 164004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mH.sendMessageDelayed(msg, INPUT_METHOD_NOT_RESPONDING_TIMEOUT); 164104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 164204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 164304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown private PendingEvent dequeuePendingEventLocked(int seq) { 164404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent p = mFirstPendingEvent; 164504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (p == null) { 164604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return null; 164704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 164804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (p.mSeq == seq) { 164904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mFirstPendingEvent = p.mNext; 165004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } else { 165104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent prev = p; 165204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown do { 165304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p = prev.mNext; 165404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (p == null) { 165504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return null; 165604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 165704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } while (p.mSeq != seq); 165804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown prev.mNext = p.mNext; 165904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 166004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mNext = null; 166104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return p; 166204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 166304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 166404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown private PendingEvent obtainPendingEventLocked( 166504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown long startTime, int seq, String inputMethodId, FinishedEventCallback callback) { 166604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown PendingEvent p = mPendingEventPool; 166704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (p != null) { 166804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mPendingEventPoolSize -= 1; 166904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mPendingEventPool = p.mNext; 167004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mNext = null; 167104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } else { 167204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p = new PendingEvent(); 167304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 167404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 167504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mStartTime = startTime; 167604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mSeq = seq; 167704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mInputMethodId = inputMethodId; 167804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mCallback = callback; 167904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown return p; 168004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 168104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 168204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown private void recyclePendingEventLocked(PendingEvent p) { 168304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mInputMethodId = null; 168404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mCallback = null; 168504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 168604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown if (mPendingEventPoolSize < MAX_PENDING_EVENT_POOL_SIZE) { 168704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mPendingEventPoolSize += 1; 168804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown p.mNext = mPendingEventPool; 168904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mPendingEventPool = p; 169004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 169104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 169204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 169304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public void showInputMethodPicker() { 169404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown synchronized (mH) { 169504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown showInputMethodPickerLocked(); 169604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 169704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 169804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 169904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown private void showInputMethodPickerLocked() { 170004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown try { 170104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown mService.showInputMethodPickerFromClient(mClient); 170204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } catch (RemoteException e) { 170304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown Log.w(TAG, "IME died: " + mCurId, e); 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 1707d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1708d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Show the settings for enabling subtypes of the specified input method. 1709d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param imiId An input method, whose subtypes settings will be shown. If imiId is null, 1710d4fce2b7f1a861590ce84afcf2f569189251bc59satok * subtypes of all input methods will be shown. 1711d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1712d4fce2b7f1a861590ce84afcf2f569189251bc59satok public void showInputMethodAndSubtypeEnabler(String imiId) { 171347a44916e2fb33cf4751906386d5f5c903b28d8bsatok synchronized (mH) { 171447a44916e2fb33cf4751906386d5f5c903b28d8bsatok try { 1715d4fce2b7f1a861590ce84afcf2f569189251bc59satok mService.showInputMethodAndSubtypeEnablerFromClient(mClient, imiId); 171647a44916e2fb33cf4751906386d5f5c903b28d8bsatok } catch (RemoteException e) { 171747a44916e2fb33cf4751906386d5f5c903b28d8bsatok Log.w(TAG, "IME died: " + mCurId, e); 171847a44916e2fb33cf4751906386d5f5c903b28d8bsatok } 171947a44916e2fb33cf4751906386d5f5c903b28d8bsatok } 172047a44916e2fb33cf4751906386d5f5c903b28d8bsatok } 172147a44916e2fb33cf4751906386d5f5c903b28d8bsatok 1722d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1723d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Returns the current input method subtype. This subtype is one of the subtypes in 1724d4fce2b7f1a861590ce84afcf2f569189251bc59satok * the current input method. This method returns null when the current input method doesn't 1725d4fce2b7f1a861590ce84afcf2f569189251bc59satok * have any input method subtype. 1726d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 172704d50204705c9da52b218f11972da4e7d7a9cb84satok public InputMethodSubtype getCurrentInputMethodSubtype() { 172804d50204705c9da52b218f11972da4e7d7a9cb84satok synchronized (mH) { 172904d50204705c9da52b218f11972da4e7d7a9cb84satok try { 173004d50204705c9da52b218f11972da4e7d7a9cb84satok return mService.getCurrentInputMethodSubtype(); 173104d50204705c9da52b218f11972da4e7d7a9cb84satok } catch (RemoteException e) { 173204d50204705c9da52b218f11972da4e7d7a9cb84satok Log.w(TAG, "IME died: " + mCurId, e); 173304d50204705c9da52b218f11972da4e7d7a9cb84satok return null; 173404d50204705c9da52b218f11972da4e7d7a9cb84satok } 173504d50204705c9da52b218f11972da4e7d7a9cb84satok } 173604d50204705c9da52b218f11972da4e7d7a9cb84satok } 173704d50204705c9da52b218f11972da4e7d7a9cb84satok 1738d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1739d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Switch to a new input method subtype of the current input method. 1740d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param subtype A new input method subtype to switch. 1741d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @return true if the current subtype was successfully switched. When the specified subtype is 1742d4fce2b7f1a861590ce84afcf2f569189251bc59satok * null, this method returns false. 1743d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1744b66d287e3003a0934d5714fbf15e554b3c814906satok public boolean setCurrentInputMethodSubtype(InputMethodSubtype subtype) { 1745b66d287e3003a0934d5714fbf15e554b3c814906satok synchronized (mH) { 1746b66d287e3003a0934d5714fbf15e554b3c814906satok try { 1747b66d287e3003a0934d5714fbf15e554b3c814906satok return mService.setCurrentInputMethodSubtype(subtype); 1748b66d287e3003a0934d5714fbf15e554b3c814906satok } catch (RemoteException e) { 1749b66d287e3003a0934d5714fbf15e554b3c814906satok Log.w(TAG, "IME died: " + mCurId, e); 1750b66d287e3003a0934d5714fbf15e554b3c814906satok return false; 1751b66d287e3003a0934d5714fbf15e554b3c814906satok } 1752b66d287e3003a0934d5714fbf15e554b3c814906satok } 1753b66d287e3003a0934d5714fbf15e554b3c814906satok } 1754b66d287e3003a0934d5714fbf15e554b3c814906satok 1755d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1756d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Returns a map of all shortcut input method info and their subtypes. 1757d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1758f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes() { 17594e4569dab5c75804b01a19b2d6e6101b445c1c68satok synchronized (mH) { 1760f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok HashMap<InputMethodInfo, List<InputMethodSubtype>> ret = 1761f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok new HashMap<InputMethodInfo, List<InputMethodSubtype>>(); 17624e4569dab5c75804b01a19b2d6e6101b445c1c68satok try { 17634e4569dab5c75804b01a19b2d6e6101b445c1c68satok // TODO: We should change the return type from List<Object> to List<Parcelable> 17644e4569dab5c75804b01a19b2d6e6101b445c1c68satok List<Object> info = mService.getShortcutInputMethodsAndSubtypes(); 1765f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok // "info" has imi1, subtype1, subtype2, imi2, subtype2, imi3, subtype3..in the list 1766f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok ArrayList<InputMethodSubtype> subtypes = null; 1767f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok final int N = info.size(); 1768f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok if (info != null && N > 0) { 1769f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok for (int i = 0; i < N; ++i) { 1770f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok Object o = info.get(i); 1771f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok if (o instanceof InputMethodInfo) { 1772f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok if (ret.containsKey(o)) { 1773f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok Log.e(TAG, "IMI list already contains the same InputMethod."); 1774f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok break; 17754e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 1776f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok subtypes = new ArrayList<InputMethodSubtype>(); 1777f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok ret.put((InputMethodInfo)o, subtypes); 1778f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok } else if (subtypes != null && o instanceof InputMethodSubtype) { 1779f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok subtypes.add((InputMethodSubtype)o); 17804e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 17814e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 17824e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 17834e4569dab5c75804b01a19b2d6e6101b445c1c68satok } catch (RemoteException e) { 17844e4569dab5c75804b01a19b2d6e6101b445c1c68satok Log.w(TAG, "IME died: " + mCurId, e); 17854e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 17864e4569dab5c75804b01a19b2d6e6101b445c1c68satok return ret; 17874e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 17884e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 1789f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok 1790d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1791d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Force switch to the last used input method and subtype. If the last input method didn't have 1792d4fce2b7f1a861590ce84afcf2f569189251bc59satok * any subtypes, the framework will simply switch to the last input method with no subtype 1793d4fce2b7f1a861590ce84afcf2f569189251bc59satok * specified. 1794d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param imeToken Supplies the identifying token given to an input method when it was started, 1795d4fce2b7f1a861590ce84afcf2f569189251bc59satok * which allows it to perform this operation on itself. 1796d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @return true if the current input method and subtype was successfully switched to the last 1797d4fce2b7f1a861590ce84afcf2f569189251bc59satok * used input method and subtype. 1798d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1799735cf38b8c7f8f91ad087511e44fe79018fa61d6satok public boolean switchToLastInputMethod(IBinder imeToken) { 1800735cf38b8c7f8f91ad087511e44fe79018fa61d6satok synchronized (mH) { 1801735cf38b8c7f8f91ad087511e44fe79018fa61d6satok try { 1802735cf38b8c7f8f91ad087511e44fe79018fa61d6satok return mService.switchToLastInputMethod(imeToken); 1803735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } catch (RemoteException e) { 1804735cf38b8c7f8f91ad087511e44fe79018fa61d6satok Log.w(TAG, "IME died: " + mCurId, e); 1805735cf38b8c7f8f91ad087511e44fe79018fa61d6satok return false; 1806735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } 1807735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } 1808735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } 1809735cf38b8c7f8f91ad087511e44fe79018fa61d6satok 1810e7c6998e0a953ae55487d4fe122739646f9280aasatok /** 1811688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * Force switch to the next input method and subtype. If there is no IME enabled except 1812688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * current IME and subtype, do nothing. 1813688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * @param imeToken Supplies the identifying token given to an input method when it was started, 1814688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * which allows it to perform this operation on itself. 1815688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * @param onlyCurrentIme if true, the framework will find the next subtype which 1816688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * belongs to the current IME 1817688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * @return true if the current input method and subtype was successfully switched to the next 1818688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok * input method and subtype. 1819688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok */ 1820688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok public boolean switchToNextInputMethod(IBinder imeToken, boolean onlyCurrentIme) { 1821688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok synchronized (mH) { 1822688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok try { 1823688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok return mService.switchToNextInputMethod(imeToken, onlyCurrentIme); 1824688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok } catch (RemoteException e) { 1825688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok Log.w(TAG, "IME died: " + mCurId, e); 1826688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok return false; 1827688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok } 1828688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok } 1829688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok } 1830688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok 1831688bd47fccf1a1373e6287bc49b5b33fad12b7f3satok /** 183291e88122cf28a48fd2e2260da7d3d87dd437227asatok * Set additional input method subtypes. Only a process which shares the same uid with the IME 183391e88122cf28a48fd2e2260da7d3d87dd437227asatok * can add additional input method subtypes to the IME. 183475917b603fe83a87c0fe3902e1a768fc31f8d120satok * Please note that a subtype's status is stored in the system. 183575917b603fe83a87c0fe3902e1a768fc31f8d120satok * For example, enabled subtypes are remembered by the framework even after they are removed 183675917b603fe83a87c0fe3902e1a768fc31f8d120satok * by using this method. If you re-add the same subtypes again, 183775917b603fe83a87c0fe3902e1a768fc31f8d120satok * they will just get enabled. If you want to avoid such conflicts, for instance, you may 183875917b603fe83a87c0fe3902e1a768fc31f8d120satok * want to create a "different" new subtype even with the same locale and mode, 183975917b603fe83a87c0fe3902e1a768fc31f8d120satok * by changing its extra value. The different subtype won't get affected by the stored past 184075917b603fe83a87c0fe3902e1a768fc31f8d120satok * status. (You may want to take a look at {@link InputMethodSubtype#hashCode()} to refer 184175917b603fe83a87c0fe3902e1a768fc31f8d120satok * to the current implementation.) 184291e88122cf28a48fd2e2260da7d3d87dd437227asatok * @param imiId Id of InputMethodInfo which additional input method subtypes will be added to. 1843e7c6998e0a953ae55487d4fe122739646f9280aasatok * @param subtypes subtypes will be added as additional subtypes of the current input method. 1844e7c6998e0a953ae55487d4fe122739646f9280aasatok */ 1845ee5e77cafec2eae70890abdcc1646ed39b06edddsatok public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) { 1846e7c6998e0a953ae55487d4fe122739646f9280aasatok synchronized (mH) { 1847e7c6998e0a953ae55487d4fe122739646f9280aasatok try { 1848ee5e77cafec2eae70890abdcc1646ed39b06edddsatok mService.setAdditionalInputMethodSubtypes(imiId, subtypes); 1849e7c6998e0a953ae55487d4fe122739646f9280aasatok } catch (RemoteException e) { 1850e7c6998e0a953ae55487d4fe122739646f9280aasatok Log.w(TAG, "IME died: " + mCurId, e); 1851e7c6998e0a953ae55487d4fe122739646f9280aasatok } 1852e7c6998e0a953ae55487d4fe122739646f9280aasatok } 1853e7c6998e0a953ae55487d4fe122739646f9280aasatok } 1854e7c6998e0a953ae55487d4fe122739646f9280aasatok 185568f1b78b7b9139a0e34285ff641a664e664a14b8satok public InputMethodSubtype getLastInputMethodSubtype() { 185668f1b78b7b9139a0e34285ff641a664e664a14b8satok synchronized (mH) { 185768f1b78b7b9139a0e34285ff641a664e664a14b8satok try { 185868f1b78b7b9139a0e34285ff641a664e664a14b8satok return mService.getLastInputMethodSubtype(); 185968f1b78b7b9139a0e34285ff641a664e664a14b8satok } catch (RemoteException e) { 186068f1b78b7b9139a0e34285ff641a664e664a14b8satok Log.w(TAG, "IME died: " + mCurId, e); 186168f1b78b7b9139a0e34285ff641a664e664a14b8satok return null; 186268f1b78b7b9139a0e34285ff641a664e664a14b8satok } 186368f1b78b7b9139a0e34285ff641a664e664a14b8satok } 186468f1b78b7b9139a0e34285ff641a664e664a14b8satok } 186568f1b78b7b9139a0e34285ff641a664e664a14b8satok 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doDump(FileDescriptor fd, PrintWriter fout, String[] args) { 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Printer p = new PrintWriterPrinter(fout); 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println("Input method client state for " + this + ":"); 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mService=" + mService); 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mMainLooper=" + mMainLooper); 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mIInputContext=" + mIInputContext); 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mActive=" + mActive 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mHasBeenInactive=" + mHasBeenInactive 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mBindSequence=" + mBindSequence 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCurId=" + mCurId); 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurMethod=" + mCurMethod); 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurRootView=" + mCurRootView); 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mServedView=" + mServedView); 18807663d80f6b6fd6ca7a736c3802013a09c0abdeb9Dianne Hackborn p.println(" mNextServedView=" + mNextServedView); 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mServedConnecting=" + mServedConnecting); 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentTextBoxAttribute != null) { 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurrentTextBoxAttribute:"); 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute.dump(p, " "); 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurrentTextBoxAttribute: null"); 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mServedInputConnection=" + mServedInputConnection); 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCompletions=" + mCompletions); 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCursorRect=" + mCursorRect); 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCursorSelStart=" + mCursorSelStart 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCursorSelEnd=" + mCursorSelEnd 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCursorCandStart=" + mCursorCandStart 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCursorCandEnd=" + mCursorCandEnd); 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 189604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 189704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown /** 189804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown * Callback that is invoked when an input event that was dispatched to 189904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown * the IME has been finished. 190004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown * @hide 190104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown */ 190204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public interface FinishedEventCallback { 190304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public void finishedEvent(int seq, boolean handled); 190404ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 190504ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 190604ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown private static final class PendingEvent { 190704ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public PendingEvent mNext; 190804ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown 190904ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public long mStartTime; 191004ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public int mSeq; 191104ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public String mInputMethodId; 191204ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown public FinishedEventCallback mCallback; 191304ddf3c0508f3d50e6ab82cecc0adc92f52b7803Jeff Brown } 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1915