From d28e907183fe48afc1ea0cb4f939b738cbcc2506 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Tue, 29 Nov 2016 14:41:50 -0500 Subject: [PATCH] Allow power button to close an input method BUG: 33038203 Change-Id: I5c44dc49db6b960b4e3e42545bfbbab62f357f08 --- .../java/android/view/WindowManagerPolicy.java | 10 ++++++++++ .../server/policy/PhoneWindowManager.java | 9 +++++++++ .../server/wm/WindowManagerService.java | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 46a0194b1b09e..c8e3b7dfbae9b 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -483,6 +483,16 @@ public interface WindowManagerPolicy { */ public void switchInputMethod(boolean forwardDirection); + /** + * Returns the visibility of the current input method window (false if there is none). + */ + public boolean isInputMethodWindowVisible(); + + /** + * Hides the current input method, if visible. + */ + public void hideCurrentInputMethod(); + public void shutdown(boolean confirm); public void reboot(boolean confirm); public void rebootSafeMode(boolean confirm); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index b2f6cd2fd9000..6ae7a589ab9e4 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -189,6 +189,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP = 2; static final int SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME = 3; static final int SHORT_PRESS_POWER_GO_HOME = 4; + static final int SHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME = 5; static final int LONG_PRESS_POWER_NOTHING = 0; static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1; @@ -1302,6 +1303,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { case SHORT_PRESS_POWER_GO_HOME: launchHomeFromHotKey(true /* awakenFromDreams */, false /*respectKeyguard*/); break; + case SHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME: + if (mWindowManagerFuncs.isInputMethodWindowVisible()) { + mWindowManagerFuncs.hideCurrentInputMethod(); + } else { + launchHomeFromHotKey(true /* awakenFromDreams */, + false /*respectKeyguard*/); + } + break; } } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5dad9c4e3ce88..0a713a322c0e8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5806,6 +5806,24 @@ public class WindowManagerService extends IWindowManager.Stub } } + // Called by window manager policy. Not exposed externally. + @Override + public boolean isInputMethodWindowVisible() { + synchronized (mWindowMap) { + return mInputMethodWindow != null && mInputMethodWindow.isVisibleLw(); + } + } + + // Called by window manager policy. Not exposed externally. + @Override + public void hideCurrentInputMethod() { + final InputMethodManagerInternal inputMethodManagerInternal = + LocalServices.getService(InputMethodManagerInternal.class); + if (inputMethodManagerInternal != null) { + inputMethodManagerInternal.hideCurrentInputMethod(); + } + } + // Called by window manager policy. Not exposed externally. @Override public void lockDeviceNow() {