InputMethodManager.java revision d4fce2b7f1a861590ce84afcf2f569189251bc59
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; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.PrintWriterPrinter; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewRoot; 45d4723bb415dc70008c744d1027c3e3d9473adfe1Gilles Debunne 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 484e4569dab5c75804b01a19b2d6e6101b445c1c68satokimport java.util.ArrayList; 49f3db1af8d55ab247b6db67baf4fe772c18f33cabsatokimport java.util.HashMap; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 51f3db1af8d55ab247b6db67baf4fe772c18f33cabsatokimport java.util.Map; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.concurrent.CountDownLatch; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.concurrent.TimeUnit; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Central system API to the overall input method framework (IMF) architecture, 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which arbitrates interaction between applications and the current input method. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can retrieve an instance of this interface with 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#getSystemService(String) Context.getSystemService()}. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here: 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ArchitectureOverview">Architecture Overview</a> 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ArchitectureOverview"></a> 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Architecture Overview</h3> 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are three primary parties involved in the input method 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * framework (IMF) architecture:</p> 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The <strong>input method manager</strong> as expressed by this class 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the central point of the system that manages interaction between all 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other parts. It is expressed as the client-side API here which exists 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in each application context and communicates with a global system service 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that manages the interaction across all processes. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> An <strong>input method (IME)</strong> implements a particular 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interaction model allowing the user to generate text. The system binds 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the current input method that is use, causing it to be created and run, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and tells it when to hide and show its UI. Only one IME is running at a time. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Multiple <strong>client applications</strong> arbitrate with the input 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method manager for input focus and control over the state of the IME. Only 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one such client is ever active (working with the IME) at a time. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Applications"></a> 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Applications</h3> 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In most cases, applications that are using the standard 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.TextView} or its subclasses will have little they need 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do to work well with soft input methods. The main things you need to 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be aware of are:</p> 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 978cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunne * <li> Properly set the {@link android.R.attr#inputType} in your editable 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text views, so that the input method will have enough context to help the 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user in entering text into them. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Deal well with losing screen space when the input method is 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * displayed. Ideally an application should handle its window being resized 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * smaller, but it can rely on the system performing panning of the window 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. You should set the {@link android.R.attr#windowSoftInputMode} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute on your activity or the corresponding values on windows you 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * create to help the system determine whether to pan or resize (it will 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * try to determine this automatically but may get it wrong). 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> You can also control the preferred soft input state (open, closed, etc) 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for your window using the same {@link android.R.attr#windowSoftInputMode} 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attribute. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>More finer-grained control is available through the APIs here to directly 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interact with the IMF and its IME -- either showing or hiding the input 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * area, letting the user pick an input method, etc.</p> 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For the rare people amongst us writing their own text editors, you 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will need to implement {@link android.view.View#onCreateInputConnection} 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return a new instance of your own {@link InputConnection} interface 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allowing the IME to interact with your editor.</p> 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="InputMethods"></a> 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Input Methods</h3> 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An input method (IME) is implemented 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a {@link android.app.Service}, typically deriving from 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.inputmethodservice.InputMethodService}. It must provide 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the core {@link InputMethod} interface, though this is normally handled by 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.inputmethodservice.InputMethodService} and implementors will 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only need to deal with the higher-level API there.</p> 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the {@link android.inputmethodservice.InputMethodService} class for 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more information on implementing IMEs. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Security"></a> 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Security</h3> 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are a lot of security issues associated with input methods, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * since they essentially have freedom to completely drive the UI and monitor 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * everything the user enters. The Android input method framework also allows 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * arbitrary third party IMEs, so care must be taken to restrict their 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection and interactions.</p> 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Here are some key points about the security architecture behind the 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IMF:</p> 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>Only the system is allowed to directly access an IME's 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethod} interface, via the 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.Manifest.permission#BIND_INPUT_METHOD} permission. This is 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enforced in the system by not binding to an input method service that does 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not require this permission, so the system can guarantee no other untrusted 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clients are accessing the current input method outside of its control.</p> 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>There may be many client processes of the IMF, but only one may 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be active at a time. The inactive clients can not interact with key 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parts of the IMF through the mechanisms described below.</p> 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>Clients of an input method are only given access to its 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InputMethodSession} interface. One instance of this interface is 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created for each client, and only calls from the session associated with 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the active client will be processed by the current IME. This is enforced 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by {@link android.inputmethodservice.AbstractInputMethodService} for normal 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IMEs, but must be explicitly handled by an IME that is customizing the 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * raw {@link InputMethodSession} implementation.</p> 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>Only the active client's {@link InputConnection} will accept 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * operations. The IMF tells each client process whether it is active, and 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the framework enforces that in inactive processes calls on to the current 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * InputConnection will be ignored. This ensures that the current IME can 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only deliver events and text edits to the UI that the user sees as 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being in focus.</p> 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>An IME can never interact with an {@link InputConnection} while 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the screen is off. This is enforced by making all clients inactive while 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the screen is off, and prevents bad IMEs from driving the UI when the user 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can not be aware of its behavior.</p> 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>A client application can ask that the system let the user pick a 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new IME, but can not programmatically switch to one itself. This avoids 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * malicious applications from switching the user to their own IME, which 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remains running when the user navigates away to another application. An 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IME, on the other hand, <em>is</em> allowed to programmatically switch 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system to another IME, since it already has full control of user 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input.</p> 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p>The user must explicitly enable a new IME in settings before 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * they can switch to it, to confirm with the system that they know about it 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and want to make it available for use.</p> 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class InputMethodManager { 1944eba271a64b98a5fc38227f40190b879f807acf5Dianne Hackborn static final boolean DEBUG = false; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "InputMethodManager"; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final Object mInstanceSync = new Object(); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static InputMethodManager mInstance; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IInputMethodManager mService; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Looper mMainLooper; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For scheduling work on the main thread. This also serves as our 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // global lock. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final H mH; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Our generic input connection if the current target does not have its own. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IInputContext mIInputContext; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if this input method client is active, initially false. 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mActive = false; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set whenever this client becomes inactive, to know we need to reset 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state with the IME then next time we receive focus. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mHasBeenInactive = true; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As reported by IME through InputConnection. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mFullscreenMode; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ----------------------------------------------------------- 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the root view of the overall window that currently has input 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method focus. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mCurRootView; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the view that should currently be served by an input method, 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * regardless of the state of setting that up. 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mServedView; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is then next view that will be served by the input method, when 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we get around to updating things. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mNextServedView; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we should restart input in the next served view, even if the 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view hasn't actually changed from the current serve view. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mNextServedNeedsStart; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is set when we are in the process of connecting, to determine 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when we have actually finished. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mServedConnecting; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is non-null when we have connected the served view; it holds 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the attributes that were last retrieved from the served view and given 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the input connection. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditorInfo mCurrentTextBoxAttribute; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The InputConnection that was last retrieved from the served view. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputConnection mServedInputConnection; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The completions that were last provided by the served view. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CompletionInfo[] mCompletions; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cursor position on the screen. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect mTmpCursorRect = new Rect(); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect mCursorRect = new Rect(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorSelStart; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorSelEnd; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorCandStart; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCursorCandEnd; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ----------------------------------------------------------- 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sequence number of this binding, as returned by the server. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mBindSequence = -1; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ID of the method we are bound to. 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mCurId; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The actual instance of the method to make calls on it. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodSession mCurMethod; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ----------------------------------------------------------- 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int MSG_DUMP = 1; 2944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project static final int MSG_BIND = 2; 2954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project static final int MSG_UNBIND = 3; 2964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project static final int MSG_SET_ACTIVE = 4; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class H extends Handler { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project H(Looper looper) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(looper); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MSG_DUMP: { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doDump((FileDescriptor)args.arg1, 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (PrintWriter)args.arg2, (String[])args.arg3); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((PrintWriter)args.arg2).println("Exception: " + e); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (args.arg4) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((CountDownLatch)args.arg4).countDown(); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case MSG_BIND: { 3204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final InputBindResult res = (InputBindResult)msg.obj; 3214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 3224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mBindSequence < 0 || mBindSequence != res.sequence) { 3234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Log.w(TAG, "Ignoring onBind: cur seq=" + mBindSequence 3244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project + ", given seq=" + res.sequence); 3254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 3264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 3284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod = res.method; 3294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurId = res.id; 3304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mBindSequence = res.sequence; 3314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project startInputInner(); 3334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 3344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case MSG_UNBIND: { 3364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final int sequence = msg.arg1; 3374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 3384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mBindSequence == sequence) { 3394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (false) { 3404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // XXX the server has already unbound! 3414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mCurMethod != null && mCurrentTextBoxAttribute != null) { 3424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 3434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod.finishInput(); 3444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 3454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 3464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project clearBindingLocked(); 3504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 3514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // If we were actively using the last input method, then 3524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // we would like to re-connect to the next input method. 3534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mServedView != null && mServedView.isFocused()) { 3544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mServedConnecting = true; 3554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project startInputInner(); 3584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 3604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project case MSG_SET_ACTIVE: { 3624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final boolean active = msg.arg1 != 0; 3634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 3644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mActive = active; 3654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mFullscreenMode = false; 3664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (!active) { 3674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // Some other client has starting using the IME, so note 3684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // that this happened and make sure our own editor's 3694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // state is reset. 3704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mHasBeenInactive = true; 3714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 3724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // Note that finishComposingText() is allowed to run 3734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project // even when we are not active. 3744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mIInputContext.finishComposingText(); 3754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 3764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 3804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class ControlledInputConnectionWrapper extends IInputConnectionWrapper { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ControlledInputConnectionWrapper(Looper mainLooper, InputConnection conn) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(mainLooper, conn); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3908cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunne @Override 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isActive() { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActive; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IInputMethodClient.Stub mClient = new IInputMethodClient.Stub() { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No need to check for dump permission, since we only give this 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // interface to the system. 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CountDownLatch latch = new CountDownLatch(1); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HandlerCaller.SomeArgs sargs = new HandlerCaller.SomeArgs(); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg1 = fd; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg2 = fout; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg3 = args; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sargs.arg4 = latch; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_DUMP, sargs)); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!latch.await(5, TimeUnit.SECONDS)) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fout.println("Timeout waiting for dump"); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fout.println("Interrupted waiting for dump"); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setUsingInputMethod(boolean state) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onBindMethod(InputBindResult res) { 4214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_BIND, res)); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onUnbindMethod(int sequence) { 4254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_UNBIND, sequence, 0)); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setActive(boolean active) { 4294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mH.sendMessage(mH.obtainMessage(MSG_SET_ACTIVE, active ? 1 : 0, 0)); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43351bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn final InputConnection mDummyInputConnection = new BaseInputConnection(this, false); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager(IInputMethodManager service, Looper looper) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainLooper = looper; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH = new H(looper); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIInputContext = new ControlledInputConnectionWrapper(looper, 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDummyInputConnection); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInstance == null) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInstance = this; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the global InputMethodManager instance, creating it if it 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doesn't already exist. 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public InputMethodManager getInstance(Context context) { 4534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getInstance(context.getMainLooper()); 4544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn /** 4574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * Internally, the input method manager can't be context-dependent, so 4584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * we have this here for the places that need it. 4594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * @hide 4604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn */ 4614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn static public InputMethodManager getInstance(Looper mainLooper) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mInstanceSync) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInstance != null) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInstance; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodManager service = IInputMethodManager.Stub.asInterface(b); 4684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mInstance = new InputMethodManager(service, mainLooper); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInstance; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Private optimization: retrieve the global InputMethodManager instance, 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it exists. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public InputMethodManager peekInstance() { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInstance; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInputMethodClient getClient() { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClient; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInputContext getInputContext() { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIInputContext; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<InputMethodInfo> getInputMethodList() { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getInputMethodList(); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<InputMethodInfo> getEnabledInputMethodList() { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getEnabledInputMethodList(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 508d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 509d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Returns a list of enabled input method subtypes for the specified input method info. 510d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param imi An input method info whose subtypes list will be returned. 511d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param allowsImplicitlySelectedSubtypes A boolean flag to allow to return the implicitly 512d4fce2b7f1a861590ce84afcf2f569189251bc59satok * selected subtypes. If an input method info doesn't have enabled subtypes, the framework 513d4fce2b7f1a861590ce84afcf2f569189251bc59satok * will implicitly enable subtypes according to the current system language. 514d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 51516331c8a1d33defccc5cbb18694def79196c921bsatok public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi, 51616331c8a1d33defccc5cbb18694def79196c921bsatok boolean allowsImplicitlySelectedSubtypes) { 51767ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok try { 51816331c8a1d33defccc5cbb18694def79196c921bsatok return mService.getEnabledInputMethodSubtypeList(imi, allowsImplicitlySelectedSubtypes); 51967ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok } catch (RemoteException e) { 52067ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok throw new RuntimeException(e); 52167ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok } 52267ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok } 52367ddf9cbd5d7133c7f443cd3c55841ed1109c3a0satok 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showStatusIcon(IBinder imeToken, String packageName, int iconId) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.updateStatusIcon(imeToken, packageName, iconId); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void hideStatusIcon(IBinder imeToken) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.updateStatusIcon(imeToken, null, 0); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 541857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato public void setImeWindowStatus(IBinder imeToken, int vis, int backDisposition) { 54206487a58be22b100daf3f950b9a1d25c3ea42aa2satok try { 543857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mService.setImeWindowStatus(imeToken, vis, backDisposition); 54406487a58be22b100daf3f950b9a1d25c3ea42aa2satok } catch (RemoteException e) { 54506487a58be22b100daf3f950b9a1d25c3ea42aa2satok throw new RuntimeException(e); 54606487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 54706487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 54806487a58be22b100daf3f950b9a1d25c3ea42aa2satok 54906487a58be22b100daf3f950b9a1d25c3ea42aa2satok /** @hide */ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFullscreenMode(boolean fullScreen) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullscreenMode = fullScreen; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows you to discover whether the attached input method is running 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in fullscreen mode. Return true if it is fullscreen, entirely covering 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your UI, else returns false. 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isFullscreenMode() { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFullscreenMode; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the given view is the currently active view for the 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input method. 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isActive(View view) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 570b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return (mServedView == view 571b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || (mServedView != null 572b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project && mServedView.checkInputConnectionProxy(view))) 573b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project && mCurrentTextBoxAttribute != null; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if any view is currently active in the input method. 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isActive() { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServedView != null && mCurrentTextBoxAttribute != null; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the currently served view is accepting full text edits. 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If false, it has no input connection, so can only handle raw key events. 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isAcceptingText() { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServedInputConnection != null; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reset all of the state associated with being bound to an input method. 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearBindingLocked() { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearConnectionLocked(); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBindSequence = -1; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurId = null; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod = null; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reset all of the state associated with a served view being connected 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to an input method 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearConnectionLocked() { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute = null; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedInputConnection = null; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disconnect any existing input connection, clearing the served view. 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void finishInputLocked() { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedView = null; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView != null) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "FINISH INPUT: " + mServedView); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentTextBoxAttribute != null) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.finishInput(mClient); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedInputConnection != null) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We need to tell the previously served view that it is no 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // longer the input target, so it can reset its state. Schedule 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this call on its window's Handler so it will be on the correct 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // thread and outside of our lock. 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler vh = mServedView.getHandler(); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vh != null) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This will result in a call to reportFinishInputConnection() 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // below. 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vh.sendMessage(vh.obtainMessage(ViewRoot.FINISH_INPUT_CONNECTION, 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedInputConnection)); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedView = null; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCompletions = null; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = false; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearConnectionLocked(); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called from the FINISH_INPUT_CONNECTION message above. 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reportFinishInputConnection(InputConnection ic) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedInputConnection != ic) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ic.finishComposingText(); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void displayCompletions(View view, CompletionInfo[] completions) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 664b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 665b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCompletions = completions; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod != null) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.displayCompletions(mCompletions); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateExtractedText(View view, int token, ExtractedText text) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 682b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 683b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod != null) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.updateExtractedText(token, text); 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #showSoftInput} to indicate that this is an implicit 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * request to show the input window, not as the result of a direct request 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the user. The window may not be shown in this case. 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SHOW_IMPLICIT = 0x0001; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #showSoftInput} to indicate that the user has forced 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input method open (such as by long-pressing menu) so it should 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be closed until they explicitly do so. 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SHOW_FORCED = 0x0002; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Synonym for {@link #showSoftInput(View, int, ResultReceiver)} without 7124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * a result receiver: explicitly request that the current input method's 7134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * soft input area be shown to the user, if needed. 7144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 7154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param view The currently focused view, which would like to receive 7164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * soft keyboard input. 7174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 7184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT} bit set. 7194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 7204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public boolean showSoftInput(View view, int flags) { 7214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return showSoftInput(view, flags, null); 7224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 7234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 7244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 7254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 7264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 7274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 7284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window was unchanged and remains shown. 7294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 7304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_UNCHANGED_SHOWN = 0; 7314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 7324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 7334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 7344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 7354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 7364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window was unchanged and remains hidden. 7374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 7384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_UNCHANGED_HIDDEN = 1; 7394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 7404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 7414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 7424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 7434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 7444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window changed from hidden to shown. 7454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 7464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_SHOWN = 2; 7474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 7484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 7494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Flag for the {@link ResultReceiver} result code from 7504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #showSoftInput(View, int, ResultReceiver)} and 7514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}: the 7524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * state of the soft input window changed from shown to hidden. 7534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 7544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public static final int RESULT_HIDDEN = 3; 7554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 7564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Explicitly request that the current input method's soft input area be 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown to the user, if needed. Call this if the user interacts with 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your view in such a way that they have expressed they would like to 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * start performing input into it. 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The currently focused view, which would like to receive 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * soft keyboard input. 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT} bit set. 7664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param resultReceiver If non-null, this will be called by the IME when 7674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * it has processed your request to tell you what it has done. The result 7684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * code you receive may be either {@link #RESULT_UNCHANGED_SHOWN}, 7694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_UNCHANGED_HIDDEN}, {@link #RESULT_SHOWN}, or 7704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_HIDDEN}. 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 772ad8484b3799ba7046e57388e34ba9a4c0a971b42Gilles Debunne public boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 775b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 776b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 7774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return mService.showSoftInput(mClient, flags, resultReceiver); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 7854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 7904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void showSoftInputUnchecked(int flags, ResultReceiver resultReceiver) { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mService.showSoftInput(mClient, flags, resultReceiver); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #hideSoftInputFromWindow} to indicate that the soft 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input window should only be hidden if it was not explicitly shown 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the user. 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HIDE_IMPLICIT_ONLY = 0x0001; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag for {@link #hideSoftInputFromWindow} to indicate that the soft 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input window should normally be hidden, unless it was originally 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown with {@link #SHOW_FORCED}. 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HIDE_NOT_ALWAYS = 0x0002; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8127c8c6d689280ecfbd151a2e0cb40341768470676Gilles Debunne * Synonym for {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)} 8134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * without a result: request to hide the soft input window from the 8144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * context of the window that is currently accepting input. 8154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 8164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param windowToken The token of the window that is making the request, 8174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * as returned by {@link View#getWindowToken() View.getWindowToken()}. 8184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 8194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set. 8204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 8214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) { 8224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return hideSoftInputFromWindow(windowToken, flags, null); 8234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 8244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request to hide the soft input window from the context of the window 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is currently accepting input. This should be called as a result 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the user doing some actually than fairly explicitly requests to 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * have the input window hidden. 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param windowToken The token of the window that is making the request, 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as returned by {@link View#getWindowToken() View.getWindowToken()}. 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set. 8354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param resultReceiver If non-null, this will be called by the IME when 8364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * it has processed your request to tell you what it has done. The result 8374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * code you receive may be either {@link #RESULT_UNCHANGED_SHOWN}, 8384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_UNCHANGED_HIDDEN}, {@link #RESULT_SHOWN}, or 8394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #RESULT_HIDDEN}. 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public boolean hideSoftInputFromWindow(IBinder windowToken, int flags, 8424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project ResultReceiver resultReceiver) { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView == null || mServedView.getWindowToken() != windowToken) { 8464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return mService.hideSoftInput(mClient, flags, resultReceiver); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return false; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 8594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * This method toggles the input method window display. 8604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If the input window is already displayed, it gets hidden. 8614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If not the input window will be displayed. 8624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param windowToken The token of the window that is making the request, 8634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * as returned by {@link View#getWindowToken() View.getWindowToken()}. 8644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param showFlags Provides additional operating flags. May be 8654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT}, 8664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #SHOW_FORCED} bit set. 8674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param hideFlags Provides additional operating flags. May be 8684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, 8694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #HIDE_NOT_ALWAYS} bit set. 8704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project **/ 8714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void toggleSoftInputFromWindow(IBinder windowToken, int showFlags, int hideFlags) { 8724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project synchronized (mH) { 8734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mServedView == null || mServedView.getWindowToken() != windowToken) { 8744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return; 8754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 8764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mCurMethod != null) { 8774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 8784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod.toggleSoftInput(showFlags, hideFlags); 8794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 8804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 8814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 8824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 8834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 8844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 8854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /* 8864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * This method toggles the input method window display. 8874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If the input window is already displayed, it gets hidden. 8884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * If not the input window will be displayed. 8894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param showFlags Provides additional operating flags. May be 8904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT}, 8914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #SHOW_FORCED} bit set. 8924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param hideFlags Provides additional operating flags. May be 8934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, 8944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #HIDE_NOT_ALWAYS} bit set. 8954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @hide 8964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 8974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void toggleSoftInput(int showFlags, int hideFlags) { 8984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (mCurMethod != null) { 8994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 9004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mCurMethod.toggleSoftInput(showFlags, hideFlags); 9014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 9024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 9054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the input method is currently connected to the given view, 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * restart it with its new contents. You should call this when the text 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within your view changes outside of the normal input method or key 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input flow, such as when an application calls TextView.setText(). 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The view whose text has changed. 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void restartInput(View view) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 917b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view && (mServedView == null 918b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = true; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startInputInner(); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startInputInner() { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mServedView; 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure we have a window token for the served view. 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: view=" + view); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view == null) { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "ABORT input: no served view!"); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now we need to get an input connection from the served view. 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is complicated in a couple ways: we can't be holding our lock 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when calling out to the view, and we need to make sure we call into 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the view on the same thread that is driving its view hierarchy. 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler vh = view.getHandler(); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vh == null) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the view doesn't have a handler, something has changed out 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // from under us, so just bail. 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "ABORT input: no handler for view!"); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vh.getLooper() != Looper.myLooper()) { 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The view is running on a different thread than our own, so 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to reschedule our work for over there. 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: reschedule to view thread"); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vh.post(new Runnable() { 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startInputInner(); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 961c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Okay we are now ready to call into the served view and have it 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do its stuff. 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Life is good: let's hook everything up! 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditorInfo tba = new EditorInfo(); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tba.packageName = view.getContext().getPackageName(); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tba.fieldId = view.getId(); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputConnection ic = view.onCreateInputConnection(tba); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: tba=" + tba + " ic=" + ic); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now that we are locked again, validate that our state hasn't 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changed. 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView != view || !mServedConnecting) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Something else happened, so abort. 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Starting input: finished by someone else (view=" 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mServedView + " conn=" + mServedConnecting + ")"); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we already have a text box, then this view is already 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // connected so we want to restart it. 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean initial = mCurrentTextBoxAttribute == null; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Hook 'em up and let 'er rip. 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute = tba; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = false; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedInputConnection = ic; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputContext servedContext; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ic != null) { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelStart = tba.initialSelStart; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelEnd = tba.initialSelEnd; 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandStart = -1; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandEnd = -1; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorRect.setEmpty(); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project servedContext = new ControlledInputConnectionWrapper(vh.getLooper(), ic); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project servedContext = null; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "START INPUT: " + view + " ic=" 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ic + " tba=" + tba + " initial=" + initial); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputBindResult res = mService.startInput(mClient, 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project servedContext, tba, initial, mCurMethod == null); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Starting input: Bind result=" + res); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res.id != null) { 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBindSequence = res.sequence; 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod = res.method; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This means there is no input method available. 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "ABORT input: no input method!"); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod != null && mCompletions != null) { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.displayCompletions(mCompletions); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When the focused window is dismissed, this method is called to finish the 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input method started before. 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void windowDismissed(IBinder appWindowToken) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView != null && 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedView.getWindowToken() == appWindowToken) { 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finishInputLocked(); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call this when a view receives focus. 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void focusIn(View view) { 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusInLocked(view); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void focusInLocked(View view) { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "focusIn: " + view); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurRootView != view.getRootView()) { 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a request from a window that isn't in the window with 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IME focus, so ignore it. 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Not IME target window, ignoring"); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedView = view; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduleCheckFocusLocked(view); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call this when a view loses focus. 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void focusOut(View view) { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "focusOut: " + view 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mServedView=" + mServedView 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " winFocus=" + view.hasWindowFocus()); 1080b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (mServedView != view) { 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The following code would auto-hide the IME if we end up 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with no more views with focus. This can happen, however, 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // whenever we go into touch mode, so it ends up hiding 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at times when we don't really want it to. For now it 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // seems better to just turn it all off. 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false && view.hasWindowFocus()) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedView = null; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduleCheckFocusLocked(view); 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void scheduleCheckFocusLocked(View view) { 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler vh = view.getHandler(); 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vh != null && !vh.hasMessages(ViewRoot.CHECK_FOCUS)) { 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This will result in a call to checkFocus() below. 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vh.sendMessage(vh.obtainMessage(ViewRoot.CHECK_FOCUS)); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void checkFocus() { 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is called a lot, so short-circuit before locking. 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView == mNextServedView && !mNextServedNeedsStart) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputConnection ic = null; 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mServedView == mNextServedView && !mNextServedNeedsStart) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "checkFocus: view=" + mServedView 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " next=" + mNextServedView 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " restart=" + mNextServedNeedsStart); 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedNeedsStart = false; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextServedView == null) { 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finishInputLocked(); 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, we used to have a focused view on the window, 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but no longer do. We should make sure the input method is 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no longer shown, since it serves no purpose. 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeCurrentInput(); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ic = mServedInputConnection; 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedView = mNextServedView; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute = null; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCompletions = null; 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServedConnecting = true; 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ic != null) { 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ic.finishComposingText(); 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startInputInner(); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void closeCurrentInput() { 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mService.hideSoftInput(mClient, HIDE_NOT_ALWAYS, null); 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by ViewRoot when its window gets input focus. 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onWindowFocus(View rootView, View focusedView, int softInputMode, 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first, int windowFlags) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "onWindowFocus: " + focusedView 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " softInputMode=" + softInputMode 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " first=" + first + " flags=#" 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(windowFlags)); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHasBeenInactive) { 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Has been inactive! Starting fresh"); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBeenInactive = false; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextServedNeedsStart = true; 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusInLocked(focusedView != null ? focusedView : rootView); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean isTextEditor = focusedView != null && 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusedView.onCheckIsTextEditor(); 1177b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mService.windowGainedFocus(mClient, rootView.getWindowToken(), 1178b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project focusedView != null, isTextEditor, softInputMode, first, 1179b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project windowFlags); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startGettingWindowFocus(View rootView) { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurRootView = rootView; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report the current selection range. 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateSelection(View view, int selStart, int selEnd, 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int candidatesStart, int candidatesEnd) { 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 1199b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if ((mServedView != view && (mServedView == null 1200b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) 1201b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || mCurrentTextBoxAttribute == null || mCurMethod == null) { 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCursorSelStart != selStart || mCursorSelEnd != selEnd 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mCursorCandStart != candidatesStart 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mCursorCandEnd != candidatesEnd) { 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "updateSelection"); 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "SELECTION CHANGE: " + mCurMethod); 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.updateSelection(mCursorSelStart, mCursorSelEnd, 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selStart, selEnd, candidatesStart, candidatesEnd); 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelStart = selStart; 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorSelEnd = selEnd; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandStart = candidatesStart; 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorCandEnd = candidatesEnd; 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 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 * Returns true if the current input method wants to watch the location 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the input editor's cursor in its window. 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWatchingCursor(View view) { 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report the current cursor location in its window. 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateCursor(View view, int left, int top, int right, int bottom) { 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 1239b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if ((mServedView != view && (mServedView == null 1240b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) 1241b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || mCurrentTextBoxAttribute == null || mCurMethod == null) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTmpCursorRect.set(left, top, right, bottom); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCursorRect.equals(mTmpCursorRect)) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "updateCursor"); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "CURSOR CHANGE: " + mCurMethod); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.updateCursor(mTmpCursorRect); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorRect.set(mTmpCursorRect); 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call {@link InputMethodSession#appPrivateCommand(String, Bundle) 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * InputMethodSession.appPrivateCommand()} on the current Input Method. 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view Optional View that is sending the command, or null if 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you want to send the command regardless of the view that is attached 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the input method. 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param action Name of the command to be performed. This <em>must</em> 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a scoped name, i.e. prefixed with a package name you own, so that 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * different developers will not create conflicting commands. 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data Any data to include with the command. 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendAppPrivateCommand(View view, String action, Bundle data) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkFocus(); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 1274b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if ((mServedView != view && (mServedView == null 1275b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project || !mServedView.checkInputConnectionProxy(view))) 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mCurrentTextBoxAttribute == null || mCurMethod == null) { 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "APP PRIVATE COMMAND " + action + ": " + data); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.appPrivateCommand(action, data); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12872820351489537698ad153c6397edf3270455edc5satok 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12892820351489537698ad153c6397edf3270455edc5satok * Force switch to a new input method component. This can only be called 12902820351489537698ad153c6397edf3270455edc5satok * from an application or a service which has a token of the currently active input method. 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token Supplies the identifying token given to an input method 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started, which allows it to perform this operation on 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * itself. 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The unique identifier for the new input method to be switched to. 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInputMethod(IBinder token, String id) { 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.setInputMethod(token, id); 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13032820351489537698ad153c6397edf3270455edc5satok 13042820351489537698ad153c6397edf3270455edc5satok /** 13052820351489537698ad153c6397edf3270455edc5satok * Force switch to a new input method and subtype. This can only be called 13062820351489537698ad153c6397edf3270455edc5satok * from an application or a service which has a token of the currently active input method. 13072820351489537698ad153c6397edf3270455edc5satok * @param token Supplies the identifying token given to an input method 13082820351489537698ad153c6397edf3270455edc5satok * when it was started, which allows it to perform this operation on 13092820351489537698ad153c6397edf3270455edc5satok * itself. 13102820351489537698ad153c6397edf3270455edc5satok * @param id The unique identifier for the new input method to be switched to. 13112820351489537698ad153c6397edf3270455edc5satok * @param subtype The new subtype of the new input method to be switched to. 13122820351489537698ad153c6397edf3270455edc5satok */ 13132820351489537698ad153c6397edf3270455edc5satok public void setInputMethodAndSubtype(IBinder token, String id, InputMethodSubtype subtype) { 13142820351489537698ad153c6397edf3270455edc5satok try { 13152820351489537698ad153c6397edf3270455edc5satok mService.setInputMethodAndSubtype(token, id, subtype); 13162820351489537698ad153c6397edf3270455edc5satok } catch (RemoteException e) { 13172820351489537698ad153c6397edf3270455edc5satok throw new RuntimeException(e); 13182820351489537698ad153c6397edf3270455edc5satok } 13192820351489537698ad153c6397edf3270455edc5satok } 13202820351489537698ad153c6397edf3270455edc5satok 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Close/hide the input method's soft input area, so the user no longer 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sees it or can interact with it. This can only be called 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the currently active input method, as validated by the given token. 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token Supplies the identifying token given to an input method 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started, which allows it to perform this operation on 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * itself. 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 13304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, 13314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #HIDE_NOT_ALWAYS} bit set. 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void hideSoftInputFromInputMethod(IBinder token, int flags) { 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.hideMySoftInput(token, flags); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Show the input method's soft input area, so the user 13434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * sees the input method window and can interact with it. 13444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * This can only be called from the currently active input method, 13454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * as validated by the given token. 13464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 13474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param token Supplies the identifying token given to an input method 13484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * when it was started, which allows it to perform this operation on 13494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * itself. 13504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param flags Provides additional operating flags. Currently may be 13514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 0 or have the {@link #SHOW_IMPLICIT} or 13524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * {@link #SHOW_FORCED} bit set. 13534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 13544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project public void showSoftInputFromInputMethod(IBinder token, int flags) { 13554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project try { 13564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project mService.showMySoftInput(token, flags); 13574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } catch (RemoteException e) { 13584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project throw new RuntimeException(e); 13594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 13604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 13614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 13624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchKeyEvent(Context context, int seq, KeyEvent key, 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodCallback callback) { 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "dispatchKeyEvent"); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod == null) { 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.finishedEvent(seq, false); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (key.getAction() == KeyEvent.ACTION_DOWN 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && key.getKeyCode() == KeyEvent.KEYCODE_SYM) { 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showInputMethodPicker(); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.finishedEvent(seq, true); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.dispatchKeyEvent(seq, key, callback); 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId + " dropping: " + key, e); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.finishedEvent(seq, false); 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchTrackballEvent(Context context, int seq, MotionEvent motion, 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodCallback callback) { 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.d(TAG, "dispatchTrackballEvent"); 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurMethod == null || mCurrentTextBoxAttribute == null) { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.finishedEvent(seq, false); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "DISPATCH TRACKBALL: " + mCurMethod); 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurMethod.dispatchTrackballEvent(seq, motion, callback); 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId + " dropping trackball: " + motion, e); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.finishedEvent(seq, false); 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1428ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showInputMethodPicker() { 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mH) { 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.showInputMethodPickerFromClient(mClient); 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "IME died: " + mCurId, e); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 1439d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1440d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Show the settings for enabling subtypes of the specified input method. 1441d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param imiId An input method, whose subtypes settings will be shown. If imiId is null, 1442d4fce2b7f1a861590ce84afcf2f569189251bc59satok * subtypes of all input methods will be shown. 1443d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1444d4fce2b7f1a861590ce84afcf2f569189251bc59satok public void showInputMethodAndSubtypeEnabler(String imiId) { 144547a44916e2fb33cf4751906386d5f5c903b28d8bsatok synchronized (mH) { 144647a44916e2fb33cf4751906386d5f5c903b28d8bsatok try { 1447d4fce2b7f1a861590ce84afcf2f569189251bc59satok mService.showInputMethodAndSubtypeEnablerFromClient(mClient, imiId); 144847a44916e2fb33cf4751906386d5f5c903b28d8bsatok } catch (RemoteException e) { 144947a44916e2fb33cf4751906386d5f5c903b28d8bsatok Log.w(TAG, "IME died: " + mCurId, e); 145047a44916e2fb33cf4751906386d5f5c903b28d8bsatok } 145147a44916e2fb33cf4751906386d5f5c903b28d8bsatok } 145247a44916e2fb33cf4751906386d5f5c903b28d8bsatok } 145347a44916e2fb33cf4751906386d5f5c903b28d8bsatok 1454d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1455d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Returns the current input method subtype. This subtype is one of the subtypes in 1456d4fce2b7f1a861590ce84afcf2f569189251bc59satok * the current input method. This method returns null when the current input method doesn't 1457d4fce2b7f1a861590ce84afcf2f569189251bc59satok * have any input method subtype. 1458d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 145904d50204705c9da52b218f11972da4e7d7a9cb84satok public InputMethodSubtype getCurrentInputMethodSubtype() { 146004d50204705c9da52b218f11972da4e7d7a9cb84satok synchronized (mH) { 146104d50204705c9da52b218f11972da4e7d7a9cb84satok try { 146204d50204705c9da52b218f11972da4e7d7a9cb84satok return mService.getCurrentInputMethodSubtype(); 146304d50204705c9da52b218f11972da4e7d7a9cb84satok } catch (RemoteException e) { 146404d50204705c9da52b218f11972da4e7d7a9cb84satok Log.w(TAG, "IME died: " + mCurId, e); 146504d50204705c9da52b218f11972da4e7d7a9cb84satok return null; 146604d50204705c9da52b218f11972da4e7d7a9cb84satok } 146704d50204705c9da52b218f11972da4e7d7a9cb84satok } 146804d50204705c9da52b218f11972da4e7d7a9cb84satok } 146904d50204705c9da52b218f11972da4e7d7a9cb84satok 1470d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1471d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Switch to a new input method subtype of the current input method. 1472d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param subtype A new input method subtype to switch. 1473d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @return true if the current subtype was successfully switched. When the specified subtype is 1474d4fce2b7f1a861590ce84afcf2f569189251bc59satok * null, this method returns false. 1475d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1476b66d287e3003a0934d5714fbf15e554b3c814906satok public boolean setCurrentInputMethodSubtype(InputMethodSubtype subtype) { 1477b66d287e3003a0934d5714fbf15e554b3c814906satok synchronized (mH) { 1478b66d287e3003a0934d5714fbf15e554b3c814906satok try { 1479b66d287e3003a0934d5714fbf15e554b3c814906satok return mService.setCurrentInputMethodSubtype(subtype); 1480b66d287e3003a0934d5714fbf15e554b3c814906satok } catch (RemoteException e) { 1481b66d287e3003a0934d5714fbf15e554b3c814906satok Log.w(TAG, "IME died: " + mCurId, e); 1482b66d287e3003a0934d5714fbf15e554b3c814906satok return false; 1483b66d287e3003a0934d5714fbf15e554b3c814906satok } 1484b66d287e3003a0934d5714fbf15e554b3c814906satok } 1485b66d287e3003a0934d5714fbf15e554b3c814906satok } 1486b66d287e3003a0934d5714fbf15e554b3c814906satok 1487d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1488d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Returns a map of all shortcut input method info and their subtypes. 1489d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1490f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes() { 14914e4569dab5c75804b01a19b2d6e6101b445c1c68satok synchronized (mH) { 1492f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok HashMap<InputMethodInfo, List<InputMethodSubtype>> ret = 1493f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok new HashMap<InputMethodInfo, List<InputMethodSubtype>>(); 14944e4569dab5c75804b01a19b2d6e6101b445c1c68satok try { 14954e4569dab5c75804b01a19b2d6e6101b445c1c68satok // TODO: We should change the return type from List<Object> to List<Parcelable> 14964e4569dab5c75804b01a19b2d6e6101b445c1c68satok List<Object> info = mService.getShortcutInputMethodsAndSubtypes(); 1497f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok // "info" has imi1, subtype1, subtype2, imi2, subtype2, imi3, subtype3..in the list 1498f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok ArrayList<InputMethodSubtype> subtypes = null; 1499f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok final int N = info.size(); 1500f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok if (info != null && N > 0) { 1501f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok for (int i = 0; i < N; ++i) { 1502f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok Object o = info.get(i); 1503f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok if (o instanceof InputMethodInfo) { 1504f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok if (ret.containsKey(o)) { 1505f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok Log.e(TAG, "IMI list already contains the same InputMethod."); 1506f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok break; 15074e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 1508f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok subtypes = new ArrayList<InputMethodSubtype>(); 1509f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok ret.put((InputMethodInfo)o, subtypes); 1510f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok } else if (subtypes != null && o instanceof InputMethodSubtype) { 1511f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok subtypes.add((InputMethodSubtype)o); 15124e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 15134e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 15144e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 15154e4569dab5c75804b01a19b2d6e6101b445c1c68satok } catch (RemoteException e) { 15164e4569dab5c75804b01a19b2d6e6101b445c1c68satok Log.w(TAG, "IME died: " + mCurId, e); 15174e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 15184e4569dab5c75804b01a19b2d6e6101b445c1c68satok return ret; 15194e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 15204e4569dab5c75804b01a19b2d6e6101b445c1c68satok } 1521f3db1af8d55ab247b6db67baf4fe772c18f33cabsatok 1522d4fce2b7f1a861590ce84afcf2f569189251bc59satok /** 1523d4fce2b7f1a861590ce84afcf2f569189251bc59satok * Force switch to the last used input method and subtype. If the last input method didn't have 1524d4fce2b7f1a861590ce84afcf2f569189251bc59satok * any subtypes, the framework will simply switch to the last input method with no subtype 1525d4fce2b7f1a861590ce84afcf2f569189251bc59satok * specified. 1526d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @param imeToken Supplies the identifying token given to an input method when it was started, 1527d4fce2b7f1a861590ce84afcf2f569189251bc59satok * which allows it to perform this operation on itself. 1528d4fce2b7f1a861590ce84afcf2f569189251bc59satok * @return true if the current input method and subtype was successfully switched to the last 1529d4fce2b7f1a861590ce84afcf2f569189251bc59satok * used input method and subtype. 1530d4fce2b7f1a861590ce84afcf2f569189251bc59satok */ 1531735cf38b8c7f8f91ad087511e44fe79018fa61d6satok public boolean switchToLastInputMethod(IBinder imeToken) { 1532735cf38b8c7f8f91ad087511e44fe79018fa61d6satok synchronized (mH) { 1533735cf38b8c7f8f91ad087511e44fe79018fa61d6satok try { 1534735cf38b8c7f8f91ad087511e44fe79018fa61d6satok return mService.switchToLastInputMethod(imeToken); 1535735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } catch (RemoteException e) { 1536735cf38b8c7f8f91ad087511e44fe79018fa61d6satok Log.w(TAG, "IME died: " + mCurId, e); 1537735cf38b8c7f8f91ad087511e44fe79018fa61d6satok return false; 1538735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } 1539735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } 1540735cf38b8c7f8f91ad087511e44fe79018fa61d6satok } 1541735cf38b8c7f8f91ad087511e44fe79018fa61d6satok 154268f1b78b7b9139a0e34285ff641a664e664a14b8satok public InputMethodSubtype getLastInputMethodSubtype() { 154368f1b78b7b9139a0e34285ff641a664e664a14b8satok synchronized (mH) { 154468f1b78b7b9139a0e34285ff641a664e664a14b8satok try { 154568f1b78b7b9139a0e34285ff641a664e664a14b8satok return mService.getLastInputMethodSubtype(); 154668f1b78b7b9139a0e34285ff641a664e664a14b8satok } catch (RemoteException e) { 154768f1b78b7b9139a0e34285ff641a664e664a14b8satok Log.w(TAG, "IME died: " + mCurId, e); 154868f1b78b7b9139a0e34285ff641a664e664a14b8satok return null; 154968f1b78b7b9139a0e34285ff641a664e664a14b8satok } 155068f1b78b7b9139a0e34285ff641a664e664a14b8satok } 155168f1b78b7b9139a0e34285ff641a664e664a14b8satok } 155268f1b78b7b9139a0e34285ff641a664e664a14b8satok 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doDump(FileDescriptor fd, PrintWriter fout, String[] args) { 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Printer p = new PrintWriterPrinter(fout); 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println("Input method client state for " + this + ":"); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mService=" + mService); 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mMainLooper=" + mMainLooper); 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mIInputContext=" + mIInputContext); 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mActive=" + mActive 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mHasBeenInactive=" + mHasBeenInactive 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mBindSequence=" + mBindSequence 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCurId=" + mCurId); 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurMethod=" + mCurMethod); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurRootView=" + mCurRootView); 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mServedView=" + mServedView); 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mNextServedNeedsStart=" + mNextServedNeedsStart 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mNextServedView=" + mNextServedView); 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mServedConnecting=" + mServedConnecting); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentTextBoxAttribute != null) { 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurrentTextBoxAttribute:"); 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTextBoxAttribute.dump(p, " "); 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCurrentTextBoxAttribute: null"); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mServedInputConnection=" + mServedInputConnection); 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCompletions=" + mCompletions); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCursorRect=" + mCursorRect); 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.println(" mCursorSelStart=" + mCursorSelStart 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCursorSelEnd=" + mCursorSelEnd 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCursorCandStart=" + mCursorCandStart 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mCursorCandEnd=" + mCursorCandEnd); 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1585