Merge "Make IMS#clearInsetOfPreviousIme() reliable." into nyc-dev
am: cef3337cb5
* commit 'cef3337cb5e27d4f571fb350be055c26d339833d':
Make IMS#clearInsetOfPreviousIme() reliable.
Change-Id: I76b607cd8086f421fc0d552a348a70fc06aa3d9c
This commit is contained in:
@@ -1714,18 +1714,9 @@ public class InputMethodService extends AbstractInputMethodService {
|
||||
private void clearInsetOfPreviousIme() {
|
||||
if (DEBUG) Log.v(TAG, "clearInsetOfPreviousIme() "
|
||||
+ " mShouldClearInsetOfPreviousIme=" + mShouldClearInsetOfPreviousIme);
|
||||
if (!mShouldClearInsetOfPreviousIme || mWindow == null) return;
|
||||
try {
|
||||
// We do not call onWindowShown() and onWindowHidden() so as not to make the IME author
|
||||
// confused.
|
||||
// TODO: Find out a better way which has less side-effect.
|
||||
mWindow.show();
|
||||
mWindow.hide();
|
||||
} catch (WindowManager.BadTokenException e) {
|
||||
if (DEBUG) Log.v(TAG, "clearInsetOfPreviousIme: BadTokenException: IME is done.");
|
||||
mWindowVisible = false;
|
||||
mWindowAdded = false;
|
||||
}
|
||||
if (!mShouldClearInsetOfPreviousIme) return;
|
||||
|
||||
mImm.clearLastInputMethodWindowForTransition(mToken);
|
||||
mShouldClearInsetOfPreviousIme = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -260,6 +260,13 @@ public abstract class WindowManagerInternal {
|
||||
*/
|
||||
public abstract void saveLastInputMethodWindowForTransition();
|
||||
|
||||
/**
|
||||
* Clears last input method window for transition.
|
||||
*
|
||||
* Note that it is assumed that this method is called only by InputMethodManagerService.
|
||||
*/
|
||||
public abstract void clearLastInputMethodWindowForTransition();
|
||||
|
||||
/**
|
||||
* Returns true when the hardware keyboard is available.
|
||||
*/
|
||||
|
||||
@@ -2139,6 +2139,28 @@ public final class InputMethodManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells the system that the IME decided to not show a window and the system no longer needs to
|
||||
* use the previous IME's inset.
|
||||
*
|
||||
* <p>Caveat: {@link android.inputmethodservice.InputMethodService#clearInsetOfPreviousIme()}
|
||||
* is the only expected caller of this method. Do not depend on this anywhere else.</p>
|
||||
*
|
||||
* <p>TODO: We probably need to reconsider how IME should be handled.</p>
|
||||
* @hide
|
||||
* @param token Supplies the identifying token given to an input method when it was started,
|
||||
* which allows it to perform this operation on itself.
|
||||
*/
|
||||
public void clearLastInputMethodWindowForTransition(final IBinder token) {
|
||||
synchronized (mH) {
|
||||
try {
|
||||
mService.clearLastInputMethodWindowForTransition(token);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Force switch to the last used input method and subtype. If the last input method didn't have
|
||||
* any subtypes, the framework will simply switch to the last input method with no subtype
|
||||
|
||||
@@ -79,5 +79,7 @@ interface IInputMethodManager {
|
||||
boolean setInputMethodEnabled(String id, boolean enabled);
|
||||
void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes);
|
||||
int getInputMethodWindowVisibleHeight();
|
||||
void clearLastInputMethodWindowForTransition(in IBinder token);
|
||||
|
||||
oneway void notifyUserAction(int sequenceNumber);
|
||||
}
|
||||
|
||||
@@ -2642,6 +2642,27 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
return mWindowManagerInternal.getInputMethodWindowVisibleHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearLastInputMethodWindowForTransition(IBinder token) {
|
||||
if (!calledFromValidUser()) {
|
||||
return;
|
||||
}
|
||||
final long ident = Binder.clearCallingIdentity();
|
||||
try {
|
||||
synchronized (mMethodMap) {
|
||||
if (!calledWithValidToken(token)) {
|
||||
final int uid = Binder.getCallingUid();
|
||||
Slog.e(TAG, "Ignoring clearLastInputMethodWindowForTransition due to an "
|
||||
+ "invalid token. uid:" + uid + " token:" + token);
|
||||
return;
|
||||
}
|
||||
}
|
||||
mWindowManagerInternal.clearLastInputMethodWindowForTransition();
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(ident);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyUserAction(int sequenceNumber) {
|
||||
if (DEBUG) {
|
||||
|
||||
@@ -11293,6 +11293,13 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearLastInputMethodWindowForTransition() {
|
||||
synchronized (mWindowMap) {
|
||||
mPolicy.setLastInputMethodWindowLw(null, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHardKeyboardAvailable() {
|
||||
synchronized (mWindowMap) {
|
||||
|
||||
@@ -218,6 +218,11 @@ public class BridgeIInputMethodManager implements IInputMethodManager {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearLastInputMethodWindowForTransition(IBinder arg0) throws RemoteException {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputBindResult startInputOrWindowGainedFocus(
|
||||
/* @InputMethodClient.StartInputReason */ int startInputReason,
|
||||
|
||||
Reference in New Issue
Block a user