Support dedicated number/date keyboard layout
Bug: 3009716 Change-Id: Idc12cc9d8ee4f5febfae4e11712e2aaca327a6eamain
parent
6624fd8736
commit
2c60d6e28e
|
@ -0,0 +1,143 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2010, The Android Open Source Project
|
||||||
|
**
|
||||||
|
** 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard
|
||||||
|
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
|
||||||
|
latin:keyWidth="11.949%p"
|
||||||
|
latin:horizontalGap="@dimen/key_horizontal_gap"
|
||||||
|
latin:verticalGap="@dimen/key_bottom_gap"
|
||||||
|
latin:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
<!-- This row is intentionally not marked as a top row -->
|
||||||
|
<Row>
|
||||||
|
<Key
|
||||||
|
latin:codes="@integer/key_tab"
|
||||||
|
latin:keyLabel="@string/label_tab_key"
|
||||||
|
latin:keyLabelOption="fontNormal|alignLeft|alignBottom"
|
||||||
|
latin:isModifier="true"
|
||||||
|
latin:keyEdgeFlags="left" />
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="4.458%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="-"
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="+"
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="."
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="4.458%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="1" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="2" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="3" />
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="9.360%p" />
|
||||||
|
<Key
|
||||||
|
latin:codes="@integer/key_delete"
|
||||||
|
latin:keyLabel="@string/label_backspace_key"
|
||||||
|
latin:keyLabelOption="fontNormal|alignRight|alignBottom"
|
||||||
|
latin:keyWidth="9.804%p"
|
||||||
|
latin:isModifier="true"
|
||||||
|
latin:isRepeatable="true"
|
||||||
|
latin:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="16.406%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="*"
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="/"
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel=","
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="4.458%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="4" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="5" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="6" />
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="4.458%p" />
|
||||||
|
<Key
|
||||||
|
latin:codes="@integer/key_return"
|
||||||
|
latin:keyLabel="@string/label_return_key"
|
||||||
|
latin:keyLabelOption="fontNormal|alignRight|alignBottom"
|
||||||
|
latin:keyWidth="14.706%p"
|
||||||
|
latin:isModifier="true"
|
||||||
|
latin:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<!-- There is an empty area bellow the "More" key and left of the "(" key. To ignore
|
||||||
|
the touch event on the area, "(" is intentionally not marked as a left edge key. -->
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="16.406%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="("
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel=")"
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="="
|
||||||
|
latin:keyWidth="8.042%p" />
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="4.458%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="7" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="8" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="9" />
|
||||||
|
<!-- There is an empty area bellow the "Enter" key and right of the "9" key. To ignore
|
||||||
|
the touch event on the area, "9" is intentionally not marked as a right edge key. -->
|
||||||
|
</Row>
|
||||||
|
<!-- This row is intentionally not marked as a bottom row -->
|
||||||
|
<Row>
|
||||||
|
<!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore
|
||||||
|
the touch event on the area, "space" is intentionally not marked as a left edge key. -->
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="16.406%p" />
|
||||||
|
<Key
|
||||||
|
latin:codes="@integer/key_space"
|
||||||
|
latin:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
latin:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
latin:keyWidth="24.127%p" />
|
||||||
|
<Spacer
|
||||||
|
latin:horizontalGap="4.458%p" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="*" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="0" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="#" />
|
||||||
|
<!-- There is an empty area bellow the "Enter" key and right of the "#" key. To ignore
|
||||||
|
the touch event on the area, "#" is intentionally not marked as a right edge key. -->
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,108 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, The Android Open Source Project
|
||||||
|
**
|
||||||
|
** 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard
|
||||||
|
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
|
||||||
|
latin:keyWidth="26.67%p"
|
||||||
|
latin:horizontalGap="@dimen/key_horizontal_gap"
|
||||||
|
latin:verticalGap="@dimen/key_bottom_gap"
|
||||||
|
latin:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
<include
|
||||||
|
latin:keyboardLayout="@xml/kbd_key_styles" />
|
||||||
|
<switch>
|
||||||
|
<case
|
||||||
|
latin:colorScheme="white"
|
||||||
|
>
|
||||||
|
<key-style
|
||||||
|
latin:styleName="numSpaceKeyStyle"
|
||||||
|
latin:codes="@integer/key_space"
|
||||||
|
latin:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
|
||||||
|
</case>
|
||||||
|
<case
|
||||||
|
latin:colorScheme="black"
|
||||||
|
>
|
||||||
|
<key-style
|
||||||
|
latin:styleName="numSpaceKeyStyle"
|
||||||
|
latin:codes="@integer/key_space"
|
||||||
|
latin:keyIcon="@drawable/sym_bkeyboard_space"
|
||||||
|
latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
|
||||||
|
</case>
|
||||||
|
</switch>
|
||||||
|
<Row
|
||||||
|
latin:rowEdgeFlags="top"
|
||||||
|
>
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="1"
|
||||||
|
latin:keyEdgeFlags="left" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="2" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="3" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="-"
|
||||||
|
latin:keyStyle="functionalKeyStyle"
|
||||||
|
latin:keyWidth="20%p"
|
||||||
|
latin:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="4"
|
||||||
|
latin:keyEdgeFlags="left" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="5" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="6" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel=","
|
||||||
|
latin:keyStyle="functionalKeyStyle"
|
||||||
|
latin:keyWidth="20%p"
|
||||||
|
latin:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="7"
|
||||||
|
latin:keyEdgeFlags="left" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="8" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="9" />
|
||||||
|
<Key
|
||||||
|
latin:keyStyle="deleteKeyStyle"
|
||||||
|
latin:keyWidth="20%p"
|
||||||
|
latin:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row
|
||||||
|
latin:rowEdgeFlags="bottom"
|
||||||
|
>
|
||||||
|
<Key
|
||||||
|
latin:keyStyle="numSpaceKeyStyle"
|
||||||
|
latin:keyEdgeFlags="left" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="0" />
|
||||||
|
<Key
|
||||||
|
latin:keyLabel="." />
|
||||||
|
<Key
|
||||||
|
latin:keyStyle="returnKeyStyle"
|
||||||
|
latin:keyWidth="20%p"
|
||||||
|
latin:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -40,6 +40,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
|
||||||
public static final int MODE_IM = 3;
|
public static final int MODE_IM = 3;
|
||||||
public static final int MODE_WEB = 4;
|
public static final int MODE_WEB = 4;
|
||||||
public static final int MODE_PHONE = 5;
|
public static final int MODE_PHONE = 5;
|
||||||
|
public static final int MODE_NUMBER = 6;
|
||||||
|
|
||||||
// Changing DEFAULT_LAYOUT_ID also requires prefs_for_debug.xml to be matched with.
|
// Changing DEFAULT_LAYOUT_ID also requires prefs_for_debug.xml to be matched with.
|
||||||
public static final String DEFAULT_LAYOUT_ID = "5";
|
public static final String DEFAULT_LAYOUT_ID = "5";
|
||||||
|
@ -239,6 +240,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
|
||||||
case MODE_IM: return "im";
|
case MODE_IM: return "im";
|
||||||
case MODE_WEB: return "web";
|
case MODE_WEB: return "web";
|
||||||
case MODE_PHONE: return "phone";
|
case MODE_PHONE: return "phone";
|
||||||
|
case MODE_NUMBER: return "number";
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -287,10 +289,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
|
||||||
KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
|
KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
|
||||||
LatinKeyboard keyboard = getKeyboard(id);
|
LatinKeyboard keyboard = getKeyboard(id);
|
||||||
|
|
||||||
if (mode == MODE_PHONE) {
|
|
||||||
mInputView.setPhoneKeyboard(keyboard);
|
|
||||||
}
|
|
||||||
|
|
||||||
mCurrentId = id;
|
mCurrentId = id;
|
||||||
mInputView.setKeyboard(keyboard);
|
mInputView.setKeyboard(keyboard);
|
||||||
}
|
}
|
||||||
|
@ -331,11 +329,26 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
|
||||||
final boolean enableShiftLock;
|
final boolean enableShiftLock;
|
||||||
|
|
||||||
if (isSymbols) {
|
if (isSymbols) {
|
||||||
xmlId = mode == MODE_PHONE ? R.xml.kbd_phone_symbols : R.xml.kbd_symbols;
|
if (mode == MODE_PHONE) {
|
||||||
|
xmlId = R.xml.kbd_phone_symbols;
|
||||||
|
} else if (mode == MODE_NUMBER) {
|
||||||
|
// Note: MODE_NUMBER keyboard layout has no "switch alpha symbol" key.
|
||||||
|
xmlId = R.xml.kbd_number;
|
||||||
|
} else {
|
||||||
|
xmlId = R.xml.kbd_symbols;
|
||||||
|
}
|
||||||
enableShiftLock = false;
|
enableShiftLock = false;
|
||||||
} else { // QWERTY
|
} else {
|
||||||
xmlId = mode == MODE_PHONE ? R.xml.kbd_phone : R.xml.kbd_qwerty;
|
if (mode == MODE_PHONE) {
|
||||||
enableShiftLock = mode == MODE_PHONE ? false : true;
|
xmlId = R.xml.kbd_phone;
|
||||||
|
enableShiftLock = false;
|
||||||
|
} else if (mode == MODE_NUMBER) {
|
||||||
|
xmlId = R.xml.kbd_number;
|
||||||
|
enableShiftLock = false;
|
||||||
|
} else {
|
||||||
|
xmlId = R.xml.kbd_qwerty;
|
||||||
|
enableShiftLock = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
final int orientation = mInputMethodService.getResources().getConfiguration().orientation;
|
final int orientation = mInputMethodService.getResources().getConfiguration().orientation;
|
||||||
final Locale locale = mSubtypeSwitcher.getInputLocale();
|
final Locale locale = mSubtypeSwitcher.getInputLocale();
|
||||||
|
|
|
@ -545,10 +545,8 @@ public class LatinIME extends InputMethodService
|
||||||
switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) {
|
switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) {
|
||||||
case EditorInfo.TYPE_CLASS_NUMBER:
|
case EditorInfo.TYPE_CLASS_NUMBER:
|
||||||
case EditorInfo.TYPE_CLASS_DATETIME:
|
case EditorInfo.TYPE_CLASS_DATETIME:
|
||||||
// fall through
|
mode = KeyboardSwitcher.MODE_NUMBER;
|
||||||
// NOTE: For now, we use the phone keyboard for NUMBER and DATETIME until we get
|
break;
|
||||||
// a dedicated number entry keypad.
|
|
||||||
// TODO: Use a dedicated number entry keypad here when we get one.
|
|
||||||
case EditorInfo.TYPE_CLASS_PHONE:
|
case EditorInfo.TYPE_CLASS_PHONE:
|
||||||
mode = KeyboardSwitcher.MODE_PHONE;
|
mode = KeyboardSwitcher.MODE_PHONE;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -189,6 +189,14 @@ public class LatinKeyboard extends BaseKeyboard {
|
||||||
return mId.getXmlId() == R.xml.kbd_qwerty;
|
return mId.getXmlId() == R.xml.kbd_qwerty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPhoneKeyboard() {
|
||||||
|
return mId.mMode == KeyboardSwitcher.MODE_PHONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNumberKeyboard() {
|
||||||
|
return mId.mMode == KeyboardSwitcher.MODE_NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a key which should be invalidated.
|
* @return a key which should be invalidated.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -40,8 +40,6 @@ public class LatinKeyboardView extends BaseKeyboardView {
|
||||||
public static final int KEYCODE_PREV_LANGUAGE = -105;
|
public static final int KEYCODE_PREV_LANGUAGE = -105;
|
||||||
public static final int KEYCODE_CAPSLOCK = -106;
|
public static final int KEYCODE_CAPSLOCK = -106;
|
||||||
|
|
||||||
private LatinKeyboard mPhoneKeyboard;
|
|
||||||
|
|
||||||
/** Whether we've started dropping move events because we found a big jump */
|
/** Whether we've started dropping move events because we found a big jump */
|
||||||
private boolean mDroppingEvents;
|
private boolean mDroppingEvents;
|
||||||
/**
|
/**
|
||||||
|
@ -62,14 +60,12 @@ public class LatinKeyboardView extends BaseKeyboardView {
|
||||||
super(context, attrs, defStyle);
|
super(context, attrs, defStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPhoneKeyboard(LatinKeyboard phoneKeyboard) {
|
|
||||||
mPhoneKeyboard = phoneKeyboard;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPreviewEnabled(boolean previewEnabled) {
|
public void setPreviewEnabled(boolean previewEnabled) {
|
||||||
if (getLatinKeyboard() == mPhoneKeyboard) {
|
LatinKeyboard latinKeyboard = getLatinKeyboard();
|
||||||
// Phone keyboard never shows popup preview (except language switch).
|
if (latinKeyboard != null
|
||||||
|
&& (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) {
|
||||||
|
// Phone and number keyboard never shows popup preview (except language switch).
|
||||||
super.setPreviewEnabled(false);
|
super.setPreviewEnabled(false);
|
||||||
} else {
|
} else {
|
||||||
super.setPreviewEnabled(previewEnabled);
|
super.setPreviewEnabled(previewEnabled);
|
||||||
|
@ -100,7 +96,7 @@ public class LatinKeyboardView extends BaseKeyboardView {
|
||||||
int primaryCode = key.codes[0];
|
int primaryCode = key.codes[0];
|
||||||
if (primaryCode == KEYCODE_OPTIONS) {
|
if (primaryCode == KEYCODE_OPTIONS) {
|
||||||
return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS);
|
return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS);
|
||||||
} else if (primaryCode == '0' && getLatinKeyboard() == mPhoneKeyboard) {
|
} else if (primaryCode == '0' && getLatinKeyboard().isPhoneKeyboard()) {
|
||||||
// Long pressing on 0 in phone number keypad gives you a '+'.
|
// Long pressing on 0 in phone number keypad gives you a '+'.
|
||||||
return invokeOnKey('+');
|
return invokeOnKey('+');
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue