2010-12-02 09:46:21 +00:00
|
|
|
/*
|
2011-05-20 03:09:57 +00:00
|
|
|
* Copyright (C) 2010 The Android Open Source Project
|
2010-12-02 09:46:21 +00:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
|
|
* use this file except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations under
|
|
|
|
* the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package com.android.inputmethod.keyboard;
|
|
|
|
|
2011-12-07 12:27:59 +00:00
|
|
|
import android.text.TextUtils;
|
2011-06-17 11:55:46 +00:00
|
|
|
import android.view.inputmethod.EditorInfo;
|
|
|
|
|
2011-03-25 19:40:57 +00:00
|
|
|
import com.android.inputmethod.compat.EditorInfoCompatUtils;
|
2011-03-25 06:28:29 +00:00
|
|
|
import com.android.inputmethod.compat.InputTypeCompatUtils;
|
2010-12-02 09:46:21 +00:00
|
|
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Locale;
|
|
|
|
|
2011-12-13 08:30:51 +00:00
|
|
|
// TODO: Move to com.android.inputmethod.keyboard.internal package.
|
2010-12-02 09:46:21 +00:00
|
|
|
/**
|
|
|
|
* Represents the parameters necessary to construct a new LatinKeyboard,
|
|
|
|
* which also serve as a unique identifier for each keyboard type.
|
|
|
|
*/
|
|
|
|
public class KeyboardId {
|
|
|
|
public static final int MODE_TEXT = 0;
|
|
|
|
public static final int MODE_URL = 1;
|
|
|
|
public static final int MODE_EMAIL = 2;
|
|
|
|
public static final int MODE_IM = 3;
|
2011-05-27 12:41:13 +00:00
|
|
|
public static final int MODE_PHONE = 4;
|
|
|
|
public static final int MODE_NUMBER = 5;
|
2010-12-02 09:46:21 +00:00
|
|
|
|
2011-12-13 08:30:51 +00:00
|
|
|
public static final int ELEMENT_ALPHABET = 0;
|
|
|
|
/* TODO: Implement alphabet variant shift keyboard.
|
|
|
|
public static final int ELEMENT_ALPHABET_MANUAL_TEMPORARY_SHIFT = 1;
|
|
|
|
public static final int ELEMENT_ALPHABET_AUTOMATIC_TEMPORARY_SHIFT = 2;
|
|
|
|
public static final int ELEMENT_ALPHABET_SHIFT_LOCK = 3;
|
|
|
|
public static final int ELEMENT_ALPHABET_SHIFT_LOCK_SHIFT = 4;
|
|
|
|
*/
|
|
|
|
public static final int ELEMENT_SYMBOLS = 5;
|
|
|
|
public static final int ELEMENT_SYMBOLS_SHIFT = 6;
|
|
|
|
public static final int ELEMENT_PHONE = 7;
|
|
|
|
public static final int ELEMENT_PHONE_SHIFT = 8;
|
|
|
|
public static final int ELEMENT_NUMBER = 9;
|
|
|
|
|
|
|
|
// TODO: These constants could be private.
|
2011-06-23 12:55:56 +00:00
|
|
|
public static final int F2KEY_MODE_NONE = 0;
|
|
|
|
public static final int F2KEY_MODE_SETTINGS = 1;
|
|
|
|
public static final int F2KEY_MODE_SHORTCUT_IME = 2;
|
|
|
|
public static final int F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS = 3;
|
|
|
|
|
2010-12-02 09:46:21 +00:00
|
|
|
public final Locale mLocale;
|
|
|
|
public final int mOrientation;
|
2011-05-17 10:02:32 +00:00
|
|
|
public final int mWidth;
|
2010-12-02 09:46:21 +00:00
|
|
|
public final int mMode;
|
2011-12-13 08:30:51 +00:00
|
|
|
// TODO: Remove this field.
|
|
|
|
private final int mXmlId;
|
|
|
|
public final int mElementState;
|
2011-06-17 09:25:54 +00:00
|
|
|
public final boolean mNavigateAction;
|
2011-02-20 03:54:14 +00:00
|
|
|
public final boolean mPasswordInput;
|
2011-06-23 12:55:56 +00:00
|
|
|
// TODO: Clean up these booleans and modes.
|
2010-12-02 09:46:21 +00:00
|
|
|
public final boolean mHasSettingsKey;
|
2011-06-23 12:55:56 +00:00
|
|
|
public final int mF2KeyMode;
|
|
|
|
public final boolean mClobberSettingsKey;
|
2011-08-01 01:34:54 +00:00
|
|
|
public final boolean mShortcutKeyEnabled;
|
|
|
|
public final boolean mHasShortcutKey;
|
2011-02-18 05:16:29 +00:00
|
|
|
public final int mImeAction;
|
2011-05-17 10:02:32 +00:00
|
|
|
|
2011-12-13 08:30:51 +00:00
|
|
|
// TODO: Remove this field.
|
|
|
|
private final EditorInfo mEditorInfo;
|
2010-12-02 09:46:21 +00:00
|
|
|
|
|
|
|
private final int mHashCode;
|
|
|
|
|
2011-12-13 08:30:51 +00:00
|
|
|
// TODO: The hasSettings, f2KeyMode, and clobberSettingsKey arguments could be reduced.
|
|
|
|
public KeyboardId(int xmlId, int elementState, Locale locale, int orientation, int width,
|
2011-11-21 22:58:32 +00:00
|
|
|
int mode, EditorInfo editorInfo, boolean hasSettingsKey, int f2KeyMode,
|
2011-08-01 01:34:54 +00:00
|
|
|
boolean clobberSettingsKey, boolean shortcutKeyEnabled, boolean hasShortcutKey) {
|
2011-11-21 22:58:32 +00:00
|
|
|
final int inputType = (editorInfo != null) ? editorInfo.inputType : 0;
|
|
|
|
final int imeOptions = (editorInfo != null) ? editorInfo.imeOptions : 0;
|
2011-12-13 08:30:51 +00:00
|
|
|
this.mElementState = elementState;
|
2010-12-02 09:46:21 +00:00
|
|
|
this.mLocale = locale;
|
|
|
|
this.mOrientation = orientation;
|
2011-05-17 10:02:32 +00:00
|
|
|
this.mWidth = width;
|
2010-12-02 09:46:21 +00:00
|
|
|
this.mMode = mode;
|
|
|
|
this.mXmlId = xmlId;
|
2011-06-17 11:55:46 +00:00
|
|
|
// Note: Turn off checking navigation flag to show TAB key for now.
|
|
|
|
this.mNavigateAction = InputTypeCompatUtils.isWebInputType(inputType);
|
|
|
|
// || EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions)
|
|
|
|
// || EditorInfoCompatUtils.hasFlagNavigatePrevious(imeOptions);
|
2011-03-25 06:28:29 +00:00
|
|
|
this.mPasswordInput = InputTypeCompatUtils.isPasswordInputType(inputType)
|
|
|
|
|| InputTypeCompatUtils.isVisiblePasswordInputType(inputType);
|
2010-12-02 09:46:21 +00:00
|
|
|
this.mHasSettingsKey = hasSettingsKey;
|
2011-06-23 12:55:56 +00:00
|
|
|
this.mF2KeyMode = f2KeyMode;
|
|
|
|
this.mClobberSettingsKey = clobberSettingsKey;
|
2011-08-01 01:34:54 +00:00
|
|
|
this.mShortcutKeyEnabled = shortcutKeyEnabled;
|
|
|
|
this.mHasShortcutKey = hasShortcutKey;
|
2011-02-18 05:16:29 +00:00
|
|
|
// We are interested only in {@link EditorInfo#IME_MASK_ACTION} enum value and
|
|
|
|
// {@link EditorInfo#IME_FLAG_NO_ENTER_ACTION}.
|
2011-02-20 03:54:14 +00:00
|
|
|
this.mImeAction = imeOptions & (
|
|
|
|
EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);
|
2011-05-17 10:02:32 +00:00
|
|
|
|
2011-11-21 22:58:32 +00:00
|
|
|
this.mEditorInfo = editorInfo;
|
2010-12-02 09:46:21 +00:00
|
|
|
|
|
|
|
this.mHashCode = Arrays.hashCode(new Object[] {
|
|
|
|
locale,
|
|
|
|
orientation,
|
2011-05-17 10:02:32 +00:00
|
|
|
width,
|
2010-12-02 09:46:21 +00:00
|
|
|
mode,
|
|
|
|
xmlId,
|
2011-12-13 08:30:51 +00:00
|
|
|
elementState,
|
2011-06-17 09:25:54 +00:00
|
|
|
mNavigateAction,
|
2011-02-20 03:54:14 +00:00
|
|
|
mPasswordInput,
|
2010-12-02 09:46:21 +00:00
|
|
|
hasSettingsKey,
|
2011-06-23 12:55:56 +00:00
|
|
|
f2KeyMode,
|
|
|
|
clobberSettingsKey,
|
2011-08-01 01:34:54 +00:00
|
|
|
shortcutKeyEnabled,
|
|
|
|
hasShortcutKey,
|
2011-02-18 05:16:29 +00:00
|
|
|
mImeAction,
|
2010-12-02 09:46:21 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2011-12-13 08:30:51 +00:00
|
|
|
public KeyboardId cloneWithNewXml(int xmlId) {
|
|
|
|
return new KeyboardId(xmlId, mElementState, mLocale,
|
|
|
|
mOrientation, mWidth, mMode, mEditorInfo, false, F2KEY_MODE_NONE, false, false,
|
|
|
|
false);
|
2011-06-28 07:32:39 +00:00
|
|
|
}
|
|
|
|
|
2011-12-13 08:30:51 +00:00
|
|
|
// Remove this method.
|
2010-12-02 09:46:21 +00:00
|
|
|
public int getXmlId() {
|
|
|
|
return mXmlId;
|
|
|
|
}
|
|
|
|
|
2010-12-02 11:54:32 +00:00
|
|
|
public boolean isAlphabetKeyboard() {
|
2011-12-13 08:30:51 +00:00
|
|
|
return mElementState < ELEMENT_SYMBOLS;
|
2010-12-02 09:46:21 +00:00
|
|
|
}
|
|
|
|
|
2010-12-17 07:56:15 +00:00
|
|
|
public boolean isSymbolsKeyboard() {
|
2011-12-13 08:30:51 +00:00
|
|
|
return mElementState == ELEMENT_SYMBOLS || mElementState == ELEMENT_SYMBOLS_SHIFT;
|
2010-12-17 07:56:15 +00:00
|
|
|
}
|
|
|
|
|
2010-12-02 11:54:32 +00:00
|
|
|
public boolean isPhoneKeyboard() {
|
2011-12-13 08:30:51 +00:00
|
|
|
return mElementState == ELEMENT_PHONE || mElementState == ELEMENT_PHONE_SHIFT;
|
2010-12-02 11:54:32 +00:00
|
|
|
}
|
|
|
|
|
2011-07-27 00:22:58 +00:00
|
|
|
public boolean isPhoneShiftKeyboard() {
|
2011-12-13 08:30:51 +00:00
|
|
|
return mElementState == ELEMENT_PHONE_SHIFT;
|
2011-05-18 00:03:25 +00:00
|
|
|
}
|
|
|
|
|
2010-12-02 09:46:21 +00:00
|
|
|
@Override
|
|
|
|
public boolean equals(Object other) {
|
|
|
|
return other instanceof KeyboardId && equals((KeyboardId) other);
|
|
|
|
}
|
|
|
|
|
2011-07-27 22:32:25 +00:00
|
|
|
private boolean equals(KeyboardId other) {
|
2010-12-02 09:46:21 +00:00
|
|
|
return other.mLocale.equals(this.mLocale)
|
|
|
|
&& other.mOrientation == this.mOrientation
|
2011-05-17 10:02:32 +00:00
|
|
|
&& other.mWidth == this.mWidth
|
2010-12-02 09:46:21 +00:00
|
|
|
&& other.mMode == this.mMode
|
|
|
|
&& other.mXmlId == this.mXmlId
|
2011-12-13 08:30:51 +00:00
|
|
|
&& other.mElementState == this.mElementState
|
2011-06-17 09:25:54 +00:00
|
|
|
&& other.mNavigateAction == this.mNavigateAction
|
2011-02-20 03:54:14 +00:00
|
|
|
&& other.mPasswordInput == this.mPasswordInput
|
2010-12-02 09:46:21 +00:00
|
|
|
&& other.mHasSettingsKey == this.mHasSettingsKey
|
2011-06-23 12:55:56 +00:00
|
|
|
&& other.mF2KeyMode == this.mF2KeyMode
|
|
|
|
&& other.mClobberSettingsKey == this.mClobberSettingsKey
|
2011-08-01 01:34:54 +00:00
|
|
|
&& other.mShortcutKeyEnabled == this.mShortcutKeyEnabled
|
|
|
|
&& other.mHasShortcutKey == this.mHasShortcutKey
|
2011-07-28 00:20:06 +00:00
|
|
|
&& other.mImeAction == this.mImeAction;
|
2010-12-02 09:46:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int hashCode() {
|
|
|
|
return mHashCode;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
2011-12-13 08:30:51 +00:00
|
|
|
return String.format("[%s %s %s%d %s %s %s%s%s%s%s%s%s]",
|
|
|
|
elementStateToString(mElementState),
|
2010-12-02 09:46:21 +00:00
|
|
|
mLocale,
|
2011-05-17 10:02:32 +00:00
|
|
|
(mOrientation == 1 ? "port" : "land"), mWidth,
|
2010-12-02 09:46:21 +00:00
|
|
|
modeName(mMode),
|
2011-03-25 19:40:57 +00:00
|
|
|
EditorInfoCompatUtils.imeOptionsName(mImeAction),
|
2011-06-23 12:55:56 +00:00
|
|
|
f2KeyModeName(mF2KeyMode),
|
|
|
|
(mClobberSettingsKey ? " clobberSettingsKey" : ""),
|
2011-06-17 09:25:54 +00:00
|
|
|
(mNavigateAction ? " navigateAction" : ""),
|
2011-02-20 03:54:14 +00:00
|
|
|
(mPasswordInput ? " passwordInput" : ""),
|
2010-12-02 09:46:21 +00:00
|
|
|
(mHasSettingsKey ? " hasSettingsKey" : ""),
|
2011-08-01 01:34:54 +00:00
|
|
|
(mShortcutKeyEnabled ? " shortcutKeyEnabled" : ""),
|
|
|
|
(mHasShortcutKey ? " hasShortcutKey" : "")
|
2011-02-20 03:54:14 +00:00
|
|
|
);
|
2010-12-02 09:46:21 +00:00
|
|
|
}
|
|
|
|
|
2011-12-07 12:27:59 +00:00
|
|
|
public static boolean equivalentEditorInfoForKeyboard(EditorInfo a, EditorInfo b) {
|
|
|
|
if (a == null && b == null) return true;
|
|
|
|
if (a == null || b == null) return false;
|
|
|
|
return a.inputType == b.inputType
|
|
|
|
&& a.imeOptions == b.imeOptions
|
|
|
|
&& TextUtils.equals(a.privateImeOptions, b.privateImeOptions);
|
|
|
|
}
|
|
|
|
|
2011-12-13 08:30:51 +00:00
|
|
|
public static String elementStateToString(int elementState) {
|
|
|
|
switch (elementState) {
|
|
|
|
case ELEMENT_ALPHABET: return "alphabet";
|
|
|
|
/* TODO: Implement alphabet variant shift keyboard.
|
|
|
|
case ELEMENT_ALPHABET_MANUAL_TEMPORARY_SHIFT: return "alphabetManualTemporaryShift";
|
|
|
|
case ELEMENT_ALPHABET_AUTOMATIC_TEMPORARY_SHIFT: return "alphabetAutomaticTemporaryShift";
|
|
|
|
case ELEMENT_ALPHABET_SHIFT_LOCK: return "alphabetShiftLock";
|
|
|
|
case ELEMENT_ALPHABET_SHIFT_LOCK_SHIFT: return "alphabetShiftLockShift";
|
|
|
|
*/
|
|
|
|
case ELEMENT_SYMBOLS: return "symbols";
|
|
|
|
case ELEMENT_SYMBOLS_SHIFT: return "symbolsShift";
|
|
|
|
case ELEMENT_PHONE: return "phone";
|
|
|
|
case ELEMENT_PHONE_SHIFT: return "phoneShift";
|
|
|
|
case ELEMENT_NUMBER: return "number";
|
|
|
|
default: return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-12-14 06:31:47 +00:00
|
|
|
public static String modeName(int mode) {
|
2010-12-02 09:46:21 +00:00
|
|
|
switch (mode) {
|
|
|
|
case MODE_TEXT: return "text";
|
|
|
|
case MODE_URL: return "url";
|
|
|
|
case MODE_EMAIL: return "email";
|
|
|
|
case MODE_IM: return "im";
|
|
|
|
case MODE_PHONE: return "phone";
|
|
|
|
case MODE_NUMBER: return "number";
|
2011-06-23 12:55:56 +00:00
|
|
|
default: return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static String f2KeyModeName(int f2KeyMode) {
|
|
|
|
switch (f2KeyMode) {
|
|
|
|
case F2KEY_MODE_NONE: return "none";
|
|
|
|
case F2KEY_MODE_SETTINGS: return "settings";
|
|
|
|
case F2KEY_MODE_SHORTCUT_IME: return "shortcutIme";
|
|
|
|
case F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS: return "shortcutImeOrSettings";
|
|
|
|
default: return null;
|
2010-12-02 09:46:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|