1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 package com.android.inputmethod.keyboard; 18 19 import android.view.inputmethod.EditorInfo; 20 21 import com.android.inputmethod.compat.EditorInfoCompatUtils; 22 import com.android.inputmethod.compat.InputTypeCompatUtils; 23 import com.android.inputmethod.latin.R; 24 25 import java.util.Arrays; 26 import java.util.Locale; 27 28 /** 29 * Represents the parameters necessary to construct a new LatinKeyboard, 30 * which also serve as a unique identifier for each keyboard type. 31 */ 32 public class KeyboardId { 33 public static final int MODE_TEXT = 0; 34 public static final int MODE_URL = 1; 35 public static final int MODE_EMAIL = 2; 36 public static final int MODE_IM = 3; 37 public static final int MODE_PHONE = 4; 38 public static final int MODE_NUMBER = 5; 39 40 public static final int F2KEY_MODE_NONE = 0; 41 public static final int F2KEY_MODE_SETTINGS = 1; 42 public static final int F2KEY_MODE_SHORTCUT_IME = 2; 43 public static final int F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS = 3; 44 45 public final Locale mLocale; 46 public final int mOrientation; 47 public final int mWidth; 48 public final int mMode; 49 public final int mXmlId; 50 public final boolean mNavigateAction; 51 public final boolean mPasswordInput; 52 // TODO: Clean up these booleans and modes. 53 public final boolean mHasSettingsKey; 54 public final int mF2KeyMode; 55 public final boolean mClobberSettingsKey; 56 public final boolean mShortcutKeyEnabled; 57 public final boolean mHasShortcutKey; 58 public final int mImeAction; 59 60 public final String mXmlName; 61 public final EditorInfo mAttribute; 62 63 private final int mHashCode; 64 KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int width, int mode, EditorInfo attribute, boolean hasSettingsKey, int f2KeyMode, boolean clobberSettingsKey, boolean shortcutKeyEnabled, boolean hasShortcutKey)65 public KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int width, 66 int mode, EditorInfo attribute, boolean hasSettingsKey, int f2KeyMode, 67 boolean clobberSettingsKey, boolean shortcutKeyEnabled, boolean hasShortcutKey) { 68 final int inputType = (attribute != null) ? attribute.inputType : 0; 69 final int imeOptions = (attribute != null) ? attribute.imeOptions : 0; 70 this.mLocale = locale; 71 this.mOrientation = orientation; 72 this.mWidth = width; 73 this.mMode = mode; 74 this.mXmlId = xmlId; 75 // Note: Turn off checking navigation flag to show TAB key for now. 76 this.mNavigateAction = InputTypeCompatUtils.isWebInputType(inputType); 77 // || EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions) 78 // || EditorInfoCompatUtils.hasFlagNavigatePrevious(imeOptions); 79 this.mPasswordInput = InputTypeCompatUtils.isPasswordInputType(inputType) 80 || InputTypeCompatUtils.isVisiblePasswordInputType(inputType); 81 this.mHasSettingsKey = hasSettingsKey; 82 this.mF2KeyMode = f2KeyMode; 83 this.mClobberSettingsKey = clobberSettingsKey; 84 this.mShortcutKeyEnabled = shortcutKeyEnabled; 85 this.mHasShortcutKey = hasShortcutKey; 86 // We are interested only in {@link EditorInfo#IME_MASK_ACTION} enum value and 87 // {@link EditorInfo#IME_FLAG_NO_ENTER_ACTION}. 88 this.mImeAction = imeOptions & ( 89 EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION); 90 91 this.mXmlName = xmlName; 92 this.mAttribute = attribute; 93 94 this.mHashCode = Arrays.hashCode(new Object[] { 95 locale, 96 orientation, 97 width, 98 mode, 99 xmlId, 100 mNavigateAction, 101 mPasswordInput, 102 hasSettingsKey, 103 f2KeyMode, 104 clobberSettingsKey, 105 shortcutKeyEnabled, 106 hasShortcutKey, 107 mImeAction, 108 }); 109 } 110 cloneWithNewXml(String xmlName, int xmlId)111 public KeyboardId cloneWithNewXml(String xmlName, int xmlId) { 112 return new KeyboardId(xmlName, xmlId, mLocale, mOrientation, mWidth, mMode, mAttribute, 113 false, F2KEY_MODE_NONE, false, false, false); 114 } 115 getXmlId()116 public int getXmlId() { 117 return mXmlId; 118 } 119 isAlphabetKeyboard()120 public boolean isAlphabetKeyboard() { 121 return mXmlId == R.xml.kbd_qwerty; 122 } 123 isSymbolsKeyboard()124 public boolean isSymbolsKeyboard() { 125 return mXmlId == R.xml.kbd_symbols || mXmlId == R.xml.kbd_symbols_shift; 126 } 127 isPhoneKeyboard()128 public boolean isPhoneKeyboard() { 129 return mMode == MODE_PHONE; 130 } 131 isPhoneShiftKeyboard()132 public boolean isPhoneShiftKeyboard() { 133 return mXmlId == R.xml.kbd_phone_shift; 134 } 135 isNumberKeyboard()136 public boolean isNumberKeyboard() { 137 return mMode == MODE_NUMBER; 138 } 139 140 @Override equals(Object other)141 public boolean equals(Object other) { 142 return other instanceof KeyboardId && equals((KeyboardId) other); 143 } 144 equals(KeyboardId other)145 private boolean equals(KeyboardId other) { 146 return other.mLocale.equals(this.mLocale) 147 && other.mOrientation == this.mOrientation 148 && other.mWidth == this.mWidth 149 && other.mMode == this.mMode 150 && other.mXmlId == this.mXmlId 151 && other.mNavigateAction == this.mNavigateAction 152 && other.mPasswordInput == this.mPasswordInput 153 && other.mHasSettingsKey == this.mHasSettingsKey 154 && other.mF2KeyMode == this.mF2KeyMode 155 && other.mClobberSettingsKey == this.mClobberSettingsKey 156 && other.mShortcutKeyEnabled == this.mShortcutKeyEnabled 157 && other.mHasShortcutKey == this.mHasShortcutKey 158 && other.mImeAction == this.mImeAction; 159 } 160 161 @Override hashCode()162 public int hashCode() { 163 return mHashCode; 164 } 165 166 @Override toString()167 public String toString() { 168 return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s%s]", 169 mXmlName, 170 mLocale, 171 (mOrientation == 1 ? "port" : "land"), mWidth, 172 modeName(mMode), 173 EditorInfoCompatUtils.imeOptionsName(mImeAction), 174 f2KeyModeName(mF2KeyMode), 175 (mClobberSettingsKey ? " clobberSettingsKey" : ""), 176 (mNavigateAction ? " navigateAction" : ""), 177 (mPasswordInput ? " passwordInput" : ""), 178 (mHasSettingsKey ? " hasSettingsKey" : ""), 179 (mShortcutKeyEnabled ? " shortcutKeyEnabled" : ""), 180 (mHasShortcutKey ? " hasShortcutKey" : "") 181 ); 182 } 183 modeName(int mode)184 public static String modeName(int mode) { 185 switch (mode) { 186 case MODE_TEXT: return "text"; 187 case MODE_URL: return "url"; 188 case MODE_EMAIL: return "email"; 189 case MODE_IM: return "im"; 190 case MODE_PHONE: return "phone"; 191 case MODE_NUMBER: return "number"; 192 default: return null; 193 } 194 } 195 f2KeyModeName(int f2KeyMode)196 public static String f2KeyModeName(int f2KeyMode) { 197 switch (f2KeyMode) { 198 case F2KEY_MODE_NONE: return "none"; 199 case F2KEY_MODE_SETTINGS: return "settings"; 200 case F2KEY_MODE_SHORTCUT_IME: return "shortcutIme"; 201 case F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS: return "shortcutImeOrSettings"; 202 default: return null; 203 } 204 } 205 } 206