diff options
Diffstat (limited to 'java/src')
20 files changed, 852 insertions, 669 deletions
diff --git a/java/src/com/android/inputmethod/event/Combiner.java b/java/src/com/android/inputmethod/event/Combiner.java index ab6b70c04..c3869a299 100644 --- a/java/src/com/android/inputmethod/event/Combiner.java +++ b/java/src/com/android/inputmethod/event/Combiner.java @@ -16,14 +16,22 @@ package com.android.inputmethod.event; +import java.util.ArrayList; + /** - * A generic interface for combiners. + * A generic interface for combiners. Combiners are objects that transform chains of input events + * into committable strings and manage feedback to show to the user on the combining state. */ public interface Combiner { /** - * Combine an event with the existing state and return the new event. + * Process an event, possibly combining it with the existing state and return the new event. + * + * If this event does not result in any new event getting passed down the chain, this method + * returns null. It may also modify the previous event list if appropriate. + * + * @param previousEvents the previous events in this composition. * @param event the event to combine with the existing state. * @return the resulting event. */ - Event combine(Event event); + Event processEvent(ArrayList<Event> previousEvents, Event event); } diff --git a/java/src/com/android/inputmethod/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java new file mode 100644 index 000000000..0e01c819a --- /dev/null +++ b/java/src/com/android/inputmethod/event/CombinerChain.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2014 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. + */ + +package com.android.inputmethod.event; + +import com.android.inputmethod.latin.utils.CollectionUtils; + +import java.util.ArrayList; + +/** + * This class implements the logic chain between receiving events and generating code points. + * + * Event sources are multiple. It may be a hardware keyboard, a D-PAD, a software keyboard, + * or any exotic input source. + * This class will orchestrate the composing chain that starts with an event as its input. Each + * composer will be given turns one after the other. + * The output is composed of two sequences of code points: the first, representing the already + * finished combining part, will be shown normally as the composing string, while the second is + * feedback on the composing state and will typically be shown with different styling such as + * a colored background. + */ +public class CombinerChain { + // TODO: Create an object type to represent input material + visual feedback + decoding state + + private final ArrayList<Combiner> mCombiners; + + /** + * Create an combiner chain. + * + * The combiner chain takes events as inputs and outputs code points and combining state. + * For example, if the input language is Japanese, the combining chain will typically perform + * kana conversion. + * + * @param combinerList A list of combiners to be applied in order. + */ + public CombinerChain(final Combiner... combinerList) { + mCombiners = CollectionUtils.newArrayList(); + // The dead key combiner is always active, and always first + mCombiners.add(new DeadKeyCombiner()); + } + + // Pass a new event through the whole chain. + public void processEvent(final ArrayList<Event> previousEvents, final Event newEvent) { + final ArrayList<Event> modifiablePreviousEvents = new ArrayList<Event>(previousEvents); + Event event = newEvent; + for (final Combiner combiner : mCombiners) { + // A combiner can never return more than one event; it can return several + // code points, but they should be encapsulated within one event. + event = combiner.processEvent(modifiablePreviousEvents, event); + if (null == event) { + // Combiners return null if they eat the event. + return; + } + } + } +} diff --git a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java index ae8639713..f77ce6347 100644 --- a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java +++ b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java @@ -21,14 +21,17 @@ import android.view.KeyCharacterMap; import com.android.inputmethod.latin.Constants; +import java.util.ArrayList; + /** * A combiner that handles dead keys. */ public class DeadKeyCombiner implements Combiner { + // TODO: make this a list of events instead final StringBuilder mDeadSequence = new StringBuilder(); @Override - public Event combine(final Event event) { + public Event processEvent(final ArrayList<Event> previousEvents, final Event event) { if (null == event) return null; // Just in case some combiner is broken if (TextUtils.isEmpty(mDeadSequence)) { if (event.isDead()) { diff --git a/java/src/com/android/inputmethod/event/Event.java b/java/src/com/android/inputmethod/event/Event.java index 41bf36b36..db4023436 100644 --- a/java/src/com/android/inputmethod/event/Event.java +++ b/java/src/com/android/inputmethod/event/Event.java @@ -17,6 +17,7 @@ package com.android.inputmethod.event; import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; /** * Class representing a generic input event as handled by Latin IME. @@ -49,6 +50,10 @@ public class Event { final public static int EVENT_MODE_KEY = 3; // An event corresponding to a gesture. final public static int EVENT_GESTURE = 4; + // An event corresponding to the manual pick of a suggestion. + final public static int EVENT_SUGGESTION_PICKED = 5; + // An event corresponding to a string generated by some software process. + final public static int EVENT_SOFTWARE_GENERATED_STRING = 6; // 0 is a valid code point, so we use -1 here. final public static int NOT_A_CODE_POINT = -1; @@ -68,6 +73,9 @@ public class Event { // it's not relevant. final public int mCodePoint; + // If applicable, this contains the string that should be input. + final public CharSequence mText; + // The key code associated with the event, if relevant. This is relevant whenever this event // has been triggered by a key press, but not for a gesture for example. This has conceptually // no link to the code point, although keys that enter a straight code point may often set @@ -85,39 +93,60 @@ public class Event { // Some flags that can't go into the key code. It's a bit field of FLAG_* final private int mFlags; + // If this is of type EVENT_SUGGESTION_PICKED, this must not be null (and must be null in + // other cases). + final public SuggestedWordInfo mSuggestedWordInfo; + // The next event, if any. Null if there is no next event yet. final public Event mNextEvent; // This method is private - to create a new event, use one of the create* utility methods. - private Event(final int type, final int codePoint, final int keyCode, final int x, final int y, - final int flags, final Event next) { + private Event(final int type, final CharSequence text, final int codePoint, final int keyCode, + final int x, final int y, final SuggestedWordInfo suggestedWordInfo, final int flags, + final Event next) { mType = type; + mText = text; mCodePoint = codePoint; mKeyCode = keyCode; mX = x; mY = y; + mSuggestedWordInfo = suggestedWordInfo; mFlags = flags; mNextEvent = next; + // Sanity checks + // mSuggestedWordInfo is non-null if and only if the type is SUGGESTION_PICKED + if (EVENT_SUGGESTION_PICKED == mType) { + if (null == mSuggestedWordInfo) { + throw new RuntimeException("Wrong event: SUGGESTION_PICKED event must have a " + + "non-null SuggestedWordInfo"); + } + } else { + if (null != mSuggestedWordInfo) { + throw new RuntimeException("Wrong event: only SUGGESTION_PICKED events may have " + + "a non-null SuggestedWordInfo"); + } + } } public static Event createSoftwareKeypressEvent(final int codePoint, final int keyCode, final int x, final int y) { - return new Event(EVENT_INPUT_KEYPRESS, codePoint, keyCode, x, y, FLAG_NONE, null); + return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, keyCode, x, y, + null /* suggestedWordInfo */, FLAG_NONE, null); } public static Event createHardwareKeypressEvent(final int codePoint, final int keyCode, final Event next) { - return new Event(EVENT_INPUT_KEYPRESS, codePoint, keyCode, + return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, keyCode, Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE, - FLAG_NONE, next); + null /* suggestedWordInfo */, FLAG_NONE, next); } // This creates an input event for a dead character. @see {@link #FLAG_DEAD} public static Event createDeadEvent(final int codePoint, final int keyCode, final Event next) { // TODO: add an argument or something if we ever create a software layout with dead keys. - return new Event(EVENT_INPUT_KEYPRESS, codePoint, keyCode, + return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, keyCode, Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE, - FLAG_DEAD, next); + null /* suggestedWordInfo */, FLAG_DEAD, next); } /** @@ -129,8 +158,9 @@ public class Event { */ public static Event createEventForCodePointFromUnknownSource(final int codePoint) { // TODO: should we have a different type of event for this? After all, it's not a key press. - return new Event(EVENT_INPUT_KEYPRESS, codePoint, NOT_A_KEY_CODE, - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, FLAG_NONE, null /* next */); + return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, NOT_A_KEY_CODE, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + null /* suggestedWordInfo */, FLAG_NONE, null /* next */); } /** @@ -144,13 +174,39 @@ public class Event { public static Event createEventForCodePointFromAlreadyTypedText(final int codePoint, final int x, final int y) { // TODO: should we have a different type of event for this? After all, it's not a key press. - return new Event(EVENT_INPUT_KEYPRESS, codePoint, NOT_A_KEY_CODE, x, y, FLAG_NONE, - null /* next */); + return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, NOT_A_KEY_CODE, x, y, + null /* suggestedWordInfo */, FLAG_NONE, null /* next */); + } + + /** + * Creates an input event representing the manual pick of a suggestion. + * @return an event for this suggestion pick. + */ + public static Event createSuggestionPickedEvent(final SuggestedWordInfo suggestedWordInfo) { + return new Event(EVENT_SUGGESTION_PICKED, suggestedWordInfo.mWord, + NOT_A_CODE_POINT, NOT_A_KEY_CODE, + Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE, + suggestedWordInfo, FLAG_NONE, null); + } + + /** + * Creates an input event with a CharSequence. This is used by some software processes whose + * output is a string, possibly with styling. Examples include press on a multi-character key, + * or combination that outputs a string. + * @param text the CharSequence associated with this event. + * @param keyCode the key code, or NOT_A_KEYCODE if not applicable. + * @return an event for this text. + */ + public static Event createSoftwareTextEvent(final CharSequence text, final int keyCode) { + return new Event(EVENT_SOFTWARE_GENERATED_STRING, text, NOT_A_CODE_POINT, keyCode, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + null /* suggestedWordInfo */, FLAG_NONE, null /* next */); } public static Event createNotHandledEvent() { - return new Event(EVENT_NOT_HANDLED, NOT_A_CODE_POINT, NOT_A_KEY_CODE, - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, FLAG_NONE, null); + return new Event(EVENT_NOT_HANDLED, null /* text */, NOT_A_CODE_POINT, NOT_A_KEY_CODE, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + null /* suggestedWordInfo */, FLAG_NONE, null); } // Returns whether this event is for a dead character. @see {@link #FLAG_DEAD} @@ -164,11 +220,6 @@ public class Event { return EVENT_INPUT_KEYPRESS == mType && Constants.SUGGESTION_STRIP_COORDINATE == mX; } - // TODO: remove this method - we should not have to test this - public boolean isCommittable() { - return EVENT_INPUT_KEYPRESS == mType || EVENT_MODE_KEY == mType || EVENT_TOGGLE == mType; - } - public boolean isHandled() { return EVENT_NOT_HANDLED != mType; } diff --git a/java/src/com/android/inputmethod/event/EventDecoderSpec.java b/java/src/com/android/inputmethod/event/EventDecoderSpec.java deleted file mode 100644 index 303b4b4c9..000000000 --- a/java/src/com/android/inputmethod/event/EventDecoderSpec.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -package com.android.inputmethod.event; - -/** - * Class describing a decoder chain. This will depend on the language and the input medium (soft - * or hard keyboard for example). - */ -public class EventDecoderSpec { - public EventDecoderSpec() { - } -} diff --git a/java/src/com/android/inputmethod/event/EventInterpreter.java b/java/src/com/android/inputmethod/event/EventInterpreter.java deleted file mode 100644 index bcf10fc58..000000000 --- a/java/src/com/android/inputmethod/event/EventInterpreter.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -package com.android.inputmethod.event; - -import com.android.inputmethod.latin.utils.CollectionUtils; - -import java.util.ArrayList; - -/** - * This class implements the logic between receiving events and generating code points. - * - * Event sources are multiple. It may be a hardware keyboard, a D-PAD, a software keyboard, - * or any exotic input source. - * This class will orchestrate the decoding chain that starts with an event and ends up with - * a stream of code points + decoding state. - */ -public class EventInterpreter { - // TODO: Implement an object pool for events, as we'll create a lot of them - // TODO: Create a combiner - // TODO: Create an object type to represent input material + visual feedback + decoding state - - private final EventDecoderSpec mDecoderSpec; - private final ArrayList<Combiner> mCombiners; - - /** - * Create an event interpreter according to a specification. - * - * The specification contains information about what to do with events. Typically, it will - * contain information about the type of keyboards - for example, if hardware keyboard(s) is/are - * attached, their type will be included here so that the decoder knows what to do with each - * keypress (a 10-key keyboard is not handled like a qwerty-ish keyboard). - * It also contains information for combining characters. For example, if the input language - * is Japanese, the specification will typically request kana conversion. - * Also note that the specification can be null. This means that we need to create a default - * interpreter that does no specific combining, and assumes the most common cases. - * - * @param specification the specification for event interpretation. null for default. - */ - public EventInterpreter(final EventDecoderSpec specification) { - mDecoderSpec = null != specification ? specification : new EventDecoderSpec(); - mCombiners = CollectionUtils.newArrayList(); - mCombiners.add(new DeadKeyCombiner()); - } -} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 2711d249b..2dfde9434 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -60,7 +60,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { public static final int THEME_INDEX_ICS = 0; public static final int THEME_INDEX_GB = 1; public static final int THEME_INDEX_KLP = 2; - public static final int THEME_INDEX_DEFAULT = THEME_INDEX_KLP; + public static final int DEFAULT_THEME_INDEX = THEME_INDEX_KLP; public static final KeyboardTheme[] KEYBOARD_THEMES = { new KeyboardTheme(THEME_INDEX_ICS, R.style.KeyboardTheme_ICS), new KeyboardTheme(THEME_INDEX_GB, R.style.KeyboardTheme_GB), @@ -88,7 +88,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { * what user actually typed. */ private boolean mIsAutoCorrectionActive; - private KeyboardTheme mKeyboardTheme = KEYBOARD_THEMES[THEME_INDEX_DEFAULT]; + private KeyboardTheme mKeyboardTheme = KEYBOARD_THEMES[DEFAULT_THEME_INDEX]; private Context mThemeContext; private static final KeyboardSwitcher sInstance = new KeyboardSwitcher(); @@ -163,7 +163,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { mCurrentSettingsValues = settingsValues; try { mState.onLoadKeyboard(); - mKeyboardTextsSet.setLocale(mSubtypeSwitcher.getCurrentSubtypeLocale()); + mKeyboardTextsSet.setLocale(mSubtypeSwitcher.getCurrentSubtypeLocale(), mThemeContext); } catch (KeyboardLayoutSetException e) { Log.w(TAG, "loading keyboard failed: " + e.mKeyboardId, e.getCause()); LatinImeLogger.logOnException(e.mKeyboardId.toString(), e.getCause()); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index 81a8e7196..dfe0df04c 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -34,7 +34,6 @@ import com.android.inputmethod.keyboard.KeyboardId; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.ResourceUtils; -import com.android.inputmethod.latin.utils.RunInLocale; import com.android.inputmethod.latin.utils.StringUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import com.android.inputmethod.latin.utils.XmlParseUtils; @@ -45,7 +44,6 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.Arrays; -import java.util.Locale; /** * Keyboard Building helper. @@ -278,18 +276,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0); params.mIconsSet.loadIcons(keyboardAttr); - final Locale locale = params.mId.mLocale; - params.mTextsSet.setLocale(locale); - final RunInLocale<Void> job = new RunInLocale<Void>() { - @Override - protected Void job(final Resources res) { - params.mTextsSet.loadStringResources(mContext); - return null; - } - }; - // Null means the current system locale. - job.runInLocale(mResources, - SubtypeLocaleUtils.isNoLanguage(params.mId.mSubtype) ? null : locale); + params.mTextsSet.setLocale(params.mId.mLocale, mContext); final int resourceId = keyboardAttr.getResourceId( R.styleable.Keyboard_touchPositionCorrectionData, 0); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java index 976038c10..044cd119e 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java @@ -23,6 +23,8 @@ import android.text.TextUtils; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.utils.RunInLocale; +import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import java.util.HashMap; import java.util.Locale; @@ -38,23 +40,29 @@ public final class KeyboardTextsSet { // Resource name to text map. private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap(); - public void setLocale(final Locale locale) { + public void setLocale(final Locale locale, final Context context) { final String language = locale.getLanguage(); mTextsTable = KeyboardTextsTable.getTextsTable(language); - } - - public void loadStringResources(final Context context) { + final Resources res = context.getResources(); final int referenceId = context.getApplicationInfo().labelRes; - loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId); + final String resourcePackageName = res.getResourcePackageName(referenceId); + final RunInLocale<Void> job = new RunInLocale<Void>() { + @Override + protected Void job(final Resources resource) { + loadStringResourcesInternal(res, RESOURCE_NAMES, resourcePackageName); + return null; + } + }; + // Null means the current system locale. + job.runInLocale(res, + SubtypeLocaleUtils.NO_LANGUAGE.equals(locale.toString()) ? null : locale); } @UsedForTesting - void loadStringResourcesInternal(final Context context, final String[] resourceNames, - final int referenceId) { - final Resources res = context.getResources(); - final String packageName = res.getResourcePackageName(referenceId); + void loadStringResourcesInternal(final Resources res, final String[] resourceNames, + final String resourcePackageName) { for (final String resName : resourceNames) { - final int resId = res.getIdentifier(resName, "string", packageName); + final int resId = res.getIdentifier(resName, "string", resourcePackageName); mResourceNameToTextsMap.put(resName, res.getString(resId)); } } @@ -77,6 +85,7 @@ public final class KeyboardTextsSet { return size; } + // TODO: Resolve text reference when creating {@link KeyboardTextsTable} class. public String resolveTextReference(final String rawText) { if (TextUtils.isEmpty(rawText)) { return null; @@ -127,7 +136,7 @@ public final class KeyboardTextsSet { // These texts' name should be aligned with the @string/<name> in // values*/strings-action-keys.xml. - private static final String[] RESOURCE_NAMES = { + static final String[] RESOURCE_NAMES = { // Labels for action. "label_go_key", "label_send_key", diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java index 7a0161e65..1d9ee90fb 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java @@ -79,17 +79,17 @@ public final class KeyboardTextsTable { private static final String[] NAMES = { // /* index:histogram */ "name", - /* 0:30 */ "more_keys_for_a", - /* 1:30 */ "more_keys_for_o", - /* 2:28 */ "more_keys_for_u", - /* 3:27 */ "more_keys_for_e", - /* 4:26 */ "more_keys_for_i", - /* 5:23 */ "double_quotes", - /* 6:22 */ "single_quotes", - /* 7:21 */ "more_keys_for_c", - /* 8:20 */ "more_keys_for_s", - /* 9:20 */ "more_keys_for_n", - /* 10:20 */ "label_to_alpha_key", + /* 0:32 */ "more_keys_for_a", + /* 1:32 */ "more_keys_for_o", + /* 2:30 */ "more_keys_for_u", + /* 3:29 */ "more_keys_for_e", + /* 4:28 */ "more_keys_for_i", + /* 5:23 */ "more_keys_for_c", + /* 6:23 */ "double_quotes", + /* 7:22 */ "more_keys_for_n", + /* 8:22 */ "single_quotes", + /* 9:21 */ "label_to_alpha_key", + /* 10:20 */ "more_keys_for_s", /* 11:14 */ "more_keys_for_y", /* 12:13 */ "more_keys_for_d", /* 13:12 */ "more_keys_for_z", @@ -111,30 +111,30 @@ public final class KeyboardTextsTable { /* 29: 5 */ "keylabel_for_east_slavic_row2_11", /* 30: 5 */ "keylabel_for_east_slavic_row3_5", /* 31: 5 */ "more_keys_for_cyrillic_soft_sign", - /* 32: 5 */ "more_keys_for_punctuation", - /* 33: 4 */ "more_keys_for_nordic_row2_11", - /* 34: 4 */ "keylabel_for_symbols_1", - /* 35: 4 */ "keylabel_for_symbols_2", - /* 36: 4 */ "keylabel_for_symbols_3", - /* 37: 4 */ "keylabel_for_symbols_4", - /* 38: 4 */ "keylabel_for_symbols_5", - /* 39: 4 */ "keylabel_for_symbols_6", - /* 40: 4 */ "keylabel_for_symbols_7", - /* 41: 4 */ "keylabel_for_symbols_8", - /* 42: 4 */ "keylabel_for_symbols_9", - /* 43: 4 */ "keylabel_for_symbols_0", - /* 44: 4 */ "label_to_symbol_key", - /* 45: 4 */ "label_to_symbol_with_microphone_key", - /* 46: 4 */ "additional_more_keys_for_symbols_1", - /* 47: 4 */ "additional_more_keys_for_symbols_2", - /* 48: 4 */ "additional_more_keys_for_symbols_3", - /* 49: 4 */ "additional_more_keys_for_symbols_4", - /* 50: 4 */ "additional_more_keys_for_symbols_5", - /* 51: 4 */ "additional_more_keys_for_symbols_6", - /* 52: 4 */ "additional_more_keys_for_symbols_7", - /* 53: 4 */ "additional_more_keys_for_symbols_8", - /* 54: 4 */ "additional_more_keys_for_symbols_9", - /* 55: 4 */ "additional_more_keys_for_symbols_0", + /* 32: 4 */ "more_keys_for_nordic_row2_11", + /* 33: 4 */ "keylabel_for_symbols_1", + /* 34: 4 */ "keylabel_for_symbols_2", + /* 35: 4 */ "keylabel_for_symbols_3", + /* 36: 4 */ "keylabel_for_symbols_4", + /* 37: 4 */ "keylabel_for_symbols_5", + /* 38: 4 */ "keylabel_for_symbols_6", + /* 39: 4 */ "keylabel_for_symbols_7", + /* 40: 4 */ "keylabel_for_symbols_8", + /* 41: 4 */ "keylabel_for_symbols_9", + /* 42: 4 */ "keylabel_for_symbols_0", + /* 43: 4 */ "label_to_symbol_key", + /* 44: 4 */ "label_to_symbol_with_microphone_key", + /* 45: 4 */ "additional_more_keys_for_symbols_1", + /* 46: 4 */ "additional_more_keys_for_symbols_2", + /* 47: 4 */ "additional_more_keys_for_symbols_3", + /* 48: 4 */ "additional_more_keys_for_symbols_4", + /* 49: 4 */ "additional_more_keys_for_symbols_5", + /* 50: 4 */ "additional_more_keys_for_symbols_6", + /* 51: 4 */ "additional_more_keys_for_symbols_7", + /* 52: 4 */ "additional_more_keys_for_symbols_8", + /* 53: 4 */ "additional_more_keys_for_symbols_9", + /* 54: 4 */ "additional_more_keys_for_symbols_0", + /* 55: 3 */ "more_keys_for_punctuation", /* 56: 3 */ "more_keys_for_star", /* 57: 3 */ "keyspec_left_parenthesis", /* 58: 3 */ "keyspec_right_parenthesis", @@ -177,78 +177,77 @@ public final class KeyboardTextsTable { /* 95: 2 */ "more_keys_for_right_parenthesis", /* 96: 2 */ "more_keys_for_arabic_diacritics", /* 97: 2 */ "keylabel_for_comma", - /* 98: 2 */ "more_keys_for_comma", - /* 99: 2 */ "keyhintlabel_for_tablet_comma", - /* 100: 2 */ "more_keys_for_tablet_comma", - /* 101: 2 */ "keyhintlabel_for_period", - /* 102: 2 */ "more_keys_for_period", - /* 103: 2 */ "keyhintlabel_for_tablet_period", - /* 104: 2 */ "keylabel_for_symbols_question", - /* 105: 2 */ "keylabel_for_symbols_semicolon", - /* 106: 2 */ "keylabel_for_symbols_percent", - /* 107: 2 */ "more_keys_for_symbols_semicolon", - /* 108: 2 */ "more_keys_for_symbols_percent", - /* 109: 1 */ "more_keys_for_v", - /* 110: 1 */ "more_keys_for_j", - /* 111: 1 */ "more_keys_for_cyrillic_ka", - /* 112: 1 */ "more_keys_for_cyrillic_a", - /* 113: 1 */ "more_keys_for_east_slavic_row2_11", - /* 114: 1 */ "more_keys_for_currency_dollar", - /* 115: 1 */ "more_keys_for_tablet_punctuation", - /* 116: 1 */ "more_keys_for_plus", - /* 117: 1 */ "more_keys_for_less_than", - /* 118: 1 */ "more_keys_for_greater_than", - /* 119: 1 */ "keylabel_for_period", - /* 120: 1 */ "keylabel_for_tablet_period", - /* 121: 1 */ "more_keys_for_exclamation", - /* 122: 1 */ "more_keys_for_q", - /* 123: 1 */ "more_keys_for_x", - /* 124: 1 */ "keylabel_for_q", - /* 125: 1 */ "keylabel_for_w", - /* 126: 1 */ "keylabel_for_y", - /* 127: 1 */ "keylabel_for_x", - /* 128: 0 */ "more_keys_for_currency", - /* 129: 0 */ "more_keys_for_symbols_1", - /* 130: 0 */ "more_keys_for_symbols_2", - /* 131: 0 */ "more_keys_for_symbols_3", - /* 132: 0 */ "more_keys_for_symbols_4", - /* 133: 0 */ "more_keys_for_symbols_5", - /* 134: 0 */ "more_keys_for_symbols_6", - /* 135: 0 */ "more_keys_for_symbols_7", - /* 136: 0 */ "more_keys_for_symbols_8", - /* 137: 0 */ "more_keys_for_symbols_9", - /* 138: 0 */ "more_keys_for_symbols_0", - /* 139: 0 */ "more_keys_for_am_pm", - /* 140: 0 */ "settings_as_more_key", - /* 141: 0 */ "shortcut_as_more_key", - /* 142: 0 */ "action_next_as_more_key", - /* 143: 0 */ "action_previous_as_more_key", - /* 144: 0 */ "label_to_more_symbol_key", - /* 145: 0 */ "label_to_more_symbol_for_tablet_key", - /* 146: 0 */ "label_to_phone_numeric_key", - /* 147: 0 */ "label_to_phone_symbols_key", - /* 148: 0 */ "label_time_am", - /* 149: 0 */ "label_time_pm", - /* 150: 0 */ "keylabel_for_popular_domain", - /* 151: 0 */ "more_keys_for_popular_domain", - /* 152: 0 */ "keyspecs_for_left_parenthesis_more_keys", - /* 153: 0 */ "keyspecs_for_right_parenthesis_more_keys", - /* 154: 0 */ "single_laqm_raqm", - /* 155: 0 */ "single_raqm_laqm", - /* 156: 0 */ "double_laqm_raqm", - /* 157: 0 */ "double_raqm_laqm", - /* 158: 0 */ "single_lqm_rqm", - /* 159: 0 */ "single_9qm_lqm", - /* 160: 0 */ "single_9qm_rqm", - /* 161: 0 */ "single_rqm_9qm", - /* 162: 0 */ "double_lqm_rqm", - /* 163: 0 */ "double_9qm_lqm", - /* 164: 0 */ "double_9qm_rqm", - /* 165: 0 */ "double_rqm_9qm", - /* 166: 0 */ "more_keys_for_single_quote", - /* 167: 0 */ "more_keys_for_double_quote", - /* 168: 0 */ "more_keys_for_tablet_double_quote", - /* 169: 0 */ "emoji_key_as_more_key", + /* 98: 2 */ "keyhintlabel_for_tablet_comma", + /* 99: 2 */ "more_keys_for_tablet_comma", + /* 100: 2 */ "keyhintlabel_for_period", + /* 101: 2 */ "more_keys_for_period", + /* 102: 2 */ "keyhintlabel_for_tablet_period", + /* 103: 2 */ "keylabel_for_symbols_question", + /* 104: 2 */ "keylabel_for_symbols_semicolon", + /* 105: 2 */ "keylabel_for_symbols_percent", + /* 106: 2 */ "more_keys_for_symbols_semicolon", + /* 107: 2 */ "more_keys_for_symbols_percent", + /* 108: 1 */ "more_keys_for_v", + /* 109: 1 */ "more_keys_for_j", + /* 110: 1 */ "more_keys_for_cyrillic_ka", + /* 111: 1 */ "more_keys_for_cyrillic_a", + /* 112: 1 */ "more_keys_for_east_slavic_row2_11", + /* 113: 1 */ "more_keys_for_currency_dollar", + /* 114: 1 */ "more_keys_for_tablet_punctuation", + /* 115: 1 */ "more_keys_for_plus", + /* 116: 1 */ "more_keys_for_less_than", + /* 117: 1 */ "more_keys_for_greater_than", + /* 118: 1 */ "keylabel_for_period", + /* 119: 1 */ "keylabel_for_tablet_period", + /* 120: 1 */ "more_keys_for_exclamation", + /* 121: 1 */ "more_keys_for_q", + /* 122: 1 */ "more_keys_for_x", + /* 123: 1 */ "keylabel_for_q", + /* 124: 1 */ "keylabel_for_w", + /* 125: 1 */ "keylabel_for_y", + /* 126: 1 */ "keylabel_for_x", + /* 127: 0 */ "more_keys_for_currency", + /* 128: 0 */ "more_keys_for_symbols_1", + /* 129: 0 */ "more_keys_for_symbols_2", + /* 130: 0 */ "more_keys_for_symbols_3", + /* 131: 0 */ "more_keys_for_symbols_4", + /* 132: 0 */ "more_keys_for_symbols_5", + /* 133: 0 */ "more_keys_for_symbols_6", + /* 134: 0 */ "more_keys_for_symbols_7", + /* 135: 0 */ "more_keys_for_symbols_8", + /* 136: 0 */ "more_keys_for_symbols_9", + /* 137: 0 */ "more_keys_for_symbols_0", + /* 138: 0 */ "more_keys_for_am_pm", + /* 139: 0 */ "settings_as_more_key", + /* 140: 0 */ "shortcut_as_more_key", + /* 141: 0 */ "action_next_as_more_key", + /* 142: 0 */ "action_previous_as_more_key", + /* 143: 0 */ "label_to_more_symbol_key", + /* 144: 0 */ "label_to_more_symbol_for_tablet_key", + /* 145: 0 */ "label_to_phone_numeric_key", + /* 146: 0 */ "label_to_phone_symbols_key", + /* 147: 0 */ "label_time_am", + /* 148: 0 */ "label_time_pm", + /* 149: 0 */ "keylabel_for_popular_domain", + /* 150: 0 */ "more_keys_for_popular_domain", + /* 151: 0 */ "keyspecs_for_left_parenthesis_more_keys", + /* 152: 0 */ "keyspecs_for_right_parenthesis_more_keys", + /* 153: 0 */ "single_laqm_raqm", + /* 154: 0 */ "single_raqm_laqm", + /* 155: 0 */ "double_laqm_raqm", + /* 156: 0 */ "double_raqm_laqm", + /* 157: 0 */ "single_lqm_rqm", + /* 158: 0 */ "single_9qm_lqm", + /* 159: 0 */ "single_9qm_rqm", + /* 160: 0 */ "single_rqm_9qm", + /* 161: 0 */ "double_lqm_rqm", + /* 162: 0 */ "double_9qm_lqm", + /* 163: 0 */ "double_9qm_rqm", + /* 164: 0 */ "double_rqm_9qm", + /* 165: 0 */ "more_keys_for_single_quote", + /* 166: 0 */ "more_keys_for_double_quote", + /* 167: 0 */ "more_keys_for_tablet_double_quote", + /* 168: 0 */ "emoji_key_as_more_key", }; private static final String EMPTY = ""; @@ -256,26 +255,22 @@ public final class KeyboardTextsTable { /* Default texts */ private static final String[] LANGUAGE_DEFAULT = { /* more_keys_for_a ~ */ - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, - /* ~ more_keys_for_i */ + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_lqm_rqm", + /* more_keys_for_n */ EMPTY, /* single_quotes */ "!text/single_lqm_rqm", - /* more_keys_for_c ~ */ - EMPTY, EMPTY, EMPTY, - /* ~ more_keys_for_n */ // Label for "switch to alphabetic" key. /* label_to_alpha_key */ "ABC", - /* more_keys_for_y ~ */ - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* more_keys_for_s ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, /* ~ more_keys_for_g */ /* single_angle_quotes */ "!text/single_laqm_raqm", /* double_angle_quotes */ "!text/double_laqm_raqm", /* keylabel_for_currency */ "$", /* more_keys_for_r ~ */ - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, - /* ~ more_keys_for_cyrillic_soft_sign */ - /* more_keys_for_punctuation */ "!fixedColumnOrder!8,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,!,\\,,?,&,\\%,+,\",-,:,',@", - /* more_keys_for_nordic_row2_11 */ EMPTY, + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ more_keys_for_nordic_row2_11 */ /* keylabel_for_symbols_1 */ "1", /* keylabel_for_symbols_2 */ "2", /* keylabel_for_symbols_3 */ "3", @@ -294,6 +289,7 @@ public final class KeyboardTextsTable { /* additional_more_keys_for_symbols_1 ~ */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, /* ~ additional_more_keys_for_symbols_0 */ + /* more_keys_for_punctuation */ "!autoColumnOrder!8,\\,,?,!,#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,',@,:,-,\",+,\\%,&", // U+2020: "†" DAGGER // U+2021: "‡" DOUBLE DAGGER // U+2605: "★" BLACK STAR @@ -341,8 +337,8 @@ public final class KeyboardTextsTable { /* more_keys_for_arabic_diacritics */ EMPTY, // Comma key /* keylabel_for_comma */ ",", - /* more_keys_for_comma ~ */ - EMPTY, EMPTY, EMPTY, EMPTY, + /* keyhintlabel_for_tablet_comma ~ */ + EMPTY, EMPTY, EMPTY, /* ~ keyhintlabel_for_period */ /* more_keys_for_period */ "!text/more_keys_for_punctuation", /* keyhintlabel_for_tablet_period */ EMPTY, @@ -361,7 +357,7 @@ public final class KeyboardTextsTable { // U+00A5: "¥" YEN SIGN // U+20B1: "₱" PESO SIGN /* more_keys_for_currency_dollar */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1", - /* more_keys_for_tablet_punctuation */ "!fixedColumnOrder!7,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,',\\,,&,\\%,+,\",-,:,@", + /* more_keys_for_tablet_punctuation */ "!autoColumnOrder!7,\\,,',#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,@,:,-,\",+,\\%,&", // U+00B1: "±" PLUS-MINUS SIGN /* more_keys_for_plus */ "\u00B1", /* more_keys_for_less_than */ "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote", @@ -507,13 +503,14 @@ public final class KeyboardTextsTable { // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON // U+0133: "ij" LATIN SMALL LIGATURE IJ /* more_keys_for_i */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133", - /* double_quotes ~ */ - null, null, null, null, - /* ~ more_keys_for_s */ + /* more_keys_for_c */ null, + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u00F1,\u0144", - /* label_to_alpha_key */ null, + /* single_quotes ~ */ + null, null, null, + /* ~ more_keys_for_s */ // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+0133: "ij" LATIN SMALL LIGATURE IJ /* more_keys_for_y */ "\u00FD,\u0133", @@ -522,20 +519,18 @@ public final class KeyboardTextsTable { /* Language ar: Arabic */ private static final String[] LANGUAGE_ar = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE // U+200C: ZERO WIDTH NON-JOINER // U+0628: "ب" ARABIC LETTER BEH // U+062C: "ج" ARABIC LETTER JEEM /* label_to_alpha_key */ "\u0623\u200C\u0628\u200C\u062C", - /* more_keys_for_y ~ */ + /* more_keys_for_s ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, - /* ~ more_keys_for_cyrillic_soft_sign */ - /* more_keys_for_punctuation */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(", - /* more_keys_for_nordic_row2_11 */ null, + null, null, null, null, null, null, null, null, + /* ~ more_keys_for_nordic_row2_11 */ // U+0661: "١" ARABIC-INDIC DIGIT ONE /* keylabel_for_symbols_1 */ "\u0661", // U+0662: "٢" ARABIC-INDIC DIGIT TWO @@ -574,6 +569,7 @@ public final class KeyboardTextsTable { // U+066B: "٫" ARABIC DECIMAL SEPARATOR // U+066C: "٬" ARABIC THOUSANDS SEPARATOR /* additional_more_keys_for_symbols_0 */ "0,\u066B,\u066C", + /* more_keys_for_punctuation */ null, // U+2605: "★" BLACK STAR // U+066D: "٭" ARABIC FIVE POINTED STAR /* more_keys_for_star */ "\u2605,\u066D", @@ -635,7 +631,6 @@ public final class KeyboardTextsTable { /* more_keys_for_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640", // U+060C: "،" ARABIC COMMA /* keylabel_for_comma */ "\u060C", - /* more_keys_for_comma */ "\\,", /* keyhintlabel_for_tablet_comma */ "\u061F", /* more_keys_for_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'", // U+0651: "ّ" ARABIC SHADDA @@ -680,19 +675,20 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u00E7,\u0107,\u010D", + /* double_quotes ~ */ + null, null, null, null, + /* ~ label_to_alpha_key */ // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA // U+00DF: "ß" LATIN SMALL LETTER SHARP S // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE // U+0161: "š" LATIN SMALL LETTER S WITH CARON /* more_keys_for_s */ "\u015F,\u00DF,\u015B,\u0161", - /* more_keys_for_n ~ */ - null, null, null, null, null, null, null, + /* more_keys_for_y ~ */ + null, null, null, null, null, /* ~ more_keys_for_l */ // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE /* more_keys_for_g */ "\u011F", @@ -701,20 +697,18 @@ public final class KeyboardTextsTable { /* Language be_BY: Belarusian (Belarus) */ private static final String[] LANGUAGE_be_BY = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c ~ */ - null, null, null, - /* ~ more_keys_for_n */ // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_k */ // U+0451: "ё" CYRILLIC SMALL LETTER IO /* more_keys_for_cyrillic_ie */ "\u0451", @@ -736,13 +730,12 @@ public final class KeyboardTextsTable { /* Language bg: Bulgarian */ private static final String[] LANGUAGE_bg = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ // single_quotes of Bulgarian is default single_quotes_right_left. /* double_quotes */ "!text/double_9qm_lqm", - /* single_quotes ~ */ - null, null, null, null, - /* ~ more_keys_for_n */ + /* more_keys_for_n */ null, + /* single_quotes */ null, // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE @@ -794,41 +787,39 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u00E7,\u0107,\u010D", - /* more_keys_for_s */ null, + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u00F1,\u0144", - /* label_to_alpha_key ~ */ - null, null, null, null, null, + /* single_quotes ~ */ + null, null, null, null, null, null, null, /* ~ more_keys_for_t */ // U+00B7: "·" MIDDLE DOT // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE /* more_keys_for_l */ "l\u00B7l,\u0142", /* more_keys_for_g ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, - /* ~ more_keys_for_cyrillic_soft_sign */ - // U+00B7: "·" MIDDLE DOT - /* more_keys_for_punctuation */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@", - /* more_keys_for_nordic_row2_11 ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, + /* ~ additional_more_keys_for_symbols_0 */ + // U+00B7: "·" MIDDLE DOT + /* more_keys_for_punctuation */ "!autoColumnOrder!9,\\,,?,!,\u00B7,#,),(,/,;,',@,:,-,\",+,\\%,&", + /* more_keys_for_star ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, /* ~ more_keys_for_swiss_row2_11 */ // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA /* keylabel_for_spanish_row2_10 */ "\u00E7", /* more_keys_for_bullet ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, + null, null, null, null, null, null, /* ~ more_keys_for_currency_dollar */ - /* more_keys_for_tablet_punctuation */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@", + /* more_keys_for_tablet_punctuation */ "!autoColumnOrder!8,\\,,',\u00B7,#,),(,/,;,@,:,-,\",+,\\%,&", }; /* Language cs: Czech */ @@ -874,21 +865,21 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B", - /* double_quotes */ "!text/double_9qm_lqm", - /* single_quotes */ "!text/single_9qm_lqm", // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE /* more_keys_for_c */ "\u010D,\u00E7,\u0107", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - /* more_keys_for_s */ "\u0161,\u00DF,\u015B", + /* double_quotes */ "!text/double_9qm_lqm", // U+0148: "ň" LATIN SMALL LETTER N WITH CARON // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u0148,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", /* label_to_alpha_key */ null, + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + /* more_keys_for_s */ "\u0161,\u00DF,\u015B", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -937,17 +928,17 @@ public final class KeyboardTextsTable { // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS /* more_keys_for_i */ "\u00ED,\u00EF", + /* more_keys_for_c */ null, /* double_quotes */ "!text/double_9qm_lqm", + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* more_keys_for_n */ "\u00F1,\u0144", /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c */ null, + /* label_to_alpha_key */ null, // U+00DF: "ß" LATIN SMALL LETTER SHARP S // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE // U+0161: "š" LATIN SMALL LETTER S WITH CARON /* more_keys_for_s */ "\u00DF,\u015B,\u0161", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* more_keys_for_n */ "\u00F1,\u0144", - /* label_to_alpha_key */ null, // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -972,8 +963,8 @@ public final class KeyboardTextsTable { // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS /* more_keys_for_nordic_row2_10 */ "\u00E4", /* keylabel_for_east_slavic_row1_9 ~ */ - null, null, null, null, null, null, - /* ~ more_keys_for_punctuation */ + null, null, null, null, null, + /* ~ more_keys_for_cyrillic_soft_sign */ // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS /* more_keys_for_nordic_row2_11 */ "\u00F6", }; @@ -1011,18 +1002,19 @@ public final class KeyboardTextsTable { // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117", /* more_keys_for_i */ null, + /* more_keys_for_c */ null, /* double_quotes */ "!text/double_9qm_lqm", + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* more_keys_for_n */ "\u00F1,\u0144", /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c */ null, + /* label_to_alpha_key */ null, // U+00DF: "ß" LATIN SMALL LETTER SHARP S // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE // U+0161: "š" LATIN SMALL LETTER S WITH CARON /* more_keys_for_s */ "\u00DF,\u015B,\u0161", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* more_keys_for_n */ "\u00F1,\u0144", - /* label_to_alpha_key ~ */ - null, null, null, null, null, null, null, + /* more_keys_for_y ~ */ + null, null, null, null, null, null, /* ~ more_keys_for_g */ /* single_angle_quotes */ "!text/single_raqm_laqm", /* double_angle_quotes */ "!text/double_raqm_laqm", @@ -1050,8 +1042,8 @@ public final class KeyboardTextsTable { /* Language el: Greek */ private static final String[] LANGUAGE_el = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0391: "Α" GREEK CAPITAL LETTER ALPHA // U+0392: "Β" GREEK CAPITAL LETTER BETA @@ -1097,14 +1089,15 @@ public final class KeyboardTextsTable { // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE /* more_keys_for_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA /* more_keys_for_c */ "\u00E7", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* more_keys_for_s */ "\u00DF", + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE /* more_keys_for_n */ "\u00F1", + /* single_quotes */ null, + /* label_to_alpha_key */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* more_keys_for_s */ "\u00DF", }; /* Language eo: Esperanto */ @@ -1162,19 +1155,12 @@ public final class KeyboardTextsTable { // U+0131: "ı" LATIN SMALL LETTER DOTLESS I // U+0133: "ij" LATIN SMALL LIGATURE IJ /* more_keys_for_i */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133", - /* double_quotes */ null, - /* single_quotes */ null, // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE /* more_keys_for_c */ "\u0107,\u010D,\u00E7,\u010B", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* more_keys_for_s */ "\u00DF,\u0161,\u015B,\u0219,\u015F", + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA @@ -1182,7 +1168,14 @@ public final class KeyboardTextsTable { // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE // U+014B: "ŋ" LATIN SMALL LETTER ENG /* more_keys_for_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B", + /* single_quotes */ null, /* label_to_alpha_key */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* more_keys_for_s */ "\u00DF,\u0161,\u015B,\u0219,\u015F", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS @@ -1240,7 +1233,6 @@ public final class KeyboardTextsTable { /* keylabel_for_spanish_row2_10 */ "\u0135", /* more_keys_for_bullet ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, /* ~ more_keys_for_symbols_percent */ // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX /* more_keys_for_v */ "w,\u0175", @@ -1303,23 +1295,23 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u00E7,\u0107,\u010D", - /* more_keys_for_s */ null, + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u00F1,\u0144", - /* label_to_alpha_key ~ */ + /* single_quotes ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, - /* ~ more_keys_for_cyrillic_soft_sign */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, + /* ~ additional_more_keys_for_symbols_0 */ // U+00A1: "¡" INVERTED EXCLAMATION MARK // U+00BF: "¿" INVERTED QUESTION MARK - /* more_keys_for_punctuation */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@", + /* more_keys_for_punctuation */ "!autoColumnOrder!9,\\,,?,!,#,),(,/,;,\u00A1,',@,:,-,\",+,\\%,&,\u00BF", }; /* Language et_EE: Estonian (Estonia) */ @@ -1369,22 +1361,22 @@ public final class KeyboardTextsTable { // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS // U+0131: "ı" LATIN SMALL LETTER DOTLESS I /* more_keys_for_i */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131", - /* double_quotes */ "!text/double_9qm_lqm", - /* single_quotes */ "!text/single_9qm_lqm", // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE /* more_keys_for_c */ "\u010D,\u00E7,\u0107", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", + /* double_quotes */ "!text/double_9qm_lqm", // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", /* label_to_alpha_key */ null, + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -1425,30 +1417,79 @@ public final class KeyboardTextsTable { /* more_keys_for_nordic_row2_10 */ "\u00F5", }; + /* Language eu_ES: Basque (Spain) */ + private static final String[] LANGUAGE_eu_ES = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* more_keys_for_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* more_keys_for_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* more_keys_for_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* more_keys_for_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* more_keys_for_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* more_keys_for_n */ "\u00F1,\u0144", + }; + /* Language fa: Persian */ private static final String[] LANGUAGE_fa = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0627: "ا" ARABIC LETTER ALEF // U+200C: ZERO WIDTH NON-JOINER // U+0628: "ب" ARABIC LETTER BEH // U+067E: "پ" ARABIC LETTER PEH /* label_to_alpha_key */ "\u0627\u200C\u0628\u200C\u067E", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+FDFC: "﷼" RIAL SIGN /* keylabel_for_currency */ "\uFDFC", /* more_keys_for_r ~ */ - null, null, null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_cyrillic_soft_sign */ - // U+061F: "؟" ARABIC QUESTION MARK - // U+060C: "،" ARABIC COMMA - // U+061B: "؛" ARABIC SEMICOLON - /* more_keys_for_punctuation */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis", - /* more_keys_for_nordic_row2_11 */ null, + null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ more_keys_for_nordic_row2_11 */ // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE /* keylabel_for_symbols_1 */ "\u06F1", // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO @@ -1487,6 +1528,7 @@ public final class KeyboardTextsTable { // U+066B: "٫" ARABIC DECIMAL SEPARATOR // U+066C: "٬" ARABIC THOUSANDS SEPARATOR /* additional_more_keys_for_symbols_0 */ "0,\u066B,\u066C", + /* more_keys_for_punctuation */ null, // U+2605: "★" BLACK STAR // U+066D: "٭" ARABIC FIVE POINTED STAR /* more_keys_for_star */ "\u2605,\u066D", @@ -1544,7 +1586,6 @@ public final class KeyboardTextsTable { /* more_keys_for_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640", // U+060C: "،" ARABIC COMMA /* keylabel_for_comma */ "\u060C", - /* more_keys_for_comma */ "\\,", /* keyhintlabel_for_tablet_comma */ "\u061F", /* more_keys_for_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote", // U+064B: "ً" ARABIC FATHATAN @@ -1591,15 +1632,14 @@ public final class KeyboardTextsTable { // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS /* more_keys_for_u */ "\u00FC", /* more_keys_for_e ~ */ - null, null, null, null, null, - /* ~ more_keys_for_c */ + null, null, null, null, null, null, null, + /* ~ label_to_alpha_key */ // U+0161: "š" LATIN SMALL LETTER S WITH CARON // U+00DF: "ß" LATIN SMALL LETTER SHARP S // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE /* more_keys_for_s */ "\u0161,\u00DF,\u015B", - /* more_keys_for_n ~ */ - null, null, null, null, - /* ~ more_keys_for_d */ + /* more_keys_for_y */ null, + /* more_keys_for_d */ null, // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE @@ -1616,8 +1656,8 @@ public final class KeyboardTextsTable { // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE /* more_keys_for_nordic_row2_10 */ "\u00F8", /* keylabel_for_east_slavic_row1_9 ~ */ - null, null, null, null, null, null, - /* ~ more_keys_for_punctuation */ + null, null, null, null, null, + /* ~ more_keys_for_cyrillic_soft_sign */ // U+00E6: "æ" LATIN SMALL LETTER AE /* more_keys_for_nordic_row2_11 */ "\u00E6", }; @@ -1665,15 +1705,13 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* more_keys_for_c */ "\u00E7,\u0107,\u010D", - /* more_keys_for_s ~ */ - null, null, null, - /* ~ label_to_alpha_key */ + /* more_keys_for_c */ "\u00E7,%,\u0107,\u010D", + /* double_quotes ~ */ + null, null, null, null, null, + /* ~ more_keys_for_s */ // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "%,\u00FF", /* more_keys_for_d ~ */ @@ -1697,23 +1735,77 @@ public final class KeyboardTextsTable { /* more_keys_for_swiss_row2_11 */ "\u00E4", }; + /* Language gl_ES: Gallegan (Spain) */ + private static final String[] LANGUAGE_gl_ES = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* more_keys_for_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* more_keys_for_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* more_keys_for_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* more_keys_for_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* more_keys_for_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* more_keys_for_n */ "\u00F1,\u0144", + }; + /* Language hi: Hindi */ private static final String[] LANGUAGE_hi = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0915: "क" DEVANAGARI LETTER KA // U+0916: "ख" DEVANAGARI LETTER KHA // U+0917: "ग" DEVANAGARI LETTER GA /* label_to_alpha_key */ "\u0915\u0916\u0917", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+20B9: "₹" INDIAN RUPEE SIGN /* keylabel_for_currency */ "\u20B9", /* more_keys_for_r ~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_nordic_row2_11 */ // U+0967: "१" DEVANAGARI DIGIT ONE /* keylabel_for_symbols_1 */ "\u0967", @@ -1757,20 +1849,20 @@ public final class KeyboardTextsTable { /* more_keys_for_a ~ */ null, null, null, null, null, /* ~ more_keys_for_i */ - /* double_quotes */ "!text/double_9qm_rqm", - /* single_quotes */ "!text/single_9qm_rqm", // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA /* more_keys_for_c */ "\u010D,\u0107,\u00E7", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* more_keys_for_s */ "\u0161,\u015B,\u00DF", + /* double_quotes */ "!text/double_9qm_rqm", // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_rqm", /* label_to_alpha_key */ null, + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* more_keys_for_s */ "\u0161,\u015B,\u00DF", /* more_keys_for_y */ null, // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE /* more_keys_for_d */ "\u0111", @@ -1828,10 +1920,12 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B", + /* more_keys_for_c */ null, /* double_quotes */ "!text/double_9qm_rqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_rqm", - /* more_keys_for_c ~ */ - null, null, null, null, null, null, null, null, null, null, + /* label_to_alpha_key ~ */ + null, null, null, null, null, null, null, null, /* ~ more_keys_for_g */ /* single_angle_quotes */ "!text/single_raqm_laqm", /* double_angle_quotes */ "!text/double_raqm_laqm", @@ -1840,30 +1934,31 @@ public final class KeyboardTextsTable { /* Language hy_AM: Armenian (Armenia) */ private static final String[] LANGUAGE_hy_AM = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0531: "Ա" ARMENIAN CAPITAL LETTER AYB // U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN // U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM /* label_to_alpha_key */ "\u0531\u0532\u0533", - /* more_keys_for_y ~ */ + /* more_keys_for_s ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, - /* ~ more_keys_for_cyrillic_soft_sign */ - // U+058A: "֊" ARMENIAN HYPHEN - // U+055C: "՜" ARMENIAN EXCLAMATION MARK - // U+055D: "՝" ARMENIAN COMMA + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ additional_more_keys_for_symbols_0 */ // U+055E: "՞" ARMENIAN QUESTION MARK - // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING + // U+055C: "՜" ARMENIAN EXCLAMATION MARK // U+055A: "՚" ARMENIAN APOSTROPHE + // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING + // U+055D: "՝" ARMENIAN COMMA // U+055B: "՛" ARMENIAN EMPHASIS MARK + // U+058A: "֊" ARMENIAN HYPHEN + // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK // U+055F: "՟" ARMENIAN ABBREVIATION MARK - /* more_keys_for_punctuation */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B", - /* more_keys_for_nordic_row2_11 ~ */ + /* more_keys_for_punctuation */ "!autoColumnOrder!8,\\,,\u055E,\u055C,.,\u055A,\u0559,?,!,\u055D,\u055B,\u058A,\u00BB,\u00AB,\u055F,;,:", + /* more_keys_for_star ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, /* ~ keyspec_right_single_angle_quote */ // U+058F: "֏" ARMENIAN DRAM SIGN // TODO: Enable this when we have glyph for the following letter @@ -1878,7 +1973,7 @@ public final class KeyboardTextsTable { /* more_keys_for_h ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_greater_than */ // U+0589: "։" ARMENIAN FULL STOP /* keylabel_for_period */ "\u0589", @@ -1929,11 +2024,12 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B", + /* more_keys_for_c */ null, /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c ~ */ - null, null, null, null, - /* ~ label_to_alpha_key */ + /* label_to_alpha_key */ null, + /* more_keys_for_s */ null, // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -1992,20 +2088,18 @@ public final class KeyboardTextsTable { /* Language iw: Hebrew */ private static final String[] LANGUAGE_iw = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_rqm_9qm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_rqm_9qm", - /* more_keys_for_c ~ */ - null, null, null, - /* ~ more_keys_for_n */ // Label for "switch to alphabetic" key. // U+05D0: "א" HEBREW LETTER ALEF // U+05D1: "ב" HEBREW LETTER BET // U+05D2: "ג" HEBREW LETTER GIMEL /* label_to_alpha_key */ "\u05D0\u05D1\u05D2", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+20AA: "₪" NEW SHEQEL SIGN /* keylabel_for_currency */ "\u20AA", @@ -2013,7 +2107,7 @@ public final class KeyboardTextsTable { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~ additional_more_keys_for_symbols_0 */ + /* ~ more_keys_for_punctuation */ // U+2605: "★" BLACK STAR /* more_keys_for_star */ "\u2605", // The all letters need to be mirrored are found at @@ -2041,7 +2135,7 @@ public final class KeyboardTextsTable { /* keylabel_for_tablet_comma ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_tablet_punctuation */ // U+00B1: "±" PLUS-MINUS SIGN // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN @@ -2051,13 +2145,11 @@ public final class KeyboardTextsTable { /* Language ka_GE: Georgian (Georgia) */ private static final String[] LANGUAGE_ka_GE = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c ~ */ - null, null, null, - /* ~ more_keys_for_n */ // Label for "switch to alphabetic" key. // U+10D0: "ა" GEORGIAN LETTER AN // U+10D1: "ბ" GEORGIAN LETTER BAN @@ -2068,15 +2160,15 @@ public final class KeyboardTextsTable { /* Language kk: Kazakh */ private static final String[] LANGUAGE_kk = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_k */ // U+0451: "ё" CYRILLIC SMALL LETTER IO /* more_keys_for_cyrillic_ie */ "\u0451", @@ -2093,7 +2185,7 @@ public final class KeyboardTextsTable { /* keylabel_for_east_slavic_row3_5 */ "\u0438", // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN /* more_keys_for_cyrillic_soft_sign */ "\u044A", - /* more_keys_for_punctuation ~ */ + /* more_keys_for_nordic_row2_11 ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, @@ -2111,7 +2203,7 @@ public final class KeyboardTextsTable { /* more_keys_for_cyrillic_o */ "\u04E9", /* keylabel_for_south_slavic_row1_6 ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_j */ // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER /* more_keys_for_cyrillic_ka */ "\u049B", @@ -2124,14 +2216,14 @@ public final class KeyboardTextsTable { /* Language km_KH: Khmer (Cambodia) */ private static final String[] LANGUAGE_km_KH = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+1780: "ក" KHMER LETTER KA // U+1781: "ខ" KHMER LETTER KHA // U+1782: "គ" KHMER LETTER KO /* label_to_alpha_key */ "\u1780\u1781\u1782", - /* more_keys_for_y ~ */ + /* more_keys_for_s ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, @@ -2147,15 +2239,15 @@ public final class KeyboardTextsTable { /* Language ky: Kirghiz */ private static final String[] LANGUAGE_ky = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_k */ // U+0451: "ё" CYRILLIC SMALL LETTER IO /* more_keys_for_cyrillic_ie */ "\u0451", @@ -2172,7 +2264,7 @@ public final class KeyboardTextsTable { /* keylabel_for_east_slavic_row3_5 */ "\u0438", // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN /* more_keys_for_cyrillic_soft_sign */ "\u044A", - /* more_keys_for_punctuation ~ */ + /* more_keys_for_nordic_row2_11 ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, @@ -2190,15 +2282,15 @@ public final class KeyboardTextsTable { /* Language lo_LA: Lao (Laos) */ private static final String[] LANGUAGE_lo_LA = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0E81: "ກ" LAO LETTER KO // U+0E82: "ຂ" LAO LETTER KHO SUNG // U+0E84: "ຄ" LAO LETTER KHO TAM /* label_to_alpha_key */ "\u0E81\u0E82\u0E84", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+20AD: "₭" KIP SIGN /* keylabel_for_currency */ "\u20AD", @@ -2252,22 +2344,22 @@ public final class KeyboardTextsTable { // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS // U+0131: "ı" LATIN SMALL LETTER DOTLESS I /* more_keys_for_i */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131", - /* double_quotes */ "!text/double_9qm_lqm", - /* single_quotes */ "!text/single_9qm_lqm", // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE /* more_keys_for_c */ "\u010D,\u00E7,\u0107", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", + /* double_quotes */ "!text/double_9qm_lqm", // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", /* label_to_alpha_key */ null, + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -2346,22 +2438,22 @@ public final class KeyboardTextsTable { // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS // U+0131: "ı" LATIN SMALL LETTER DOTLESS I /* more_keys_for_i */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131", - /* double_quotes */ "!text/double_9qm_lqm", - /* single_quotes */ "!text/single_9qm_lqm", // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE /* more_keys_for_c */ "\u010D,\u00E7,\u0107", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", + /* double_quotes */ "!text/double_9qm_lqm", // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", /* label_to_alpha_key */ null, + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -2396,20 +2488,18 @@ public final class KeyboardTextsTable { /* Language mk: Macedonian */ private static final String[] LANGUAGE_mk = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c ~ */ - null, null, null, - /* ~ more_keys_for_n */ // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_k */ // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE /* more_keys_for_cyrillic_ie */ "\u0450", @@ -2434,20 +2524,32 @@ public final class KeyboardTextsTable { /* Language mn_MN: Mongolian (Mongolia) */ private static final String[] LANGUAGE_mn_MN = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+20AE: "₮" TUGRIK SIGN /* keylabel_for_currency */ "\u20AE", }; + /* Language my_MM: Burmese (Myanmar) */ + private static final String[] LANGUAGE_my_MM = { + /* more_keys_for_a ~ */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ + // Label for "switch to alphabetic" key. + // U+1000: "က" MYANMAR LETTER KA + // U+1001: "ခ" MYANMAR LETTER KHA + // U+1002: "ဂ" MYANMAR LETTER GA + /* label_to_alpha_key */ "\u1000\u1001\u1002", + }; + /* Language nb: Norwegian Bokmål */ private static final String[] LANGUAGE_nb = { // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE @@ -2480,11 +2582,12 @@ public final class KeyboardTextsTable { // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON /* more_keys_for_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", /* more_keys_for_i */ null, + /* more_keys_for_c */ null, /* double_quotes */ "!text/double_9qm_rqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_rqm", - /* more_keys_for_c ~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, + /* label_to_alpha_key ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_cyrillic_ie */ // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE /* keylabel_for_nordic_row1_11 */ "\u00E5", @@ -2495,8 +2598,8 @@ public final class KeyboardTextsTable { // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS /* more_keys_for_nordic_row2_10 */ "\u00F6", /* keylabel_for_east_slavic_row1_9 ~ */ - null, null, null, null, null, null, - /* ~ more_keys_for_punctuation */ + null, null, null, null, null, + /* ~ more_keys_for_cyrillic_soft_sign */ // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS /* more_keys_for_nordic_row2_11 */ "\u00E4", }; @@ -2504,20 +2607,20 @@ public final class KeyboardTextsTable { /* Language ne_NP: Nepali (Nepal) */ private static final String[] LANGUAGE_ne_NP = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0915: "क" DEVANAGARI LETTER KA // U+0916: "ख" DEVANAGARI LETTER KHA // U+0917: "ग" DEVANAGARI LETTER GA /* label_to_alpha_key */ "\u0915\u0916\u0917", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN /* keylabel_for_currency */ "\u0930\u0941.", /* more_keys_for_r ~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_nordic_row2_11 */ // U+0967: "१" DEVANAGARI DIGIT ONE /* keylabel_for_symbols_1 */ "\u0967", @@ -2598,14 +2701,14 @@ public final class KeyboardTextsTable { // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON // U+0133: "ij" LATIN SMALL LIGATURE IJ /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133", - /* double_quotes */ "!text/double_9qm_rqm", - /* single_quotes */ "!text/single_9qm_rqm", /* more_keys_for_c */ null, - /* more_keys_for_s */ null, + /* double_quotes */ "!text/double_9qm_rqm", // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_rqm", /* label_to_alpha_key */ null, + /* more_keys_for_s */ null, // U+0133: "ij" LATIN SMALL LIGATURE IJ /* more_keys_for_y */ "\u0133", }; @@ -2641,22 +2744,22 @@ public final class KeyboardTextsTable { // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON /* more_keys_for_e */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113", /* more_keys_for_i */ null, - /* double_quotes */ "!text/double_9qm_rqm", - /* single_quotes */ "!text/single_9qm_rqm", // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u0107,\u00E7,\u010D", + /* double_quotes */ "!text/double_9qm_rqm", + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + /* more_keys_for_n */ "\u0144,\u00F1", + /* single_quotes */ "!text/single_9qm_rqm", + /* label_to_alpha_key */ null, // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE // U+00DF: "ß" LATIN SMALL LETTER SHARP S // U+0161: "š" LATIN SMALL LETTER S WITH CARON /* more_keys_for_s */ "\u015B,\u00DF,\u0161", - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - /* more_keys_for_n */ "\u0144,\u00F1", - /* label_to_alpha_key ~ */ - null, null, null, - /* ~ more_keys_for_d */ + /* more_keys_for_y */ null, + /* more_keys_for_d */ null, // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON @@ -2708,8 +2811,6 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE @@ -2751,16 +2852,18 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", + /* more_keys_for_c */ null, /* double_quotes */ "!text/double_9qm_rqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_rqm", - /* more_keys_for_c */ null, + /* label_to_alpha_key */ null, // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW // U+00DF: "ß" LATIN SMALL LETTER SHARP S // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE // U+0161: "š" LATIN SMALL LETTER S WITH CARON /* more_keys_for_s */ "\u0219,\u00DF,\u015B,\u0161", - /* more_keys_for_n ~ */ - null, null, null, null, null, + /* more_keys_for_y ~ */ + null, null, null, /* ~ more_keys_for_z */ // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW /* more_keys_for_t */ "\u021B", @@ -2769,20 +2872,18 @@ public final class KeyboardTextsTable { /* Language ru: Russian */ private static final String[] LANGUAGE_ru = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c ~ */ - null, null, null, - /* ~ more_keys_for_n */ // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, /* ~ more_keys_for_k */ // U+0451: "ё" CYRILLIC SMALL LETTER IO /* more_keys_for_cyrillic_ie */ "\u0451", @@ -2848,23 +2949,23 @@ public final class KeyboardTextsTable { // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS // U+0131: "ı" LATIN SMALL LETTER DOTLESS I /* more_keys_for_i */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131", - /* double_quotes */ "!text/double_9qm_lqm", - /* single_quotes */ "!text/single_9qm_lqm", // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE /* more_keys_for_c */ "\u010D,\u00E7,\u0107", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", + /* double_quotes */ "!text/double_9qm_lqm", // U+0148: "ň" LATIN SMALL LETTER N WITH CARON // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u0148,\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", /* label_to_alpha_key */ null, + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* more_keys_for_s */ "\u0161,\u00DF,\u015B,\u015F", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -2901,16 +3002,16 @@ public final class KeyboardTextsTable { /* more_keys_for_a ~ */ null, null, null, null, null, /* ~ more_keys_for_i */ - /* double_quotes */ "!text/double_9qm_lqm", - /* single_quotes */ "!text/single_9qm_lqm", // U+010D: "č" LATIN SMALL LETTER C WITH CARON // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE /* more_keys_for_c */ "\u010D,\u0107", + /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + /* label_to_alpha_key */ null, // U+0161: "š" LATIN SMALL LETTER S WITH CARON /* more_keys_for_s */ "\u0161", - /* more_keys_for_n ~ */ - null, null, null, - /* ~ more_keys_for_y */ + /* more_keys_for_y */ null, // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE /* more_keys_for_d */ "\u0111", // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON @@ -2925,21 +3026,19 @@ public final class KeyboardTextsTable { /* Language sr: Serbian */ private static final String[] LANGUAGE_sr = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c ~ */ - null, null, null, - /* ~ more_keys_for_n */ // END: More keys definitions for Serbian (Cyrillic) // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, /* ~ more_keys_for_g */ /* single_angle_quotes */ "!text/single_raqm_laqm", /* double_angle_quotes */ "!text/double_raqm_laqm", @@ -3015,22 +3114,22 @@ public final class KeyboardTextsTable { // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS /* more_keys_for_i */ "\u00ED,\u00EC,\u00EE,\u00EF", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u00E7,\u0107,\u010D", - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* more_keys_for_s */ "\u015B,\u0161,\u015F,\u00DF", + /* double_quotes */ null, // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0148: "ň" LATIN SMALL LETTER N WITH CARON /* more_keys_for_n */ "\u0144,\u00F1,\u0148", + /* single_quotes */ null, /* label_to_alpha_key */ null, + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* more_keys_for_s */ "\u015B,\u0161,\u015F,\u00DF", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS /* more_keys_for_y */ "\u00FD,\u00FF", @@ -3064,8 +3163,8 @@ public final class KeyboardTextsTable { // U+0153: "œ" LATIN SMALL LIGATURE OE /* more_keys_for_nordic_row2_10 */ "\u00F8,\u0153", /* keylabel_for_east_slavic_row1_9 ~ */ - null, null, null, null, null, null, - /* ~ more_keys_for_punctuation */ + null, null, null, null, null, + /* ~ more_keys_for_cyrillic_soft_sign */ // U+00E6: "æ" LATIN SMALL LETTER AE /* more_keys_for_nordic_row2_11 */ "\u00E6", }; @@ -3109,16 +3208,17 @@ public final class KeyboardTextsTable { // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE /* more_keys_for_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA /* more_keys_for_c */ "\u00E7", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* more_keys_for_s */ "\u00DF", + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE /* more_keys_for_n */ "\u00F1", - /* label_to_alpha_key ~ */ - null, null, null, null, null, null, + /* single_quotes */ null, + /* label_to_alpha_key */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* more_keys_for_s */ "\u00DF", + /* more_keys_for_y ~ */ + null, null, null, null, null, /* ~ more_keys_for_l */ /* more_keys_for_g */ "g\'", }; @@ -3126,15 +3226,15 @@ public final class KeyboardTextsTable { /* Language th: Thai */ private static final String[] LANGUAGE_th = { /* more_keys_for_a ~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~ more_keys_for_n */ + null, null, null, null, null, null, null, null, null, + /* ~ single_quotes */ // Label for "switch to alphabetic" key. // U+0E01: "ก" THAI CHARACTER KO KAI // U+0E02: "ข" THAI CHARACTER KHO KHAI // U+0E04: "ค" THAI CHARACTER KHO KHWAI /* label_to_alpha_key */ "\u0E01\u0E02\u0E04", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT /* keylabel_for_currency */ "\u0E3F", @@ -3184,13 +3284,11 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u00E7,\u0107,\u010D", - /* more_keys_for_s */ null, + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE /* more_keys_for_n */ "\u00F1,\u0144", @@ -3224,19 +3322,20 @@ public final class KeyboardTextsTable { // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON /* more_keys_for_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u00E7,\u0107,\u010D", + /* double_quotes ~ */ + null, null, null, null, + /* ~ label_to_alpha_key */ // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA // U+00DF: "ß" LATIN SMALL LETTER SHARP S // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE // U+0161: "š" LATIN SMALL LETTER S WITH CARON /* more_keys_for_s */ "\u015F,\u00DF,\u015B,\u0161", - /* more_keys_for_n ~ */ - null, null, null, null, null, null, null, + /* more_keys_for_y ~ */ + null, null, null, null, null, /* ~ more_keys_for_l */ // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE /* more_keys_for_g */ "\u011F", @@ -3245,20 +3344,18 @@ public final class KeyboardTextsTable { /* Language uk: Ukrainian */ private static final String[] LANGUAGE_uk = { /* more_keys_for_a ~ */ - null, null, null, null, null, - /* ~ more_keys_for_i */ + null, null, null, null, null, null, + /* ~ more_keys_for_c */ /* double_quotes */ "!text/double_9qm_lqm", + /* more_keys_for_n */ null, /* single_quotes */ "!text/single_9qm_lqm", - /* more_keys_for_c ~ */ - null, null, null, - /* ~ more_keys_for_n */ // Label for "switch to alphabetic" key. // U+0410: "А" CYRILLIC CAPITAL LETTER A // U+0411: "Б" CYRILLIC CAPITAL LETTER BE // U+0412: "В" CYRILLIC CAPITAL LETTER VE /* label_to_alpha_key */ "\u0410\u0411\u0412", - /* more_keys_for_y ~ */ - null, null, null, null, null, null, null, null, + /* more_keys_for_s ~ */ + null, null, null, null, null, null, null, null, null, /* ~ double_angle_quotes */ // U+20B4: "₴" HRYVNIA SIGN /* keylabel_for_currency */ "\u20B4", @@ -3275,7 +3372,7 @@ public final class KeyboardTextsTable { /* keylabel_for_east_slavic_row3_5 */ "\u0438", // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN /* more_keys_for_cyrillic_soft_sign */ "\u044A", - /* more_keys_for_punctuation ~ */ + /* more_keys_for_nordic_row2_11 ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, @@ -3355,9 +3452,9 @@ public final class KeyboardTextsTable { // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW /* more_keys_for_i */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB", - /* double_quotes ~ */ + /* more_keys_for_c ~ */ null, null, null, null, null, null, - /* ~ label_to_alpha_key */ + /* ~ more_keys_for_s */ // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE @@ -3412,14 +3509,15 @@ public final class KeyboardTextsTable { // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE /* more_keys_for_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA /* more_keys_for_c */ "\u00E7", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* more_keys_for_s */ "\u00DF", + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE /* more_keys_for_n */ "\u00F1", + /* single_quotes */ null, + /* label_to_alpha_key */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* more_keys_for_s */ "\u00DF", }; /* Language zz: Alphabet */ @@ -3480,21 +3578,13 @@ public final class KeyboardTextsTable { // U+0131: "ı" LATIN SMALL LETTER DOTLESS I // U+0133: "ij" LATIN SMALL LIGATURE IJ /* more_keys_for_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133", - /* double_quotes */ null, - /* single_quotes */ null, // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE // U+010D: "č" LATIN SMALL LETTER C WITH CARON /* more_keys_for_c */ "\u00E7,\u0107,\u0109,\u010B,\u010D", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+017F: "ſ" LATIN SMALL LETTER LONG S - /* more_keys_for_s */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F", + /* double_quotes */ null, // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA @@ -3502,7 +3592,15 @@ public final class KeyboardTextsTable { // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE // U+014B: "ŋ" LATIN SMALL LETTER ENG /* more_keys_for_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B", + /* single_quotes */ null, /* label_to_alpha_key */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+017F: "ſ" LATIN SMALL LETTER LONG S + /* more_keys_for_s */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F", // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS @@ -3555,7 +3653,7 @@ public final class KeyboardTextsTable { /* more_keys_for_cyrillic_u ~ */ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, + null, null, null, /* ~ more_keys_for_v */ // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX /* more_keys_for_j */ "\u0135", @@ -3565,60 +3663,63 @@ public final class KeyboardTextsTable { // Currently we are dropping the region from the key. private static final Object[] LANGUAGES_AND_TEXTS = { // "locale", TEXT_ARRAY, /* numberOfNonNullText/lengthOf_TEXT_ARRAY localeName */ - "DEFAULT", LANGUAGE_DEFAULT, /* 170/170 default */ + "DEFAULT", LANGUAGE_DEFAULT, /* 169/169 default */ "af", LANGUAGE_af, /* 7/ 12 Afrikaans */ - "ar", LANGUAGE_ar, /* 58/109 Arabic */ + "ar", LANGUAGE_ar, /* 56/108 Arabic */ "az", LANGUAGE_az_AZ, /* 8/ 17 Azerbaijani (Azerbaijan) */ "be", LANGUAGE_be_BY, /* 9/ 32 Belarusian (Belarus) */ - "bg", LANGUAGE_bg, /* 2/ 11 Bulgarian */ - "ca", LANGUAGE_ca, /* 11/116 Catalan */ + "bg", LANGUAGE_bg, /* 2/ 10 Bulgarian */ + "ca", LANGUAGE_ca, /* 11/115 Catalan */ "cs", LANGUAGE_cs, /* 17/ 21 Czech */ - "da", LANGUAGE_da, /* 19/ 34 Danish */ + "da", LANGUAGE_da, /* 19/ 33 Danish */ "de", LANGUAGE_de, /* 16/ 92 German */ - "el", LANGUAGE_el, /* 1/ 11 Greek */ - "en", LANGUAGE_en, /* 8/ 10 English */ - "eo", LANGUAGE_eo, /* 26/128 Esperanto */ - "es", LANGUAGE_es, /* 8/ 33 Spanish */ + "el", LANGUAGE_el, /* 1/ 10 Greek */ + "en", LANGUAGE_en, /* 8/ 11 English */ + "eo", LANGUAGE_eo, /* 26/127 Esperanto */ + "es", LANGUAGE_es, /* 8/ 56 Spanish */ "et", LANGUAGE_et_EE, /* 22/ 27 Estonian (Estonia) */ - "fa", LANGUAGE_fa, /* 61/119 Persian */ - "fi", LANGUAGE_fi, /* 10/ 34 Finnish */ + "eu", LANGUAGE_eu_ES, /* 7/ 8 Basque (Spain) */ + "fa", LANGUAGE_fa, /* 59/118 Persian */ + "fi", LANGUAGE_fi, /* 10/ 33 Finnish */ "fr", LANGUAGE_fr, /* 13/ 92 French */ - "hi", LANGUAGE_hi, /* 24/ 56 Hindi */ + "gl", LANGUAGE_gl_ES, /* 7/ 8 Gallegan (Spain) */ + "hi", LANGUAGE_hi, /* 24/ 55 Hindi */ "hr", LANGUAGE_hr, /* 9/ 19 Croatian */ "hu", LANGUAGE_hu, /* 9/ 19 Hungarian */ - "hy", LANGUAGE_hy_AM, /* 8/122 Armenian (Armenia) */ + "hy", LANGUAGE_hy_AM, /* 8/121 Armenian (Armenia) */ "is", LANGUAGE_is, /* 10/ 15 Icelandic */ "it", LANGUAGE_it, /* 5/ 5 Italian */ - "iw", LANGUAGE_iw, /* 20/117 Hebrew */ - "ka", LANGUAGE_ka_GE, /* 3/ 11 Georgian (Georgia) */ - "kk", LANGUAGE_kk, /* 15/114 Kazakh */ - "km", LANGUAGE_km_KH, /* 2/115 Khmer (Cambodia) */ + "iw", LANGUAGE_iw, /* 20/116 Hebrew */ + "ka", LANGUAGE_ka_GE, /* 3/ 10 Georgian (Georgia) */ + "kk", LANGUAGE_kk, /* 15/113 Kazakh */ + "km", LANGUAGE_km_KH, /* 2/114 Khmer (Cambodia) */ "ky", LANGUAGE_ky, /* 10/ 81 Kirghiz */ "lo", LANGUAGE_lo_LA, /* 2/ 20 Lao (Laos) */ "lt", LANGUAGE_lt, /* 18/ 22 Lithuanian */ "lv", LANGUAGE_lv, /* 18/ 22 Latvian */ "mk", LANGUAGE_mk, /* 9/ 86 Macedonian */ "mn", LANGUAGE_mn_MN, /* 2/ 20 Mongolian (Mongolia) */ - "nb", LANGUAGE_nb, /* 11/ 34 Norwegian Bokmål */ - "ne", LANGUAGE_ne_NP, /* 24/ 56 Nepali (Nepal) */ + "my", LANGUAGE_my_MM, /* 1/ 10 Burmese (Myanmar) */ + "nb", LANGUAGE_nb, /* 11/ 33 Norwegian Bokmål */ + "ne", LANGUAGE_ne_NP, /* 24/ 55 Nepali (Nepal) */ "nl", LANGUAGE_nl, /* 9/ 12 Dutch */ "pl", LANGUAGE_pl, /* 10/ 16 Polish */ - "pt", LANGUAGE_pt, /* 6/ 8 Portuguese */ + "pt", LANGUAGE_pt, /* 6/ 6 Portuguese */ "rm", LANGUAGE_rm, /* 1/ 2 Raeto-Romance */ "ro", LANGUAGE_ro, /* 6/ 15 Romanian */ "ru", LANGUAGE_ru, /* 9/ 32 Russian */ "sk", LANGUAGE_sk, /* 20/ 22 Slovak */ "sl", LANGUAGE_sl, /* 8/ 19 Slovenian */ "sr", LANGUAGE_sr, /* 11/ 86 Serbian */ - "sv", LANGUAGE_sv, /* 21/ 34 Swedish */ + "sv", LANGUAGE_sv, /* 21/ 33 Swedish */ "sw", LANGUAGE_sw, /* 9/ 17 Swahili */ "th", LANGUAGE_th, /* 2/ 20 Thai */ - "tl", LANGUAGE_tl, /* 7/ 10 Tagalog */ + "tl", LANGUAGE_tl, /* 7/ 8 Tagalog */ "tr", LANGUAGE_tr, /* 7/ 17 Turkish */ "uk", LANGUAGE_uk, /* 11/ 80 Ukrainian */ "vi", LANGUAGE_vi, /* 8/ 20 Vietnamese */ - "zu", LANGUAGE_zu, /* 8/ 10 Zulu */ - "zz", LANGUAGE_zz, /* 19/111 Alphabet */ + "zu", LANGUAGE_zu, /* 8/ 11 Zulu */ + "zz", LANGUAGE_zz, /* 19/110 Alphabet */ }; static { diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 544fd0319..0aa34e82e 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -161,9 +161,9 @@ public final class BinaryDictionary extends Dictionary { private static native int getNextWordNative(long dict, int token, int[] outCodePoints); private static native void getSuggestionsNative(long dict, long proximityInfo, long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times, - int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint, - int[] suggestOptions, int[] prevWordCodePointArray, int[] outputSuggestionCount, - int[] outputCodePoints, int[] outputScores, int[] outputIndices, int[] outputTypes, + int[] pointerIds, int[] inputCodePoints, int inputSize, int[] suggestOptions, + int[] prevWordCodePointArray, int[] outputSuggestionCount, int[] outputCodePoints, + int[] outputScores, int[] outputIndices, int[] outputTypes, int[] outputAutoCommitFirstWordConfidence); private static native void addUnigramWordNative(long dict, int[] word, int probability, int[] shortcutTarget, int shortcutProbability, boolean isNotAWord, @@ -262,7 +262,7 @@ public final class BinaryDictionary extends Dictionary { getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(), getTraverseSession(sessionId).getSession(), ips.getXCoordinates(), ips.getYCoordinates(), ips.getTimes(), ips.getPointerIds(), mInputCodePoints, - inputSize, 0 /* commitPoint */, mNativeSuggestOptions.getOptions(), + inputSize, mNativeSuggestOptions.getOptions(), prevWordCodePointArray, mOutputSuggestionCount, mOutputCodePoints, mOutputScores, mSpaceIndices, mOutputTypes, mOutputAutoCommitFirstWordConfidence); final int count = mOutputSuggestionCount[0]; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 4a18c2b3c..38e386493 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -169,8 +169,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private int mDelayUpdateSuggestions; private int mDelayUpdateShiftState; - private long mDoubleSpacePeriodTimeout; - private long mDoubleSpacePeriodTimerStart; public UIHandler(final LatinIME ownerInstance) { super(ownerInstance); @@ -184,8 +182,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final Resources res = latinIme.getResources(); mDelayUpdateSuggestions = res.getInteger(R.integer.config_delay_update_suggestions); mDelayUpdateShiftState = res.getInteger(R.integer.config_delay_update_shift_state); - mDoubleSpacePeriodTimeout = - res.getInteger(R.integer.config_double_space_period_timeout); } @Override @@ -286,10 +282,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), mDelayUpdateShiftState); } - public void cancelUpdateShiftState() { - removeMessages(MSG_UPDATE_SHIFT_STATE); - } - @UsedForTesting public void removeAllMessages() { for (int i = 0; i <= MSG_LAST; ++i) { @@ -317,19 +309,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen obtainMessage(MSG_ON_END_BATCH_INPUT, suggestedWords).sendToTarget(); } - public void startDoubleSpacePeriodTimer() { - mDoubleSpacePeriodTimerStart = SystemClock.uptimeMillis(); - } - - public void cancelDoubleSpacePeriodTimer() { - mDoubleSpacePeriodTimerStart = 0; - } - - public boolean isAcceptingDoubleSpacePeriod() { - return SystemClock.uptimeMillis() - mDoubleSpacePeriodTimerStart - < mDoubleSpacePeriodTimeout; - } - // Working variables for the following methods. private boolean mIsOrientationChanging; private boolean mPendingSuccessiveImsCallback; @@ -885,7 +864,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen setNeutralSuggestionStrip(); mHandler.cancelUpdateSuggestionStrip(); - mHandler.cancelDoubleSpacePeriodTimer(); mainKeyboardView.setMainDictionaryAvailability(null != suggest ? suggest.mDictionaryFacilitator.hasMainDictionary() : false); @@ -1276,15 +1254,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final InputTransaction completeInputTransaction = mInputLogic.onCodeInput(mSettings.getCurrent(), event, mKeyboardSwitcher.getKeyboardShiftMode(), mHandler); - switch (completeInputTransaction.getRequiredShiftUpdate()) { - case InputTransaction.SHIFT_UPDATE_LATER: - mHandler.postUpdateShiftState(); - break; - case InputTransaction.SHIFT_UPDATE_NOW: - mKeyboardSwitcher.updateShiftState(); - break; - default: // SHIFT_NO_UPDATE - } + updateShiftModeAfterInputTransaction(completeInputTransaction.getRequiredShiftUpdate()); mKeyboardSwitcher.onCodeInput(codePoint); } @@ -1307,7 +1277,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // Called from PointerTracker through the KeyboardActionListener interface @Override public void onTextInput(final String rawText) { - mInputLogic.onTextInput(mSettings.getCurrent(), rawText, mHandler); + // TODO: have the keyboard pass the correct key code when we need it. + final Event event = Event.createSoftwareTextEvent(rawText, Event.NOT_A_KEY_CODE); + mInputLogic.onTextInput(mSettings.getCurrent(), event, mHandler); mKeyboardSwitcher.updateShiftState(); mKeyboardSwitcher.onCodeInput(Constants.CODE_OUTPUT_TEXT); } @@ -1500,8 +1472,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // interface @Override public void pickSuggestionManually(final int index, final SuggestedWordInfo suggestionInfo) { - mInputLogic.onPickSuggestionManually(mSettings.getCurrent(), index, suggestionInfo, - mHandler, mKeyboardSwitcher); + final InputTransaction completeInputTransaction = mInputLogic.onPickSuggestionManually( + mSettings.getCurrent(), index, suggestionInfo, + mKeyboardSwitcher.getKeyboardShiftMode(), mHandler); + updateShiftModeAfterInputTransaction(completeInputTransaction.getRequiredShiftUpdate()); } @Override @@ -1539,6 +1513,18 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } + private void updateShiftModeAfterInputTransaction(final int requiredShiftUpdate) { + switch (requiredShiftUpdate) { + case InputTransaction.SHIFT_UPDATE_LATER: + mHandler.postUpdateShiftState(); + break; + case InputTransaction.SHIFT_UPDATE_NOW: + mKeyboardSwitcher.updateShiftState(); + break; + default: // SHIFT_NO_UPDATE + } + } + private void hapticAndAudioFeedback(final int code, final int repeatCount) { final MainKeyboardView keyboardView = mKeyboardSwitcher.getMainKeyboardView(); if (keyboardView != null && keyboardView.isInDraggingFinger()) { diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 2ac11aa29..29382fea4 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.event.CombinerChain; import com.android.inputmethod.event.Event; import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; @@ -40,6 +41,8 @@ public final class WordComposer { public static final int CAPS_MODE_AUTO_SHIFTED = 0x5; public static final int CAPS_MODE_AUTO_SHIFT_LOCKED = 0x7; + private CombinerChain mCombinerChain; + // An array of code points representing the characters typed so far. // The array is limited to MAX_WORD_LENGTH code points, but mTypedWord extends past that // and mCodePointSize can go past that. If mCodePointSize is greater than MAX_WORD_LENGTH, @@ -87,6 +90,7 @@ public final class WordComposer { private boolean mIsFirstCharCapitalized; public WordComposer() { + mCombinerChain = new CombinerChain(); mPrimaryKeyCodes = new int[MAX_WORD_LENGTH]; mEvents = CollectionUtils.newArrayList(); mTypedWord = new StringBuilder(MAX_WORD_LENGTH); @@ -101,6 +105,7 @@ public final class WordComposer { } public WordComposer(final WordComposer source) { + mCombinerChain = source.mCombinerChain; mPrimaryKeyCodes = Arrays.copyOf(source.mPrimaryKeyCodes, source.mPrimaryKeyCodes.length); mEvents = new ArrayList<Event>(source.mEvents); mTypedWord = new StringBuilder(source.mTypedWord); @@ -187,6 +192,7 @@ public final class WordComposer { final int keyX = event.mX; final int keyY = event.mY; final int newIndex = size(); + mCombinerChain.processEvent(mEvents, event); mTypedWord.appendCodePoint(primaryCode); mEvents.add(event); refreshSize(); diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index fa7c4b4fc..36b30eabe 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -28,7 +28,6 @@ import android.view.inputmethod.EditorInfo; import com.android.inputmethod.compat.SuggestionSpanUtils; import com.android.inputmethod.event.Event; -import com.android.inputmethod.event.EventInterpreter; import com.android.inputmethod.event.InputTransaction; import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.latin.Constants; @@ -96,6 +95,7 @@ public final class InputLogic { // TODO: This boolean is persistent state and causes large side effects at unexpected times. // Find a way to remove it for readability. private boolean mIsAutoCorrectionIndicatorOn; + private long mDoubleSpacePeriodCountdownStart; public InputLogic(final LatinIME latinIME, final SuggestionStripViewAccessor suggestionStripViewAccessor) { @@ -138,6 +138,7 @@ public final class InputLogic { // In some cases (namely, after rotation of the device) editorInfo.initialSelStart is lying // so we try using some heuristics to find out about these and fix them. mConnection.tryFixLyingCursorPosition(); + cancelDoubleSpacePeriodCountdown(); mInputLogicHandler = new InputLogicHandler(mLatinIME, this); } @@ -160,11 +161,12 @@ public final class InputLogic { * some additional keys for example. * * @param settingsValues the current values of the settings. - * @param rawText the text to input. + * @param event the input event containing the data. */ - public void onTextInput(final SettingsValues settingsValues, final String rawText, + public void onTextInput(final SettingsValues settingsValues, final Event event, // TODO: remove this argument final LatinIME.UIHandler handler) { + final String rawText = event.mText.toString(); mConnection.beginBatchEdit(); if (mWordComposer.isComposingWord()) { commitCurrentAutoCorrection(settingsValues, rawText, handler); @@ -196,13 +198,16 @@ public final class InputLogic { * @param settingsValues the current values of the settings. * @param index the index of the suggestion. * @param suggestionInfo the suggestion info. + * @param keyboardShiftState the shift state of the keyboard, as returned by + * {@link com.android.inputmethod.keyboard.KeyboardSwitcher#getKeyboardShiftMode()} + * @return the complete transaction object */ // Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener} // interface - public void onPickSuggestionManually(final SettingsValues settingsValues, - final int index, final SuggestedWordInfo suggestionInfo, - // TODO: remove these two arguments - final LatinIME.UIHandler handler, final KeyboardSwitcher keyboardSwitcher) { + public InputTransaction onPickSuggestionManually(final SettingsValues settingsValues, + final int index, final SuggestedWordInfo suggestionInfo, final int keyboardShiftState, + // TODO: remove this argument + final LatinIME.UIHandler handler) { final SuggestedWords suggestedWords = mSuggestedWords; final String suggestion = suggestionInfo.mWord; // If this is a punctuation picked from the suggestion strip, pass it to onCodeInput @@ -212,16 +217,26 @@ public final class InputLogic { LatinImeLogger.logOnManualSuggestion("", suggestion, index, suggestedWords); // Rely on onCodeInput to do the complicated swapping/stripping logic consistently. final int primaryCode = suggestion.charAt(0); - final Event event = Event.createSoftwareKeypressEvent(primaryCode, Event.NOT_A_KEY_CODE, - Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE); - onCodeInput(settingsValues, event, keyboardSwitcher.getKeyboardShiftMode(), handler); + // TODO: we should be using createSuggestionPickedEvent here, but for legacy reasons, + // onCodeInput is expected a software keypress event for a suggested punctuation + // because the current code is descended from a time where this information used not + // to be available. Fix this. + final Event event = Event.createSoftwareKeypressEvent(primaryCode, + Event.NOT_A_KEY_CODE /* keyCode*/, + Constants.SUGGESTION_STRIP_COORDINATE /* x */, + Constants.SUGGESTION_STRIP_COORDINATE /* y */); + final InputTransaction completeTransaction = onCodeInput(settingsValues, event, + keyboardShiftState, handler); if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { ResearchLogger.latinIME_punctuationSuggestion(index, suggestion, false /* isBatchMode */, suggestedWords.mIsPrediction); } - return; + return completeTransaction; } + final Event event = Event.createSuggestionPickedEvent(suggestionInfo); + final InputTransaction inputTransaction = new InputTransaction(settingsValues, + event, SystemClock.uptimeMillis(), mSpaceState, keyboardShiftState); mConnection.beginBatchEdit(); if (SpaceState.PHANTOM == mSpaceState && suggestion.length() > 0 // In the batch input mode, a manually picked suggested word should just replace @@ -241,11 +256,11 @@ public final class InputLogic { if (SuggestedWordInfo.KIND_APP_DEFINED == suggestionInfo.mKind) { mSuggestedWords = SuggestedWords.EMPTY; mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); - keyboardSwitcher.updateShiftState(); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); resetComposingState(true /* alsoResetLastComposedWord */); mConnection.commitCompletion(suggestionInfo.mApplicationSpecifiedCompletionInfo); mConnection.endBatchEdit(); - return; + return inputTransaction; } // We need to log before we commit, because the word composer will store away the user @@ -264,7 +279,7 @@ public final class InputLogic { mLastComposedWord.deactivate(); // Space state must be updated before calling updateShiftState mSpaceState = SpaceState.PHANTOM; - keyboardSwitcher.updateShiftState(); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); // We should show the "Touch again to save" hint if the user pressed the first entry // AND it's in none of our current dictionaries (main, user or otherwise). @@ -290,6 +305,7 @@ public final class InputLogic { // If we're not showing the "Touch again to save", then update the suggestion strip. handler.postUpdateSuggestionStrip(); } + return inputTransaction; } /** @@ -392,7 +408,7 @@ public final class InputLogic { // TODO: Consolidate the double-space period timer, mLastKeyTime, and the space state. if (event.mCodePoint != Constants.CODE_SPACE) { - handler.cancelDoubleSpacePeriodTimer(); + cancelDoubleSpacePeriodCountdown(); } boolean didAutoCorrect = false; @@ -833,7 +849,7 @@ public final class InputLogic { if (Constants.CODE_SPACE == codePoint) { if (inputTransaction.mSettingsValues.isSuggestionsRequested()) { - if (maybeDoubleSpacePeriod(inputTransaction.mSettingsValues, handler)) { + if (maybeDoubleSpacePeriod(inputTransaction)) { inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); mSpaceState = SpaceState.DOUBLE; } else if (!mSuggestedWords.isPunctuationSuggestions()) { @@ -841,7 +857,7 @@ public final class InputLogic { } } - handler.startDoubleSpacePeriodTimer(); + startDoubleSpacePeriodCountdown(inputTransaction); handler.postUpdateSuggestionStrip(); } else { if (swapWeakSpace) { @@ -938,7 +954,7 @@ public final class InputLogic { return; } if (SpaceState.DOUBLE == inputTransaction.mSpaceState) { - handler.cancelDoubleSpacePeriodTimer(); + cancelDoubleSpacePeriodCountdown(); if (mConnection.revertDoubleSpacePeriod()) { // No need to reset mSpaceState, it has already be done (that's why we // receive it as a parameter) @@ -1086,6 +1102,19 @@ public final class InputLogic { return false; } + public void startDoubleSpacePeriodCountdown(final InputTransaction inputTransaction) { + mDoubleSpacePeriodCountdownStart = inputTransaction.mTimestamp; + } + + public void cancelDoubleSpacePeriodCountdown() { + mDoubleSpacePeriodCountdownStart = 0; + } + + public boolean isDoubleSpacePeriodCountdownActive(final InputTransaction inputTransaction) { + return inputTransaction.mTimestamp - mDoubleSpacePeriodCountdownStart + < inputTransaction.mSettingsValues.mDoubleSpacePeriodTimeout; + } + /** * Apply the double-space-to-period transformation if applicable. * @@ -1098,14 +1127,12 @@ public final class InputLogic { * method applies the transformation and returns true. Otherwise, it does nothing and * returns false. * - * @param settingsValues the current values of the settings. + * @param inputTransaction The transaction in progress. * @return true if we applied the double-space-to-period transformation, false otherwise. */ - private boolean maybeDoubleSpacePeriod(final SettingsValues settingsValues, - // TODO: remove this argument - final LatinIME.UIHandler handler) { - if (!settingsValues.mUseDoubleSpacePeriod) return false; - if (!handler.isAcceptingDoubleSpacePeriod()) return false; + private boolean maybeDoubleSpacePeriod(final InputTransaction inputTransaction) { + if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod) return false; + if (!isDoubleSpacePeriodCountdownActive(inputTransaction)) return false; // We only do this when we see two spaces and an accepted code point before the cursor. // The code point may be a surrogate pair but the two spaces may not, so we need 4 chars. final CharSequence lastThree = mConnection.getTextBeforeCursor(4, 0); @@ -1121,10 +1148,10 @@ public final class InputLogic { Character.isSurrogatePair(lastThree.charAt(0), lastThree.charAt(1)) ? Character.codePointAt(lastThree, 0) : lastThree.charAt(length - 3); if (canBeFollowedByDoubleSpacePeriod(firstCodePoint)) { - handler.cancelDoubleSpacePeriodTimer(); + cancelDoubleSpacePeriodCountdown(); mConnection.deleteSurroundingText(2, 0); - final String textToInsert = - settingsValues.mSpacingAndPunctuations.mSentenceSeparatorAndSpace; + final String textToInsert = inputTransaction.mSettingsValues.mSpacingAndPunctuations + .mSentenceSeparatorAndSpace; mConnection.commitText(textToInsert, 1); if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { ResearchLogger.latinIME_maybeDoubleSpacePeriod(textToInsert, diff --git a/java/src/com/android/inputmethod/latin/settings/Settings.java b/java/src/com/android/inputmethod/latin/settings/Settings.java index b51c765f0..964bf2246 100644 --- a/java/src/com/android/inputmethod/latin/settings/Settings.java +++ b/java/src/com/android/inputmethod/latin/settings/Settings.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.preference.PreferenceManager; import android.util.Log; +import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.latin.AudioAndHapticFeedbackManager; import com.android.inputmethod.latin.InputAttributes; import com.android.inputmethod.latin.R; @@ -270,25 +271,36 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang } public static int readKeyboardThemeIndex(final SharedPreferences prefs, final Resources res) { - final String defaultThemeIndex = res.getString( - R.string.config_default_keyboard_theme_index); - final String themeIndex = prefs.getString(PREF_KEYBOARD_LAYOUT, defaultThemeIndex); + final int defaultThemeIndex = readDefaultKeyboardThemeIndex(res); + final String themeIndexString = prefs.getString(PREF_KEYBOARD_LAYOUT, null); try { - return Integer.valueOf(themeIndex); + return Integer.parseInt(themeIndexString); } catch (final NumberFormatException e) { // Format error, returns default keyboard theme index. - Log.e(TAG, "Illegal keyboard theme in preference: " + themeIndex + ", default to " + Log.e(TAG, "Illegal keyboard theme in preference: " + themeIndexString + ", default to " + defaultThemeIndex, e); - return Integer.valueOf(defaultThemeIndex); + } + return defaultThemeIndex; + } + + private static int readDefaultKeyboardThemeIndex(final Resources res) { + final String defaultThemeIndexString = res.getString( + R.string.config_default_keyboard_theme_index); + try { + return Integer.parseInt(defaultThemeIndexString); + } catch (final NumberFormatException e) { + final int defaultThemeIndex = KeyboardSwitcher.DEFAULT_THEME_INDEX; + Log.e(TAG, "Corrupted default keyoard theme in resource: " + defaultThemeIndexString + + ", default to " + defaultThemeIndex, e); + return defaultThemeIndex; } } public static int resetAndGetDefaultKeyboardThemeIndex(final SharedPreferences prefs, final Resources res) { - final String defaultThemeIndex = res.getString( - R.string.config_default_keyboard_theme_index); - prefs.edit().putString(PREF_KEYBOARD_LAYOUT, defaultThemeIndex).apply(); - return Integer.valueOf(defaultThemeIndex); + final int defaultThemeIndex = readDefaultKeyboardThemeIndex(res); + prefs.edit().putString(PREF_KEYBOARD_LAYOUT, Integer.toString(defaultThemeIndex)).apply(); + return defaultThemeIndex; } public static String readPrefAdditionalSubtypes(final SharedPreferences prefs, diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java index 50fbbb19f..d47a61ed1 100644 --- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java +++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java @@ -50,6 +50,7 @@ public final class SettingsValues { // From resources: public final SpacingAndPunctuations mSpacingAndPunctuations; public final int mDelayUpdateOldSuggestions; + public final long mDoubleSpacePeriodTimeout; // From preferences, in the same order as xml/prefs.xml: public final boolean mAutoCap; @@ -132,6 +133,7 @@ public final class SettingsValues { mBlockPotentiallyOffensive = Settings.readBlockPotentiallyOffensive(prefs, res); mAutoCorrectEnabled = Settings.readAutoCorrectEnabled(autoCorrectionThresholdRawValue, res); mBigramPredictionEnabled = readBigramPredictionEnabled(prefs, res); + mDoubleSpacePeriodTimeout = res.getInteger(R.integer.config_double_space_period_timeout); // Compute other readable settings mKeyLongpressTimeout = Settings.readKeyLongpressTimeout(prefs, res); @@ -285,7 +287,7 @@ public final class SettingsValues { // When autoCorrectionThreshold is greater than 1.0, it's like auto correction is off. final float autoCorrectionThreshold; try { - final int arrayIndex = Integer.valueOf(currentAutoCorrectionSetting); + final int arrayIndex = Integer.parseInt(currentAutoCorrectionSetting); if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) { final String val = autoCorrectionThresholdValues[arrayIndex]; if (FLOAT_MAX_VALUE_MARKER_STRING.equals(val)) { diff --git a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java index 5954758aa..796921f71 100644 --- a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java +++ b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java @@ -18,7 +18,6 @@ package com.android.inputmethod.latin.settings; import android.content.res.Resources; -import com.android.inputmethod.keyboard.internal.KeyboardTextsSet; import com.android.inputmethod.keyboard.internal.MoreKeySpec; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.PunctuationSuggestions; @@ -61,10 +60,8 @@ public final class SpacingAndPunctuations { // English variants. German rules (not "German typography") also have small gotchas. mUsesAmericanTypography = Locale.ENGLISH.getLanguage().equals(locale.getLanguage()); mUsesGermanRules = Locale.GERMAN.getLanguage().equals(locale.getLanguage()); - final KeyboardTextsSet textsSet = new KeyboardTextsSet(); - textsSet.setLocale(locale); final String[] suggestPuncsSpec = MoreKeySpec.splitKeySpecs( - textsSet.resolveTextReference(res.getString(R.string.suggested_punctuations))); + res.getString(R.string.suggested_punctuations)); mSuggestPuncList = PunctuationSuggestions.newPunctuationSuggestions(suggestPuncsSpec); } diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java index c26e223c9..1d84bb59f 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java @@ -507,7 +507,7 @@ final class SuggestionStripLayoutHelper { hintView, 1.0f - mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT); } - public void layoutImportantNotice(final View importantNoticeStrip, final int stripWidth, + public void layoutImportantNotice(final View importantNoticeStrip, final String importantNoticeTitle) { final TextView titleView = (TextView)importantNoticeStrip.findViewById( R.id.important_notice_title); @@ -516,8 +516,7 @@ final class SuggestionStripLayoutHelper { titleView.setTextColor(mColorAutoCorrect); titleView.setText(importantNoticeTitle); titleView.setTextScaleX(1.0f); // Reset textScaleX. - final float titleScaleX = getTextScaleX( - importantNoticeTitle, width, titleView.getPaint()); + final float titleScaleX = getTextScaleX(importantNoticeTitle, width, titleView.getPaint()); titleView.setTextScaleX(titleScaleX); } diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java index 43cb11b14..3cdd07361 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java @@ -232,8 +232,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick if (!ImportantNoticeUtils.shouldShowImportantNotice(getContext(), inputAttributes)) { return false; } - final int width = getWidth(); - if (width <= 0) { + if (getWidth() <= 0) { return false; } final String importantNoticeTitle = ImportantNoticeUtils.getNextImportantNoticeTitle( @@ -241,7 +240,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick if (TextUtils.isEmpty(importantNoticeTitle)) { return false; } - mLayoutHelper.layoutImportantNotice(mImportantNoticeStrip, width, importantNoticeTitle); + mLayoutHelper.layoutImportantNotice(mImportantNoticeStrip, importantNoticeTitle); mStripVisibilityGroup.showImportantNoticeStrip(); mImportantNoticeStrip.setOnClickListener(this); return true; diff --git a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java index ca8bef397..7d937a9d2 100644 --- a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; +import android.text.TextUtils; import android.util.Log; import com.android.inputmethod.latin.InputAttributes; @@ -82,7 +83,17 @@ public final class ImportantNoticeUtils { if (inputAttributes == null || inputAttributes.mIsPasswordField) { return false; } - return hasNewImportantNotice(context) && !isInSystemSetupWizard(context); + if (isInSystemSetupWizard(context)) { + return false; + } + if (!hasNewImportantNotice(context)) { + return false; + } + final String importantNoticeTitle = getNextImportantNoticeTitle(context); + if (TextUtils.isEmpty(importantNoticeTitle)) { + return false; + } + return true; } public static void updateLastImportantNoticeVersion(final Context context) { |