diff --git a/java/src/com/android/inputmethod/latin/InputAttributes.java b/java/src/com/android/inputmethod/latin/InputAttributes.java
index 01c17f2..8aaacd2 100644
--- a/java/src/com/android/inputmethod/latin/InputAttributes.java
+++ b/java/src/com/android/inputmethod/latin/InputAttributes.java
@@ -20,9 +20,13 @@
 import android.util.Log;
 import android.view.inputmethod.EditorInfo;
 
+import com.android.inputmethod.latin.utils.CollectionUtils;
 import com.android.inputmethod.latin.utils.InputTypeUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
 /**
  * Class to hold attributes of the input field.
  */
@@ -62,49 +66,43 @@
             mInputTypeNoAutoCorrect = false;
             mApplicationSpecifiedCompletionOn = false;
             mShouldInsertSpacesAutomatically = false;
-        } else {
-            final int variation = inputType & InputType.TYPE_MASK_VARIATION;
-            final boolean flagNoSuggestions =
-                    0 != (inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
-            final boolean flagMultiLine =
-                    0 != (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE);
-            final boolean flagAutoCorrect =
-                    0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
-            final boolean flagAutoComplete =
-                    0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
-
-            mIsPasswordField = InputTypeUtils.isPasswordInputType(inputType)
-                    || InputTypeUtils.isVisiblePasswordInputType(inputType);
-            // TODO: Have a helper method in InputTypeUtils
-            // Make sure that passwords are not displayed in {@link SuggestionStripView}.
-            if (mIsPasswordField
-                    || InputTypeUtils.isEmailVariation(variation)
-                    || InputType.TYPE_TEXT_VARIATION_URI == variation
-                    || InputType.TYPE_TEXT_VARIATION_FILTER == variation
-                    || flagNoSuggestions
-                    || flagAutoComplete) {
-                mIsSettingsSuggestionStripOn = false;
-            } else {
-                mIsSettingsSuggestionStripOn = true;
-            }
-
-            mShouldInsertSpacesAutomatically = InputTypeUtils.isAutoSpaceFriendlyType(inputType);
-
-            // If it's a browser edit field and auto correct is not ON explicitly, then
-            // disable auto correction, but keep suggestions on.
-            // If NO_SUGGESTIONS is set, don't do prediction.
-            // If it's not multiline and the autoCorrect flag is not set, then don't correct
-            if ((variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT
-                    && !flagAutoCorrect)
-                    || flagNoSuggestions
-                    || (!flagAutoCorrect && !flagMultiLine)) {
-                mInputTypeNoAutoCorrect = true;
-            } else {
-                mInputTypeNoAutoCorrect = false;
-            }
-
-            mApplicationSpecifiedCompletionOn = flagAutoComplete && isFullscreenMode;
+            return;
         }
+        // inputClass == InputType.TYPE_CLASS_TEXT
+        final int variation = inputType & InputType.TYPE_MASK_VARIATION;
+        final boolean flagNoSuggestions =
+                0 != (inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
+        final boolean flagMultiLine =
+                0 != (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE);
+        final boolean flagAutoCorrect =
+                0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
+        final boolean flagAutoComplete =
+                0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
+
+        mIsPasswordField = InputTypeUtils.isPasswordInputType(inputType)
+                || InputTypeUtils.isVisiblePasswordInputType(inputType);
+        // TODO: Have a helper method in InputTypeUtils
+        // Make sure that passwords are not displayed in {@link SuggestionStripView}.
+        final boolean noSuggestionStrip = mIsPasswordField
+                || InputTypeUtils.isEmailVariation(variation)
+                || InputType.TYPE_TEXT_VARIATION_URI == variation
+                || InputType.TYPE_TEXT_VARIATION_FILTER == variation
+                || flagNoSuggestions
+                || flagAutoComplete;
+        mIsSettingsSuggestionStripOn = !noSuggestionStrip;
+
+        mShouldInsertSpacesAutomatically = InputTypeUtils.isAutoSpaceFriendlyType(inputType);
+
+        // If it's a browser edit field and auto correct is not ON explicitly, then
+        // disable auto correction, but keep suggestions on.
+        // If NO_SUGGESTIONS is set, don't do prediction.
+        // If it's not multiline and the autoCorrect flag is not set, then don't correct
+        mInputTypeNoAutoCorrect =
+                (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT && !flagAutoCorrect)
+                || flagNoSuggestions
+                || (!flagAutoCorrect && !flagMultiLine);
+
+        mApplicationSpecifiedCompletionOn = flagAutoComplete && isFullscreenMode;
     }
 
     public boolean isTypeNull() {
@@ -117,84 +115,124 @@
 
     @SuppressWarnings("unused")
     private void dumpFlags(final int inputType) {
-        Log.i(TAG, "Input class:");
         final int inputClass = inputType & InputType.TYPE_MASK_CLASS;
-        if (inputClass == InputType.TYPE_CLASS_TEXT)
-            Log.i(TAG, "  TYPE_CLASS_TEXT");
-        if (inputClass == InputType.TYPE_CLASS_PHONE)
-            Log.i(TAG, "  TYPE_CLASS_PHONE");
-        if (inputClass == InputType.TYPE_CLASS_NUMBER)
-            Log.i(TAG, "  TYPE_CLASS_NUMBER");
-        if (inputClass == InputType.TYPE_CLASS_DATETIME)
-            Log.i(TAG, "  TYPE_CLASS_DATETIME");
-        Log.i(TAG, "Variation:");
-        switch (InputType.TYPE_MASK_VARIATION & inputType) {
-            case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_EMAIL_ADDRESS");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_EMAIL_SUBJECT");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_FILTER:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_FILTER");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_LONG_MESSAGE");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_NORMAL:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_NORMAL");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_PASSWORD:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_PASSWORD");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_PERSON_NAME:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_PERSON_NAME");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_PHONETIC:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_PHONETIC");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_POSTAL_ADDRESS");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_SHORT_MESSAGE");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_URI:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_URI");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_VISIBLE_PASSWORD");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_WEB_EDIT_TEXT");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS");
-                break;
-            case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
-                Log.i(TAG, "  TYPE_TEXT_VARIATION_WEB_PASSWORD");
-                break;
-            default:
-                Log.i(TAG, "  Unknown variation");
-                break;
+        final String inputClassString = toInputClassString(inputClass);
+        final String variationString = toVariationString(
+                inputClass, inputType & InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
+        final String flagsString = toFlagsString(inputType & InputType.TYPE_MASK_FLAGS);
+        Log.i(TAG, "Input class: " + inputClassString);
+        Log.i(TAG, "Variation: " + variationString);
+        Log.i(TAG, "Flags: " + flagsString);
+    }
+
+    private static String toInputClassString(final int inputClass) {
+        switch (inputClass) {
+        case InputType.TYPE_CLASS_TEXT:
+            return "TYPE_CLASS_TEXT";
+        case InputType.TYPE_CLASS_PHONE:
+            return "TYPE_CLASS_PHONE";
+        case InputType.TYPE_CLASS_NUMBER:
+            return "TYPE_CLASS_NUMBER";
+        case InputType.TYPE_CLASS_DATETIME:
+            return "TYPE_CLASS_DATETIME";
+        default:
+            return String.format("unknownInputClass<0x%08x>", inputClass);
         }
-        Log.i(TAG, "Flags:");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_NO_SUGGESTIONS");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_MULTI_LINE");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_IME_MULTI_LINE");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_CAP_WORDS))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_CAP_WORDS");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_CAP_SENTENCES))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_CAP_SENTENCES");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_CAP_CHARACTERS");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_AUTO_CORRECT");
-        if (0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE))
-            Log.i(TAG, "  TYPE_TEXT_FLAG_AUTO_COMPLETE");
+    }
+
+    private static String toVariationString(final int inputClass, final int variation) {
+        switch (inputClass) {
+        case InputType.TYPE_CLASS_TEXT:
+            return toTextVariationString(variation);
+        case InputType.TYPE_CLASS_NUMBER:
+            return toNumberVariationString(variation);
+        case InputType.TYPE_CLASS_DATETIME:
+            return toDatetimeVariationString(variation);
+        default:
+            return "";
+        }
+    }
+
+    private static String toTextVariationString(final int variation) {
+        switch (variation) {
+        case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+            return " TYPE_TEXT_VARIATION_EMAIL_ADDRESS";
+        case InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT:
+            return "TYPE_TEXT_VARIATION_EMAIL_SUBJECT";
+        case InputType.TYPE_TEXT_VARIATION_FILTER:
+            return "TYPE_TEXT_VARIATION_FILTER";
+        case InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE:
+            return "TYPE_TEXT_VARIATION_LONG_MESSAGE";
+        case InputType.TYPE_TEXT_VARIATION_NORMAL:
+            return "TYPE_TEXT_VARIATION_NORMAL";
+        case InputType.TYPE_TEXT_VARIATION_PASSWORD:
+            return "TYPE_TEXT_VARIATION_PASSWORD";
+        case InputType.TYPE_TEXT_VARIATION_PERSON_NAME:
+            return "TYPE_TEXT_VARIATION_PERSON_NAME";
+        case InputType.TYPE_TEXT_VARIATION_PHONETIC:
+            return "TYPE_TEXT_VARIATION_PHONETIC";
+        case InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS:
+            return "TYPE_TEXT_VARIATION_POSTAL_ADDRESS";
+        case InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE:
+            return "TYPE_TEXT_VARIATION_SHORT_MESSAGE";
+        case InputType.TYPE_TEXT_VARIATION_URI:
+            return "TYPE_TEXT_VARIATION_URI";
+        case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+            return "TYPE_TEXT_VARIATION_VISIBLE_PASSWORD";
+        case InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT:
+            return "TYPE_TEXT_VARIATION_WEB_EDIT_TEXT";
+        case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+            return "TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS";
+        case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+            return "TYPE_TEXT_VARIATION_WEB_PASSWORD";
+        default:
+            return String.format("unknownVariation<0x%08x>", variation);
+        }
+    }
+
+    private static String toNumberVariationString(final int variation) {
+        switch (variation) {
+        case InputType.TYPE_NUMBER_VARIATION_NORMAL:
+            return "TYPE_NUMBER_VARIATION_NORMAL";
+        case InputType.TYPE_NUMBER_VARIATION_PASSWORD:
+            return "TYPE_NUMBER_VARIATION_PASSWORD";
+        default:
+            return String.format("unknownVariation<0x%08x>", variation);
+        }
+    }
+
+    private static String toDatetimeVariationString(final int variation) {
+        switch (variation) {
+        case InputType.TYPE_DATETIME_VARIATION_NORMAL:
+            return "TYPE_DATETIME_VARIATION_NORMAL";
+        case InputType.TYPE_DATETIME_VARIATION_DATE:
+            return "TYPE_DATETIME_VARIATION_DATE";
+        case InputType.TYPE_DATETIME_VARIATION_TIME:
+            return "TYPE_DATETIME_VARIATION_TIME";
+        default:
+            return String.format("unknownVariation<0x%08x>", variation);
+        }
+    }
+
+    private static String toFlagsString(final int flags) {
+        final ArrayList<String> flagsArray = CollectionUtils.newArrayList();
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS))
+            flagsArray.add("TYPE_TEXT_FLAG_NO_SUGGESTIONS");
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_MULTI_LINE))
+            flagsArray.add("TYPE_TEXT_FLAG_MULTI_LINE");
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE))
+            flagsArray.add("TYPE_TEXT_FLAG_IME_MULTI_LINE");
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_CAP_WORDS))
+            flagsArray.add("TYPE_TEXT_FLAG_CAP_WORDS");
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_CAP_SENTENCES))
+            flagsArray.add("TYPE_TEXT_FLAG_CAP_SENTENCES");
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS))
+            flagsArray.add("TYPE_TEXT_FLAG_CAP_CHARACTERS");
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT))
+            flagsArray.add("TYPE_TEXT_FLAG_AUTO_CORRECT");
+        if (0 != (flags & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE))
+            flagsArray.add("TYPE_TEXT_FLAG_AUTO_COMPLETE");
+        return flagsArray.isEmpty() ? "" : Arrays.toString(flagsArray.toArray());
     }
 
     // Pretty print
