Allow power button to close an input method

BUG: 33038203
Change-Id: I5c44dc49db6b960b4e3e42545bfbbab62f357f08
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 46a0194..c8e3b7d 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -483,6 +483,16 @@
          */
         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 b2f6cd2..6ae7a58 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 @@
     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 @@
                 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 5dad9c4..0a713a3 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 @@
         }
     }
 
+    // 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() {