Disable soft keyboard when keyboard attached.

Also hide menu shortcuts everywhere until we can get around to
redesigning the menu UI to be more consistent.

Bug: 3306545
Bug: 3330748
Change-Id: I4d4e19525cdfc93d9aae0dcaa1e6266fb552c5bc
diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java
index d0faea6..830c2c1 100644
--- a/core/java/com/android/internal/view/menu/MenuBuilder.java
+++ b/core/java/com/android/internal/view/menu/MenuBuilder.java
@@ -353,8 +353,7 @@
         mNonActionItems = new ArrayList<MenuItemImpl>();
         mIsActionItemsStale = true;
         
-        mShortcutsVisible =
-                (mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS);
+        setShortcutsVisibleInner(true);
     }
     
     public MenuBuilder setDefaultShowAsAction(int defaultShowAsAction) {
@@ -782,14 +781,18 @@
      */
     public void setShortcutsVisible(boolean shortcutsVisible) {
         if (mShortcutsVisible == shortcutsVisible) return;
-        
-        mShortcutsVisible =
-            (mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS)
-            && shortcutsVisible;
-        
+
+        setShortcutsVisibleInner(shortcutsVisible);
         refreshShortcuts(mShortcutsVisible, isQwertyMode());
     }
 
+    private void setShortcutsVisibleInner(boolean shortcutsVisible) {
+        mShortcutsVisible = shortcutsVisible
+                && mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS
+                && mResources.getBoolean(
+                        com.android.internal.R.bool.config_showMenuShortcutsWhenKeyboardPresent);
+    }
+
     /**
      * @return Whether shortcuts should be visible on menus.
      */
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 590baf1..8bb05fb 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -529,4 +529,8 @@
     <!-- When a database query is executed, the results retuned are paginated
          in pages of size (in KB) indicated by this value -->
     <integer name="config_cursorWindowSize">2048</integer>
+
+    <!-- Sets whether menu shortcuts should be displayed on panel menus when
+         a keyboard is present. -->
+    <bool name="config_showMenuShortcutsWhenKeyboardPresent">false</bool>
 </resources>
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 1fc2e6c..d6b7366 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -1624,24 +1624,7 @@
                 // First handle chording of panel key: if a panel key is held
                 // but not released, try to execute a shortcut in it.
                 if ((mPanelChordingKey > 0) && (mPanelChordingKey != keyCode)) {
-                    // Perform the shortcut (mPreparedPanel can be null since
-                    // global shortcuts (such as search) don't rely on a
-                    // prepared panel or menu).
-                    boolean handled = performPanelShortcut(mPreparedPanel, keyCode, event,
-                            Menu.FLAG_PERFORM_NO_CLOSE);
-
-                    if (!handled) {
-                        /*
-                         * If not handled, then pass it to the view hierarchy
-                         * and anyone else that may be interested.
-                         */
-                        handled = dispatchKeyShortcutEvent(event);
-
-                        if (handled && mPreparedPanel != null) {
-                            mPreparedPanel.isHandled = true;
-                        }
-                    }
-
+                    boolean handled = dispatchKeyShortcutEvent(event);
                     if (handled) {
                         return true;
                     }
@@ -1676,6 +1659,19 @@
 
         @Override
         public boolean dispatchKeyShortcutEvent(KeyEvent ev) {
+            // Perform the shortcut (mPreparedPanel can be null since
+            // global shortcuts (such as search) don't rely on a
+            // prepared panel or menu).
+            boolean handled = performPanelShortcut(mPreparedPanel, ev.getKeyCode(), ev,
+                    Menu.FLAG_PERFORM_NO_CLOSE);
+            if (handled) {
+                if (mPreparedPanel != null) {
+                    mPreparedPanel.isHandled = true;
+                }
+                return true;
+            }
+
+            // Shortcut not handled by the panel.  Dispatch to the view hierarchy.
             final Callback cb = getCallback();
             return cb != null && mFeatureId < 0 ? cb.dispatchKeyShortcutEvent(ev) : super
                     .dispatchKeyShortcutEvent(ev);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index a6037aa..f2c2b93 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -239,9 +239,14 @@
     volatile boolean mPowerKeyHandled;
     RecentApplicationsDialog mRecentAppsDialog;
     Handler mHandler;
-    
+
+    private static final int LID_ABSENT = -1;
+    private static final int LID_CLOSED = 0;
+    private static final int LID_OPEN = 1;
+
+    int mLidOpen = LID_ABSENT;
+
     boolean mSystemReady;
-    boolean mLidOpen;
     boolean mHdmiPlugged;
     int mUiMode = Configuration.UI_MODE_TYPE_NORMAL;
     int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED;
@@ -896,21 +901,31 @@
     void readLidState() {
         try {
             int sw = mWindowManager.getSwitchState(SW_LID);
-            if (sw >= 0) {
-                mLidOpen = sw == 0;
+            if (sw > 0) {
+                mLidOpen = LID_OPEN;
+            } else if (sw == 0) {
+                mLidOpen = LID_CLOSED;
+            } else {
+                mLidOpen = LID_ABSENT;
             }
         } catch (RemoteException e) {
             // Ignore
         }
     }
     
-    private int determineHiddenState(boolean lidOpen,
-            int mode, int hiddenValue, int visibleValue) {
+    private int determineHiddenState(int mode, int hiddenValue, int visibleValue) {
+        if (KEYBOARD_ALWAYS_HIDDEN) {
+            return hiddenValue;
+        }
+        if (mLidOpen == LID_ABSENT) {
+            return visibleValue;
+        }
+
         switch (mode) {
             case 1:
-                return lidOpen ? visibleValue : hiddenValue;
+                return mLidOpen == LID_OPEN ? visibleValue : hiddenValue;
             case 2:
-                return lidOpen ? hiddenValue : visibleValue;
+                return mLidOpen == LID_OPEN ? hiddenValue : visibleValue;
         }
         return visibleValue;
     }
@@ -918,12 +933,11 @@
     /** {@inheritDoc} */
     public void adjustConfigurationLw(Configuration config) {
         readLidState();
-        final boolean lidOpen = !KEYBOARD_ALWAYS_HIDDEN && mLidOpen;
-        mPowerManager.setKeyboardVisibility(lidOpen);
-        config.hardKeyboardHidden = determineHiddenState(lidOpen,
+        mPowerManager.setKeyboardVisibility(mLidOpen == LID_OPEN);
+        config.hardKeyboardHidden = determineHiddenState(
                 mLidKeyboardAccessibility, Configuration.HARDKEYBOARDHIDDEN_YES,
                 Configuration.HARDKEYBOARDHIDDEN_NO);
-        config.navigationHidden = determineHiddenState(lidOpen,
+        config.navigationHidden = determineHiddenState(
                 mLidNavigationAccessibility, Configuration.NAVIGATIONHIDDEN_YES,
                 Configuration.NAVIGATIONHIDDEN_NO);
         config.keyboardHidden = (config.hardKeyboardHidden
@@ -1973,8 +1987,8 @@
     /** {@inheritDoc} */
     public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) {
         // lid changed state
-        mLidOpen = lidOpen;
-        boolean awakeNow = mKeyguardMediator.doLidChangeTq(mLidOpen);
+        mLidOpen = lidOpen ? LID_OPEN : LID_CLOSED;
+        boolean awakeNow = mKeyguardMediator.doLidChangeTq(lidOpen);
         updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
         if (awakeNow) {
             // If the lid is opening and we don't have to keep the
@@ -1982,7 +1996,7 @@
             // immediately.
             mKeyguardMediator.pokeWakelock();
         } else if (keyguardIsShowingTq()) {
-            if (mLidOpen) {
+            if (lidOpen) {
                 // If we are opening the lid and not hiding the
                 // keyguard, then we need to have it turn on the
                 // screen once it is shown.
@@ -1991,7 +2005,7 @@
             }
         } else {
             // Light up the keyboard if we are sliding up.
-            if (mLidOpen) {
+            if (lidOpen) {
                 mPowerManager.userActivity(SystemClock.uptimeMillis(), false,
                         LocalPowerManager.BUTTON_EVENT);
             } else {
@@ -2473,7 +2487,7 @@
             //or case.unspecified
             if (mHdmiPlugged) {
                 return Surface.ROTATION_0;
-            } else if (mLidOpen) {
+            } else if (mLidOpen == LID_OPEN) {
                 return mLidOpenRotation;
             } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) {
                 return mCarDockRotation;
@@ -2639,11 +2653,11 @@
     }
 
     void updateRotation(int animFlags) {
-        mPowerManager.setKeyboardVisibility(mLidOpen);
+        mPowerManager.setKeyboardVisibility(mLidOpen == LID_OPEN);
         int rotation = Surface.ROTATION_0;
         if (mHdmiPlugged) {
             rotation = Surface.ROTATION_0;
-        } else if (mLidOpen) {
+        } else if (mLidOpen == LID_OPEN) {
             rotation = mLidOpenRotation;
         } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) {
             rotation = mCarDockRotation;