am 8fdff5a1: (DO NOT MERGE) Show InputView even when hardware keyboard is connected

* commit '8fdff5a11129827e88ce9f5bc462e18f613c19a3':
  (DO NOT MERGE) Show InputView even when hardware keyboard is connected
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index f351267..140e768 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.preference.PreferenceManager;
 import android.util.Log;
@@ -233,11 +234,21 @@
     }
 
     private void setMainKeyboardFrame() {
-        mMainKeyboardFrame.setVisibility(View.VISIBLE);
+        mMainKeyboardFrame.setVisibility(hasHardwareKeyboard() ? View.GONE : View.VISIBLE);
         mEmojiPalettesView.setVisibility(View.GONE);
         mEmojiPalettesView.stopEmojiPalettes();
     }
 
+    // TODO: Move this boolean to a member of {@link SettingsValues} and reset it
+    // at {@link LatinIME#onConfigurationChanged(Configuration)}.
+    public boolean hasHardwareKeyboard() {
+        // Copied from {@link InputMethodServce#onEvaluateInputViewShown()}.
+        final Configuration config = mLatinIME.getResources().getConfiguration();
+        final boolean noHardwareKeyboard = config.keyboard == Configuration.KEYBOARD_NOKEYS
+                || config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES;
+        return !noHardwareKeyboard;
+    }
+
     // Implements {@link KeyboardState.SwitchActions}.
     @Override
     public void setEmojiKeyboard() {
@@ -249,6 +260,14 @@
         mEmojiPalettesView.setVisibility(View.VISIBLE);
     }
 
+    public void onToggleEmojiKeyboard() {
+        if (isShowingEmojiPalettes()) {
+            setAlphabetKeyboard();
+        } else {
+            setEmojiKeyboard();
+        }
+    }
+
     // Implements {@link KeyboardState.SwitchActions}.
     @Override
     public void setSymbolsShiftedKeyboard() {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 2e3cd6b..96244b5 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -145,6 +145,8 @@
     // If it turns out we need several, it will get grown seamlessly.
     final SparseArray<HardwareEventDecoder> mHardwareEventDecoders = new SparseArray<>(1);
 
+    // TODO: Move these {@link View}s to {@link KeyboardSwitcher}.
+    private View mInputView;
     private View mExtractArea;
     private View mKeyPreviewBackingView;
     private SuggestionStripView mSuggestionStripView;
@@ -709,6 +711,7 @@
     @Override
     public void setInputView(final View view) {
         super.setInputView(view);
+        mInputView = view;
         mExtractArea = getWindow().getWindow().getDecorView()
                 .findViewById(android.R.id.extractArea);
         mKeyPreviewBackingView = view.findViewById(R.id.key_preview_backing);
@@ -1079,6 +1082,14 @@
         if (visibleKeyboardView == null || !hasSuggestionStripView()) {
             return;
         }
+        final boolean hasHardwareKeyboard = mKeyboardSwitcher.hasHardwareKeyboard();
+        if (hasHardwareKeyboard && visibleKeyboardView.getVisibility() == View.GONE) {
+            // If there is a hardware keyboard and a visible software keyboard view has been hidden,
+            // no visual element will be shown on the screen.
+            outInsets.touchableInsets = mInputView.getHeight();
+            outInsets.visibleTopInsets = mInputView.getHeight();
+            return;
+        }
         final int adjustedBackingHeight = getAdjustedBackingViewHeight();
         final boolean backingGone = (mKeyPreviewBackingView.getVisibility() == View.GONE);
         final int backingHeight = backingGone ? 0 : adjustedBackingHeight;
@@ -1111,7 +1122,17 @@
     }
 
     @Override
+    public boolean onEvaluateInputViewShown() {
+        // Always show {@link InputView}.
+        return true;
+    }
+
+    @Override
     public boolean onEvaluateFullscreenMode() {
+        if (mKeyboardSwitcher.hasHardwareKeyboard()) {
+            // If there is a hardware keyboard, disable full screen mode.
+            return false;
+        }
         // Reread resource value here, because this method is called by the framework as needed.
         final boolean isFullscreenModeAllowed = Settings.readUseFullscreenMode(getResources());
         if (super.onEvaluateFullscreenMode() && isFullscreenModeAllowed) {