diff --git a/core/java/android/view/ImeFocusController.java b/core/java/android/view/ImeFocusController.java index 67e88a5a1831f..74fac2b404723 100644 --- a/core/java/android/view/ImeFocusController.java +++ b/core/java/android/view/ImeFocusController.java @@ -196,6 +196,26 @@ public final class ImeFocusController { mHasImeFocus = false; } + /** + * Called by {@link ViewRootImpl} to feedback the state of the screen for this view. + * @param newScreenState The new state of the screen. Can be either + * {@link View#SCREEN_STATE_ON} or {@link View#SCREEN_STATE_OFF} + */ + @UiThread + void onScreenStateChanged(int newScreenState) { + if (!getImmDelegate().isCurrentRootView(mViewRootImpl)) { + return; + } + // Close input connection and IME when the screen is turn off for security concern. + if (newScreenState == View.SCREEN_STATE_OFF && mServedView != null) { + if (DEBUG) { + Log.d(TAG, "onScreenStateChanged, disconnect input when screen turned off"); + } + mNextServedView = null; + mViewRootImpl.dispatchCheckFocus(); + } + } + /** * @param windowAttribute {@link WindowManager.LayoutParams} to be checked. * @return Whether the window is in local focus mode or not. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 918b5a35d4db3..9733448b890b0 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1445,6 +1445,7 @@ public final class ViewRootImpl implements ViewParent, final int newScreenState = toViewScreenState(newDisplayState); if (oldScreenState != newScreenState) { mView.dispatchScreenStateChanged(newScreenState); + mImeFocusController.onScreenStateChanged(newScreenState); } if (oldDisplayState == Display.STATE_OFF) { // Draw was suppressed so we need to for it to happen here. diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java index f24699a6ae647..68e6c1885ec2c 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java @@ -43,12 +43,6 @@ public abstract class InputMethodManagerInternal { void onInputMethodListUpdated(List info, @UserIdInt int userId); } - /** - * Called by the power manager to tell the input method manager whether it - * should start watching for wake events. - */ - public abstract void setInteractive(boolean interactive); - /** * Hides the current input method, if visible. */ @@ -102,10 +96,6 @@ public abstract class InputMethodManagerInternal { */ private static final InputMethodManagerInternal NOP = new InputMethodManagerInternal() { - @Override - public void setInteractive(boolean interactive) { - } - @Override public void hideCurrentInputMethod(@SoftInputShowHideReason int reason) { } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index dcd0a78c01240..eab339374d560 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4113,9 +4113,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub + ((ClientState)msg.obj).uid); } return true; - case MSG_SET_INTERACTIVE: - handleSetInteractive(msg.arg1 != 0); - return true; case MSG_REPORT_FULLSCREEN_MODE: { final boolean fullscreen = msg.arg1 != 0; final ClientState clientState = (ClientState)msg.obj; @@ -4190,20 +4187,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub return false; } - private void handleSetInteractive(final boolean interactive) { - synchronized (mMethodMap) { - mIsInteractive = interactive; - updateSystemUiLocked(interactive ? mImeWindowVis : 0, mBackDisposition); - - // Inform the current client of the change in active status - if (mCurClient != null && mCurClient.client != null) { - executeOrSendMessage(mCurClient.client, mCaller.obtainMessageIIO( - MSG_SET_ACTIVE, mIsInteractive ? 1 : 0, mInFullscreenMode ? 1 : 0, - mCurClient)); - } - } - } - private boolean chooseNewDefaultIMELocked() { final InputMethodInfo imi = InputMethodUtils.getMostApplicableDefaultIME( mSettings.getEnabledInputMethodListLocked()); @@ -4799,13 +4782,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mService = service; } - @Override - public void setInteractive(boolean interactive) { - // Do everything in handler so as not to block the caller. - mService.mHandler.obtainMessage(MSG_SET_INTERACTIVE, interactive ? 1 : 0, 0) - .sendToTarget(); - } - @Override public void hideCurrentInputMethod(@SoftInputShowHideReason int reason) { mService.mHandler.removeMessages(MSG_HIDE_CURRENT_INPUT_METHOD); diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java index e60b9101fda5a..0e6c0dbbca2df 100644 --- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java @@ -169,11 +169,6 @@ public final class MultiClientInputMethodManagerService { LocalServices.addService(InputMethodManagerInternal.class, new InputMethodManagerInternal() { - @Override - public void setInteractive(boolean interactive) { - reportNotSupported(); - } - @Override public void hideCurrentInputMethod(@SoftInputShowHideReason int reason) { reportNotSupported(); diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index 0b95be15f1575..199cb4981fe67 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -413,7 +413,6 @@ public class Notifier { // Start input as soon as we start waking up or going to sleep. mInputManagerInternal.setInteractive(interactive); - mInputMethodManagerInternal.setInteractive(interactive); // Notify battery stats. try {