aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--java-overridable/src/com/android/inputmethod/latin/utils/StatsUtils.java10
-rw-r--r--java-overridable/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java43
-rw-r--r--java/AndroidManifest.xml1
-rw-r--r--java/res/anim/key_preview_dismiss_holo.xml32
-rw-r--r--java/res/anim/key_preview_dismiss_lxx.xml32
-rw-r--r--java/res/anim/key_preview_show_up_holo.xml32
-rw-r--r--java/res/anim/key_preview_show_up_lxx.xml32
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png (renamed from java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png)bin306 -> 306 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_light.9.png (renamed from java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_light.9.png)bin333 -> 333 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.pngbin0 -> 321 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_light.9.pngbin0 -> 346 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png (renamed from java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png)bin234 -> 234 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_light.9.png (renamed from java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_light.9.png)bin260 -> 260 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.pngbin0 -> 244 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_light.9.pngbin0 -> 265 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png (renamed from java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png)bin386 -> 386 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_light.9.png (renamed from java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_light.9.png)bin415 -> 415 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.pngbin0 -> 398 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.pngbin0 -> 450 bytes
-rw-r--r--java/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png (renamed from java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png)bin585 -> 585 bytes
-rw-r--r--java/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_light.9.png (renamed from java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_light.9.png)bin658 -> 658 bytes
-rw-r--r--java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.pngbin0 -> 608 bytes
-rw-r--r--java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.pngbin0 -> 673 bytes
-rw-r--r--java/res/drawable/btn_keyboard_key_lxx_dark.xml5
-rw-r--r--java/res/drawable/btn_keyboard_key_lxx_light.xml5
-rw-r--r--java/res/drawable/btn_keyboard_key_popup_lxx_light.xml21
-rw-r--r--java/res/drawable/btn_keyboard_spacebar_lxx_dark.xml4
-rw-r--r--java/res/drawable/btn_keyboard_spacebar_lxx_light.xml4
-rw-r--r--java/res/layout/additional_subtype_dialog.xml89
-rw-r--r--java/res/values-ne-rNP/strings.xml2
-rw-r--r--java/res/values-ta-rIN/strings-talkback-descriptions.xml2
-rw-r--r--java/res/values/attrs.xml21
-rw-r--r--java/res/values/colors.xml2
-rw-r--r--java/res/values/donottranslate-text-decorator.xml28
-rw-r--r--java/res/values/keyboard-icons-lxx-dark.xml2
-rw-r--r--java/res/values/keyboard-icons-lxx-light.xml2
-rw-r--r--java/res/values/strings.xml14
-rw-r--r--java/res/values/themes-ics.xml6
-rw-r--r--java/res/values/themes-klp.xml6
-rw-r--r--java/res/values/themes-lxx-dark.xml6
-rw-r--r--java/res/values/themes-lxx-light.xml9
-rw-r--r--java/res/xml-sw600dp/key_styles_common.xml1
-rw-r--r--java/res/xml-sw600dp/key_styles_enter.xml14
-rw-r--r--java/res/xml-sw600dp/rows_number_normal.xml5
-rw-r--r--java/res/xml-sw600dp/rows_phone.xml5
-rw-r--r--java/res/xml/key_space_symbols.xml1
-rw-r--r--java/res/xml/key_styles_common.xml1
-rw-r--r--java/res/xml/key_styles_enter.xml14
-rw-r--r--java/res/xml/key_styles_number.xml20
-rw-r--r--java/res/xml/prefs_screen_debug.xml27
-rw-r--r--java/src/com/android/inputmethod/compat/CursorAnchorInfoCompatWrapper.java38
-rw-r--r--java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java32
-rw-r--r--java/src/com/android/inputmethod/compat/NotificationCompatUtils.java83
-rw-r--r--java/src/com/android/inputmethod/compat/ViewCompatUtils.java19
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/ActionBatch.java19
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java6
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java81
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java19
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/MetadataParser.java1
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java103
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java12
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java60
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java10
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java9
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardTheme.java20
-rw-r--r--java/src/com/android/inputmethod/keyboard/MainKeyboardView.java28
-rw-r--r--java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java39
-rw-r--r--java/src/com/android/inputmethod/keyboard/TextDecorator.java11
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java93
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java86
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java18
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java7
-rw-r--r--java/src/com/android/inputmethod/latin/Constants.java7
-rw-r--r--java/src/com/android/inputmethod/latin/Dictionary.java9
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryCollection.java15
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryFacilitator.java22
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryFactory.java6
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java6
-rw-r--r--java/src/com/android/inputmethod/latin/InputAttributes.java11
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java20
-rw-r--r--java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java2
-rw-r--r--java/src/com/android/inputmethod/latin/RichInputConnection.java6
-rw-r--r--java/src/com/android/inputmethod/latin/Suggest.java16
-rw-r--r--java/src/com/android/inputmethod/latin/SuggestedWords.java2
-rw-r--r--java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java29
-rw-r--r--java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java2
-rw-r--r--java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java26
-rw-r--r--java/src/com/android/inputmethod/latin/settings/DebugSettings.java14
-rw-r--r--java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java18
-rw-r--r--java/src/com/android/inputmethod/latin/settings/SettingsValues.java49
-rw-r--r--java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java9
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java167
-rw-r--r--java/src/com/android/inputmethod/latin/utils/SuggestionResults.java8
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node.h29
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node_utils.cpp8
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node_utils.h2
-rw-r--r--native/jni/src/suggest/core/dicnode/internal/dic_node_properties.h24
-rw-r--r--native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h8
-rw-r--r--native/jni/src/suggest/core/dictionary/dictionary.cpp30
-rw-r--r--native/jni/src/suggest/core/dictionary/dictionary.h2
-rw-r--r--native/jni/src/suggest/core/dictionary/dictionary_utils.cpp8
-rw-r--r--native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp52
-rw-r--r--native/jni/src/suggest/core/dictionary/multi_bigram_map.h17
-rw-r--r--native/jni/src/suggest/core/dictionary/ngram_listener.h2
-rw-r--r--native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h15
-rw-r--r--native/jni/src/suggest/core/result/suggestions_output_utils.cpp7
-rw-r--r--native/jni/src/suggest/core/session/dic_traverse_session.cpp4
-rw-r--r--native/jni/src/suggest/core/session/dic_traverse_session.h8
-rw-r--r--native/jni/src/suggest/core/session/prev_words_info.h28
-rw-r--r--native/jni/src/suggest/core/suggest.cpp2
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp103
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h21
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp67
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h19
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp150
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h18
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java156
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java199
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java24
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysBase.java324
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysKlpTests.java28
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysLxxTests.java28
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java12
-rw-r--r--tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java2464
-rw-r--r--tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java3
-rw-r--r--tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderMaxOrderTests.java (renamed from tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderTests.java)5
-rw-r--r--tests/src/com/android/inputmethod/latin/DistracterFilterTest.java11
-rw-r--r--tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java10
-rw-r--r--tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java2
129 files changed, 4628 insertions, 998 deletions
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtils.java b/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtils.java
index 95df202db..9cfcc3d4f 100644
--- a/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtils.java
+++ b/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtils.java
@@ -16,22 +16,12 @@
package com.android.inputmethod.latin.utils;
-import android.content.Context;
-
import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.settings.SettingsValues;
public final class StatsUtils {
- public static void init(final Context context) {
- }
public static void onCreate(final SettingsValues settingsValues,
RichInputMethodManager richImm) {
}
-
- public static void onLoadSettings(final SettingsValues settingsValues) {
- }
-
- public static void onDestroy() {
- }
}
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java b/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java
new file mode 100644
index 000000000..120b105d7
--- /dev/null
+++ b/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java
@@ -0,0 +1,43 @@
+/*
+ * 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.latin.utils;
+
+import android.content.Context;
+
+import com.android.inputmethod.latin.settings.SettingsValues;
+
+public class StatsUtilsManager {
+
+ private static final StatsUtilsManager sInstance = new StatsUtilsManager();
+
+ /**
+ * @return the singleton instance of {@link StatsUtilsManager}.
+ */
+ public static StatsUtilsManager getInstance() {
+ return sInstance;
+ }
+
+ public void onCreate(final Context context) {
+ }
+
+ public void onLoadSettings(final SettingsValues settingsValues) {
+ }
+
+ public void onDestroy() {
+ }
+}
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index f37f6cc4b..a1ffe5a93 100644
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -82,6 +82,7 @@
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_INITIALIZE" />
+ <action android:name="android.intent.action.LOCALE_CHANGED" />
</intent-filter>
</receiver>
diff --git a/java/res/anim/key_preview_dismiss_holo.xml b/java/res/anim/key_preview_dismiss_holo.xml
new file mode 100644
index 000000000..0bf725435
--- /dev/null
+++ b/java/res/anim/key_preview_dismiss_holo.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <objectAnimator
+ android:propertyName="scaleX"
+ android:duration="53"
+ android:valueFrom="1.00"
+ android:valueTo="0.94" />
+ <objectAnimator
+ android:propertyName="scaleY"
+ android:duration="53"
+ android:valueFrom="1.00"
+ android:valueTo="0.94" />
+</set>
diff --git a/java/res/anim/key_preview_dismiss_lxx.xml b/java/res/anim/key_preview_dismiss_lxx.xml
new file mode 100644
index 000000000..326e534ec
--- /dev/null
+++ b/java/res/anim/key_preview_dismiss_lxx.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <objectAnimator
+ android:propertyName="scaleX"
+ android:duration="53"
+ android:valueFrom="1.00"
+ android:valueTo="1.00" />
+ <objectAnimator
+ android:propertyName="scaleY"
+ android:duration="53"
+ android:valueFrom="1.00"
+ android:valueTo="0.94" />
+</set>
diff --git a/java/res/anim/key_preview_show_up_holo.xml b/java/res/anim/key_preview_show_up_holo.xml
new file mode 100644
index 000000000..ad2e413a1
--- /dev/null
+++ b/java/res/anim/key_preview_show_up_holo.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <objectAnimator
+ android:propertyName="scaleX"
+ android:duration="17"
+ android:valueFrom="0.98"
+ android:valueTo="1.00" />
+ <objectAnimator
+ android:propertyName="scaleY"
+ android:duration="17"
+ android:valueFrom="0.98"
+ android:valueTo="1.00" />
+</set>
diff --git a/java/res/anim/key_preview_show_up_lxx.xml b/java/res/anim/key_preview_show_up_lxx.xml
new file mode 100644
index 000000000..f5003499c
--- /dev/null
+++ b/java/res/anim/key_preview_show_up_lxx.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <objectAnimator
+ android:propertyName="scaleX"
+ android:duration="17"
+ android:valueFrom="1.00"
+ android:valueTo="1.00" />
+ <objectAnimator
+ android:propertyName="scaleY"
+ android:duration="17"
+ android:valueFrom="0.98"
+ android:valueTo="1.00" />
+</set>
diff --git a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
index 32311666f..32311666f 100644
--- a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
index 1256b8b21..1256b8b21 100644
--- a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_light.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
new file mode 100644
index 000000000..cd0d884c6
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
new file mode 100644
index 000000000..c05605fbf
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
index b8e56dab4..b8e56dab4 100644
--- a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
index 281f83062..281f83062 100644
--- a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_light.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
new file mode 100644
index 000000000..cb2ca06d3
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
new file mode 100644
index 000000000..653da974c
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
index ab032dc17..ab032dc17 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
index c1ed863f8..c1ed863f8 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_light.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
new file mode 100644
index 000000000..c3428bede
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
new file mode 100644
index 000000000..f795ee9af
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
index 0339de37d..0339de37d 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
index b57cfb3d2..b57cfb3d2 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_light.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
new file mode 100644
index 000000000..8e74c6723
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
new file mode 100644
index 000000000..1ca1ae3e9
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable/btn_keyboard_key_lxx_dark.xml b/java/res/drawable/btn_keyboard_key_lxx_dark.xml
index c82c13829..bb1789ae3 100644
--- a/java/res/drawable/btn_keyboard_key_lxx_dark.xml
+++ b/java/res/drawable/btn_keyboard_key_lxx_dark.xml
@@ -15,11 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Custom label action keys. -->
- <item android:state_active="true" android:state_checked="true" android:state_pressed="true"
- android:drawable="@color/key_background_pressed_lxx_dark" />
- <item android:state_active="true" android:state_checked="true"
- android:drawable="@color/key_background_lxx_dark" />
<!-- Action keys. -->
<item android:state_active="true" android:state_pressed="true"
android:drawable="@drawable/btn_keyboard_key_active_pressed_lxx_dark" />
diff --git a/java/res/drawable/btn_keyboard_key_lxx_light.xml b/java/res/drawable/btn_keyboard_key_lxx_light.xml
index f237fbea9..60fe02dd2 100644
--- a/java/res/drawable/btn_keyboard_key_lxx_light.xml
+++ b/java/res/drawable/btn_keyboard_key_lxx_light.xml
@@ -15,11 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Custom label action keys. -->
- <item android:state_active="true" android:state_checked="true" android:state_pressed="true"
- android:drawable="@color/key_background_pressed_lxx_light" />
- <item android:state_active="true" android:state_checked="true"
- android:drawable="@color/key_background_lxx_light" />
<!-- Action keys. -->
<item android:state_active="true" android:state_pressed="true"
android:drawable="@drawable/btn_keyboard_key_active_pressed_lxx_light" />
diff --git a/java/res/drawable/btn_keyboard_key_popup_lxx_light.xml b/java/res/drawable/btn_keyboard_key_popup_lxx_light.xml
new file mode 100644
index 000000000..d6cd2b831
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_popup_lxx_light.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_popup_selected_lxx_light" />
+ <item android:drawable="@android:color/transparent" />
+</selector>
diff --git a/java/res/drawable/btn_keyboard_spacebar_lxx_dark.xml b/java/res/drawable/btn_keyboard_spacebar_lxx_dark.xml
index 5c595d9ed..e930e40e4 100644
--- a/java/res/drawable/btn_keyboard_spacebar_lxx_dark.xml
+++ b/java/res/drawable/btn_keyboard_spacebar_lxx_dark.xml
@@ -16,6 +16,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
- android:drawable="@color/key_background_pressed_lxx_dark" />
- <item android:drawable="@color/key_background_lxx_dark" />
+ android:drawable="@drawable/btn_keyboard_spacebar_pressed_lxx_dark" />
+ <item android:drawable="@drawable/btn_keyboard_spacebar_normal_lxx_dark" />
</selector>
diff --git a/java/res/drawable/btn_keyboard_spacebar_lxx_light.xml b/java/res/drawable/btn_keyboard_spacebar_lxx_light.xml
index acd19fda4..2b059938d 100644
--- a/java/res/drawable/btn_keyboard_spacebar_lxx_light.xml
+++ b/java/res/drawable/btn_keyboard_spacebar_lxx_light.xml
@@ -16,6 +16,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
- android:drawable="@color/key_background_pressed_lxx_light" />
- <item android:drawable="@color/key_background_lxx_light" />
+ android:drawable="@drawable/btn_keyboard_spacebar_pressed_lxx_light" />
+ <item android:drawable="@drawable/btn_keyboard_spacebar_normal_lxx_light" />
</selector>
diff --git a/java/res/layout/additional_subtype_dialog.xml b/java/res/layout/additional_subtype_dialog.xml
index f97c006d6..b7804f5df 100644
--- a/java/res/layout/additional_subtype_dialog.xml
+++ b/java/res/layout/additional_subtype_dialog.xml
@@ -18,39 +18,60 @@
*/
-->
-<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:columnCount="2"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:padding="8dip">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="left|center_vertical"
- style="?android:attr/textAppearanceSmall"
- android:text="@string/subtype_locale" />
- <Spinner
- android:id="@+id/subtype_locale_spinner"
- android:layout_width="wrap_content"
- android:layout_marginLeft="8dip"
- android:layout_marginBottom="8dip"
- android:layout_marginTop="8dip"
- android:layout_gravity="fill_horizontal|center_vertical"
- android:prompt="@string/subtype_locale" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="left|center_vertical"
- style="?android:attr/textAppearanceSmall"
- android:text="@string/keyboard_layout_set" />
- <Spinner
- android:id="@+id/keyboard_layout_set_spinner"
- android:layout_width="wrap_content"
- android:layout_marginLeft="8dip"
- android:layout_marginBottom="8dip"
- android:layout_marginTop="8dip"
- android:layout_gravity="fill_horizontal|center_vertical"
- android:prompt="@string/keyboard_layout_set" />
-</GridLayout>
+ android:padding="16dip">
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_weight="30"
+ android:layout_height="wrap_content"
+ android:layout_gravity="start|center_vertical"
+ android:gravity="start|left"
+ android:textAlignment="viewStart"
+ style="?android:attr/textAppearanceSmall"
+ android:text="@string/subtype_locale" />
+ <Spinner
+ android:id="@+id/subtype_locale_spinner"
+ android:spinnerMode="dialog"
+ android:layout_width="0dp"
+ android:layout_weight="70"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dip"
+ android:layout_marginBottom="8dip"
+ android:layout_marginTop="8dip"
+ android:layout_gravity="fill_horizontal|center_vertical"
+ android:gravity="start|left"
+ android:prompt="@string/subtype_locale" />
+ </LinearLayout>
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_weight="30"
+ android:layout_height="wrap_content"
+ android:layout_gravity="start|center_vertical"
+ android:textAlignment="viewStart"
+ style="?android:attr/textAppearanceSmall"
+ android:text="@string/keyboard_layout_set" />
+ <Spinner
+ android:id="@+id/keyboard_layout_set_spinner"
+ android:spinnerMode="dialog"
+ android:layout_width="0dp"
+ android:layout_weight="70"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dip"
+ android:layout_marginBottom="8dip"
+ android:layout_marginTop="8dip"
+ android:layout_gravity="fill_horizontal|center_vertical"
+ android:gravity="start|left"
+ android:prompt="@string/keyboard_layout_set" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/java/res/values-ne-rNP/strings.xml b/java/res/values-ne-rNP/strings.xml
index c7c95aeb2..1764e7699 100644
--- a/java/res/values-ne-rNP/strings.xml
+++ b/java/res/values-ne-rNP/strings.xml
@@ -80,7 +80,7 @@
<string name="help_and_feedback" msgid="5328219371839879161">"मद्दत र प्रतिक्रिया"</string>
<string name="select_language" msgid="3693815588777926848">"इनपुट भाषाहरू"</string>
<string name="hint_add_to_dictionary" msgid="573678656946085380">"बचत गर्न पुनः छुनुहोस्"</string>
- <string name="hint_add_to_dictionary_without_word" msgid="3040385779511255101">"बचत गर्न यहाँ छुनुहोस्"</string>
+ <string name="hint_add_to_dictionary_without_word" msgid="3040385779511255101">"सुरक्षित गर्न यहाँ छुनुहोस्"</string>
<string name="has_dictionary" msgid="6071847973466625007">"उपलब्ध शब्दकोश"</string>
<string name="keyboard_layout" msgid="8451164783510487501">"किबोर्ड थिम"</string>
<string name="subtype_en_GB" msgid="88170601942311355">"अंग्रेजी (युके)"</string>
diff --git a/java/res/values-ta-rIN/strings-talkback-descriptions.xml b/java/res/values-ta-rIN/strings-talkback-descriptions.xml
index 911e1a596..0ef07207a 100644
--- a/java/res/values-ta-rIN/strings-talkback-descriptions.xml
+++ b/java/res/values-ta-rIN/strings-talkback-descriptions.xml
@@ -58,7 +58,7 @@
<string name="keyboard_mode_date" msgid="6597407244976713364">"தேதி"</string>
<string name="keyboard_mode_date_time" msgid="3642804408726668808">"தேதி மற்றும் நேரம்"</string>
<string name="keyboard_mode_email" msgid="1239682082047693644">"மின்னஞ்சல்"</string>
- <string name="keyboard_mode_im" msgid="3812086215529493501">"செய்தியிடல்"</string>
+ <string name="keyboard_mode_im" msgid="3812086215529493501">"மெசேஜ்"</string>
<string name="keyboard_mode_number" msgid="5395042245837996809">"எண்"</string>
<string name="keyboard_mode_phone" msgid="2486230278064523665">"ஃபோன்"</string>
<string name="keyboard_mode_text" msgid="9138789594969187494">"உரை"</string>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index e89912a9d..57e73767c 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -113,6 +113,10 @@
<!-- TODO: consolidate key preview linger timeout with the key preview animation parameters. -->
<!-- Delay after key releasing and key press feedback dismissing in millisecond -->
<attr name="keyPreviewLingerTimeout" format="integer" />
+ <!-- Key preview show up animator -->
+ <attr name="keyPreviewShowUpAnimator" format="reference" />
+ <!-- Key preview dismiss animator -->
+ <attr name="keyPreviewDismissAnimator" format="reference" />
<!-- Layout resource for more keys keyboard -->
<attr name="moreKeysKeyboardLayout" format="reference" />
<attr name="backgroundDimAlpha" format="integer" />
@@ -203,7 +207,13 @@
</declare-styleable>
<declare-styleable name="Keyboard">
- <attr name="themeId" format="integer" />
+ <attr name="themeId" format="enum">
+ <!-- This should be aligned with KeyboardTheme.THEME_ID_*. -->
+ <enum name="ICS" value="0" />
+ <enum name="KLP" value="2" />
+ <enum name="LXXLight" value="3" />
+ <enum name="LXXDark" value="4" />
+ </attr>
<!-- Touch position correction -->
<attr name="touchPositionCorrectionData" format="reference" />
<!-- Keyboard top, bottom, left, right edges paddings, in propotion of keyboard height. -->
@@ -274,7 +284,7 @@
<enum name="stickyOff" value="3" />
<enum name="stickyOn" value="4" />
<enum name="action" value="5" />
- <enum name="customAction" value="6" />
+ <enum name="spacebar" value="6" />
</attr>
<!-- The key action flags. -->
<attr name="keyActionFlags" format="integer">
@@ -423,6 +433,13 @@
<enum name="emojiCategory5" value="15" />
<enum name="emojiCategory6" value="16" />
</attr>
+ <!-- This should be aligned with Keyboard.themeId and KeyboardTheme.THEME_ID_* -->
+ <attr name="keyboardTheme" format="enum|string">
+ <enum name="ICS" value="0" />
+ <enum name="KLP" value="2" />
+ <enum name="LXXLight" value="3" />
+ <enum name="LXXDark" value="4" />
+ </attr>
<!-- This should be aligned with KeyboardId.MODE_* -->
<attr name="mode" format="enum|string">
<enum name="text" value="0" />
diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml
index d42b4e900..5453d51c1 100644
--- a/java/res/values/colors.xml
+++ b/java/res/values/colors.xml
@@ -82,4 +82,6 @@
<color name="setup_text_action">@android:color/holo_blue_light</color>
<color name="setup_step_background">@android:color/background_light</color>
<color name="setup_welcome_video_margin_color">#FFCCCCCC</color>
+ <!-- Accent color for the notification. We need to match this to the OS build -->
+ <color name="notification_accent_color">#FF607D8B</color>
</resources>
diff --git a/java/res/values/donottranslate-text-decorator.xml b/java/res/values/donottranslate-text-decorator.xml
index 9c39a4689..a20034930 100644
--- a/java/res/values/donottranslate-text-decorator.xml
+++ b/java/res/values/donottranslate-text-decorator.xml
@@ -31,7 +31,7 @@
<!-- If true, the commit/add-to-text indicator will be suppressed when the word isn't going to
trigger auto-correction. -->
- <bool name="text_decorator_only_for_auto_correction">false</bool>
+ <bool name="text_decorator_only_for_auto_correction">true</bool>
<!-- If true, the commit/add-to-text indicator will be suppressed when the word is already in
the dictionary. -->
@@ -61,18 +61,24 @@
<!-- Coordinates of the closed path to be used to render the commit indicator.
The format is: X[0], Y[0], X[1], Y[1], ..., X[N-1], Y[N-1] -->
<integer-array name="text_decorator_commit_indicator_path">
- <item>180</item>
+ <item>240</item>
+ <item>80</item>
+ <item>212</item>
+ <item>108</item>
+ <item>323</item>
+ <item>220</item>
+ <item>80</item>
+ <item>220</item>
+ <item>80</item>
+ <item>260</item>
<item>323</item>
- <item>97</item>
+ <item>260</item>
+ <item>212</item>
+ <item>372</item>
+ <item>240</item>
+ <item>400</item>
+ <item>400</item>
<item>240</item>
- <item>68</item>
- <item>268</item>
- <item>180</item>
- <item>380</item>
- <item>420</item>
- <item>140</item>
- <item>392</item>
- <item>112</item>
</integer-array>
<!-- Background color to be used to highlight the target text when the add-to-dictionary
diff --git a/java/res/values/keyboard-icons-lxx-dark.xml b/java/res/values/keyboard-icons-lxx-dark.xml
index 305df02cd..2e2fd0abb 100644
--- a/java/res/values/keyboard-icons-lxx-dark.xml
+++ b/java/res/values/keyboard-icons-lxx-dark.xml
@@ -24,7 +24,7 @@
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_dark</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_dark</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_dark</item>
- <item name="iconSpaceKey">@drawable/sym_keyboard_spacebar_lxx_dark</item>
+ <item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_dark</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_dark</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_dark</item>
diff --git a/java/res/values/keyboard-icons-lxx-light.xml b/java/res/values/keyboard-icons-lxx-light.xml
index 866dc682f..099a706fe 100644
--- a/java/res/values/keyboard-icons-lxx-light.xml
+++ b/java/res/values/keyboard-icons-lxx-light.xml
@@ -24,7 +24,7 @@
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_light</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_light</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_light</item>
- <item name="iconSpaceKey">@drawable/sym_keyboard_spacebar_lxx_light</item>
+ <item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_light</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_light</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_light</item>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 2a6495a57..414820be9 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -336,14 +336,20 @@ mobile devices. [CHAR LIMIT=25] -->
<string name="prefs_keypress_vibration_duration_settings">Keypress vibration duration</string>
<!-- Title of the settings for keypress sound volume [CHAR LIMIT=35] -->
<string name="prefs_keypress_sound_volume_settings">Keypress sound volume</string>
+ <!-- Title of the settings for customize key popup animation parameters [CHAR LIMIT=35] -->
+ <string name="prefs_customize_key_preview_animation">Customize key preview animation</string>
<!-- Title of the settings for key popup show up animation duration (in milliseconds) [CHAR LIMIT=35] -->
<string name="prefs_key_popup_show_up_duration_settings" translatable="false">Key popup show up duration</string>
<!-- Title of the settings for key popup dismiss animation duration (in milliseconds) [CHAR LIMIT=35] -->
<string name="prefs_key_popup_dismiss_duration_settings" translatable="false">Key popup dismiss duration</string>
- <!-- Title of the settings for key popup show up animation start scale (in percentile) [CHAR LIMIT=35] -->
- <string name="prefs_key_popup_show_up_start_scale_settings" translatable="false">Key popup show up start scale</string>
- <!-- Title of the settings for key popup dismiss animation end scale (in percentile) [CHAR LIMIT=35] -->
- <string name="prefs_key_popup_dismiss_end_scale_settings" translatable="false">Key popup dismiss end scale</string>
+ <!-- Title of the settings for key popup show up animation start X-scale (in percentile) [CHAR LIMIT=35] -->
+ <string name="prefs_key_popup_show_up_start_x_scale_settings" translatable="false">Key popup show up start X scale</string>
+ <!-- Title of the settings for key popup show up animation start Y-scale (in percentile) [CHAR LIMIT=35] -->
+ <string name="prefs_key_popup_show_up_start_y_scale_settings" translatable="false">Key popup show up start Y scale</string>
+ <!-- Title of the settings for key popup dismiss animation end X-scale (in percentile) [CHAR LIMIT=35] -->
+ <string name="prefs_key_popup_dismiss_end_x_scale_settings" translatable="false">Key popup dismiss end X scale</string>
+ <!-- Title of the settings for key popup dismiss animation end Y-scale (in percentile) [CHAR LIMIT=35] -->
+ <string name="prefs_key_popup_dismiss_end_y_scale_settings" translatable="false">Key popup dismiss end Y scale</string>
<!-- Title of the settings for reading an external dictionary file -->
<string name="prefs_read_external_dictionary">Read external dictionary file</string>
<!-- Message to show when there are no files to install as an external dictionary [CHAR LIMIT=100] -->
diff --git a/java/res/values/themes-ics.xml b/java/res/values/themes-ics.xml
index 6fddcb905..a9c7294a0 100644
--- a/java/res/values/themes-ics.xml
+++ b/java/res/values/themes-ics.xml
@@ -33,8 +33,8 @@
name="Keyboard.ICS"
parent="Keyboard"
>
- <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
- <item name="themeId">2</item>
+ <!-- This should be aligned with KeyboardTheme.THEME_ID_* -->
+ <item name="themeId">ICS</item>
</style>
<style
name="KeyboardView.ICS"
@@ -59,6 +59,8 @@
>
<item name="keyPreviewBackground">@drawable/keyboard_key_feedback_ics</item>
<item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
+ <item name="keyPreviewShowUpAnimator">@anim/key_preview_show_up_holo</item>
+ <item name="keyPreviewDismissAnimator">@anim/key_preview_dismiss_holo</item>
<item name="gestureFloatingPreviewTextColor">@color/highlight_color_ics</item>
<item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item>
<item name="gestureTrailColor">@color/highlight_color_ics</item>
diff --git a/java/res/values/themes-klp.xml b/java/res/values/themes-klp.xml
index c9b83316c..da5e27fa1 100644
--- a/java/res/values/themes-klp.xml
+++ b/java/res/values/themes-klp.xml
@@ -33,8 +33,8 @@
name="Keyboard.KLP"
parent="Keyboard"
>
- <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
- <item name="themeId">0</item>
+ <!-- This should be aligned with KeyboardTheme.THEME_ID_* -->
+ <item name="themeId">KLP</item>
</style>
<style
name="KeyboardView.KLP"
@@ -59,6 +59,8 @@
>
<item name="keyPreviewBackground">@drawable/keyboard_key_feedback_klp</item>
<item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
+ <item name="keyPreviewShowUpAnimator">@anim/key_preview_show_up_holo</item>
+ <item name="keyPreviewDismissAnimator">@anim/key_preview_dismiss_holo</item>
<item name="gestureFloatingPreviewTextColor">@color/highlight_color_klp</item>
<item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item>
<item name="gestureTrailColor">@color/highlight_color_klp</item>
diff --git a/java/res/values/themes-lxx-dark.xml b/java/res/values/themes-lxx-dark.xml
index 6afbd9b15..c49436c49 100644
--- a/java/res/values/themes-lxx-dark.xml
+++ b/java/res/values/themes-lxx-dark.xml
@@ -33,8 +33,8 @@
name="Keyboard.LXX_Dark"
parent="Keyboard"
>
- <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
- <item name="themeId">4</item>
+ <!-- This should be aligned with KeyboardTheme.THEME_ID_* -->
+ <item name="themeId">LXXDark</item>
</style>
<style
name="KeyboardView.LXX_Dark"
@@ -59,6 +59,8 @@
>
<item name="keyPreviewBackground">@drawable/keyboard_key_feedback_lxx_dark</item>
<item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
+ <item name="keyPreviewShowUpAnimator">@anim/key_preview_show_up_lxx</item>
+ <item name="keyPreviewDismissAnimator">@anim/key_preview_dismiss_lxx</item>
<item name="gestureFloatingPreviewTextColor">@color/auto_correct_color_lxx_dark</item>
<item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_lxx_dark</item>
<item name="gestureTrailColor">@color/gesture_trail_color_lxx_dark</item>
diff --git a/java/res/values/themes-lxx-light.xml b/java/res/values/themes-lxx-light.xml
index b3ced80a1..6f0fb7131 100644
--- a/java/res/values/themes-lxx-light.xml
+++ b/java/res/values/themes-lxx-light.xml
@@ -33,8 +33,8 @@
name="Keyboard.LXX_Light"
parent="Keyboard"
>
- <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
- <item name="themeId">3</item>
+ <!-- This should be aligned with KeyboardTheme.THEME_ID_* -->
+ <item name="themeId">LXXLight</item>
</style>
<style
name="KeyboardView.LXX_Light"
@@ -59,6 +59,8 @@
>
<item name="keyPreviewBackground">@drawable/keyboard_key_feedback_lxx_light</item>
<item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
+ <item name="keyPreviewShowUpAnimator">@anim/key_preview_show_up_lxx</item>
+ <item name="keyPreviewDismissAnimator">@anim/key_preview_dismiss_lxx</item>
<item name="gestureFloatingPreviewTextColor">@color/auto_correct_color_lxx_light</item>
<item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_lxx_light</item>
<item name="gestureTrailColor">@color/gesture_trail_color_lxx_light</item>
@@ -98,8 +100,7 @@
parent="KeyboardView.LXX_Light"
>
<item name="android:background">@drawable/keyboard_popup_panel_background_lxx_light</item>
- <!-- Reuse KLP key background -->
- <item name="keyBackground">@drawable/btn_keyboard_key_popup_klp</item>
+ <item name="keyBackground">@drawable/btn_keyboard_key_popup_lxx_light</item>
<item name="keyTypeface">normal</item>
<item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item>
</style>
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index c750a9319..006cda370 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -86,6 +86,7 @@
<key-style
latin:styleName="spaceKeyStyle"
latin:keySpec="!icon/space_key|!code/key_space"
+ latin:backgroundType="spacebar"
latin:keyActionFlags="noKeyPreview|enableLongPress" />
<!-- U+200C: ZERO WIDTH NON-JOINER
U+200D: ZERO WIDTH JOINER -->
diff --git a/java/res/xml-sw600dp/key_styles_enter.xml b/java/res/xml-sw600dp/key_styles_enter.xml
index c20523b2a..0227d811b 100644
--- a/java/res/xml-sw600dp/key_styles_enter.xml
+++ b/java/res/xml-sw600dp/key_styles_enter.xml
@@ -224,12 +224,24 @@
</case>
<case
latin:imeAction="actionCustomLabel"
+ latin:keyboardTheme="ICS|KLP"
>
<key-style
latin:styleName="enterKeyStyle"
latin:keySpec="dummy_label|!code/key_enter"
latin:keyLabelFlags="fromCustomActionLabel"
- latin:backgroundType="customAction"
+ latin:backgroundType="action"
+ latin:parentStyle="defaultEnterKeyStyle" />
+ </case>
+ <case
+ latin:imeAction="actionCustomLabel"
+ latin:keyboardTheme="LXXLight|LXXDark"
+ >
+ <key-style
+ latin:styleName="enterKeyStyle"
+ latin:keySpec="dummy_label|!code/key_enter"
+ latin:keyLabelFlags="fromCustomActionLabel"
+ latin:backgroundType="functional"
latin:parentStyle="defaultEnterKeyStyle" />
</case>
<!-- imeAction is either actionNone or actionUnspecified. -->
diff --git a/java/res/xml-sw600dp/rows_number_normal.xml b/java/res/xml-sw600dp/rows_number_normal.xml
index 757e77933..7a4700d5a 100644
--- a/java/res/xml-sw600dp/rows_number_normal.xml
+++ b/java/res/xml-sw600dp/rows_number_normal.xml
@@ -141,9 +141,8 @@
</Row>
<Row>
<Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="30%p"
- latin:backgroundType="functional" />
+ latin:keyStyle="tabletNumSpaceKeyStyle"
+ latin:keyWidth="30%p" />
<Key
latin:keyStyle="numStarKeyStyle"
latin:keyXPos="31%p" />
diff --git a/java/res/xml-sw600dp/rows_phone.xml b/java/res/xml-sw600dp/rows_phone.xml
index 9022bc532..612397a90 100644
--- a/java/res/xml-sw600dp/rows_phone.xml
+++ b/java/res/xml-sw600dp/rows_phone.xml
@@ -107,9 +107,8 @@
</Row>
<Row>
<Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="30%p"
- latin:backgroundType="functional" />
+ latin:keyStyle="tabletNumSpaceKeyStyle"
+ latin:keyWidth="30%p" />
<Key
latin:keyStyle="numStarKeyStyle"
latin:keyXPos="31%p" />
diff --git a/java/res/xml/key_space_symbols.xml b/java/res/xml/key_space_symbols.xml
index 0ce522889..047de9f24 100644
--- a/java/res/xml/key_space_symbols.xml
+++ b/java/res/xml/key_space_symbols.xml
@@ -22,7 +22,6 @@
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<Key
- latin:backgroundType="normal"
latin:keyStyle="spaceKeyStyle"
latin:keyWidth="30%p" />
</merge>
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 167e6f88d..43ee26b07 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -91,6 +91,7 @@
<key-style
latin:styleName="spaceKeyStyle"
latin:keySpec="!icon/space_key|!code/key_space"
+ latin:backgroundType="spacebar"
latin:keyActionFlags="noKeyPreview|enableLongPress" />
<!-- U+200C: ZERO WIDTH NON-JOINER
U+200D: ZERO WIDTH JOINER -->
diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml
index 55dab78c3..7aea1ceff 100644
--- a/java/res/xml/key_styles_enter.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -393,12 +393,24 @@
</case>
<case
latin:imeAction="actionCustomLabel"
+ latin:keyboardTheme="ICS|KLP"
>
<key-style
latin:styleName="enterKeyStyle"
latin:keySpec="dummy_label|!code/key_enter"
latin:keyLabelFlags="fromCustomActionLabel"
- latin:backgroundType="customAction"
+ latin:backgroundType="action"
+ latin:parentStyle="defaultEnterKeyStyle" />
+ </case>
+ <case
+ latin:imeAction="actionCustomLabel"
+ latin:keyboardTheme="LXXLight|LXXDark"
+ >
+ <key-style
+ latin:styleName="enterKeyStyle"
+ latin:keySpec="dummy_label|!code/key_enter"
+ latin:keyLabelFlags="fromCustomActionLabel"
+ latin:backgroundType="functional"
latin:parentStyle="defaultEnterKeyStyle" />
</case>
<!-- imeAction is either actionNone or actionUnspecified. -->
diff --git a/java/res/xml/key_styles_number.xml b/java/res/xml/key_styles_number.xml
index 14b202874..97ae6c6c3 100644
--- a/java/res/xml/key_styles_number.xml
+++ b/java/res/xml/key_styles_number.xml
@@ -123,4 +123,24 @@
latin:keyLabelFlags="alignIconToBottom"
latin:keyActionFlags="enableLongPress"
latin:parentStyle="numKeyBaseStyle" />
+ <!-- TODO: Consolidate these space key styles with numSpaceKeyStyle above by introducing <case>
+ predicator that checks device form-factor. -->
+ <switch>
+ <case latin:keyboardTheme="ICS|KLP">
+ <key-style
+ latin:styleName="tabletNumSpaceKeyStyle"
+ latin:keySpec="!icon/space_key|!code/key_space"
+ latin:backgroundType="functional"
+ latin:keyActionFlags="enableLongPress"
+ latin:parentStyle="numKeyBaseStyle" />
+ </case>
+ <case latin:keyboardTheme="LXXLight|LXXDark">
+ <key-style
+ latin:styleName="tabletNumSpaceKeyStyle"
+ latin:keySpec="!icon/space_key|!code/key_space"
+ latin:backgroundType="spacebar"
+ latin:keyActionFlags="enableLongPress"
+ latin:parentStyle="numKeyBaseStyle" />
+ </case>
+ </switch>
</merge>
diff --git a/java/res/xml/prefs_screen_debug.xml b/java/res/xml/prefs_screen_debug.xml
index 965369a90..c47740268 100644
--- a/java/res/xml/prefs_screen_debug.xml
+++ b/java/res/xml/prefs_screen_debug.xml
@@ -52,19 +52,38 @@
latin:minValue="@integer/config_min_longpress_timeout"
latin:maxValue="@integer/config_max_longpress_timeout"
latin:stepValue="@integer/config_longpress_timeout_step" />
+ <CheckBoxPreference
+ android:key="pref_has_custom_key_preview_animation_params"
+ android:title="@string/prefs_customize_key_preview_animation"
+ android:defaultValue="false"
+ android:persistent="true" />
+ <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+ android:dependency="pref_has_custom_key_preview_animation_params"
+ android:key="pref_key_preview_show_up_start_x_scale"
+ android:title="@string/prefs_key_popup_show_up_start_x_scale_settings"
+ latin:maxValue="100" /> <!-- percent -->
+ <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+ android:dependency="pref_has_custom_key_preview_animation_params"
+ android:key="pref_key_preview_show_up_start_y_scale"
+ android:title="@string/prefs_key_popup_show_up_start_y_scale_settings"
+ latin:maxValue="100" /> <!-- percent -->
<com.android.inputmethod.latin.settings.SeekBarDialogPreference
- android:key="pref_key_preview_show_up_start_scale"
- android:title="@string/prefs_key_popup_show_up_start_scale_settings"
+ android:dependency="pref_has_custom_key_preview_animation_params"
+ android:key="pref_key_preview_dismiss_end_x_scale"
+ android:title="@string/prefs_key_popup_dismiss_end_x_scale_settings"
latin:maxValue="100" /> <!-- percent -->
<com.android.inputmethod.latin.settings.SeekBarDialogPreference
- android:key="pref_key_preview_dismiss_end_scale"
- android:title="@string/prefs_key_popup_dismiss_end_scale_settings"
+ android:dependency="pref_has_custom_key_preview_animation_params"
+ android:key="pref_key_preview_dismiss_end_y_scale"
+ android:title="@string/prefs_key_popup_dismiss_end_y_scale_settings"
latin:maxValue="100" /> <!-- percent -->
<com.android.inputmethod.latin.settings.SeekBarDialogPreference
+ android:dependency="pref_has_custom_key_preview_animation_params"
android:key="pref_key_preview_show_up_duration"
android:title="@string/prefs_key_popup_show_up_duration_settings"
latin:maxValue="100" /> <!-- milliseconds -->
<com.android.inputmethod.latin.settings.SeekBarDialogPreference
+ android:dependency="pref_has_custom_key_preview_animation_params"
android:key="pref_key_preview_dismiss_duration"
android:title="@string/prefs_key_popup_dismiss_duration_settings"
latin:maxValue="100" /> <!-- milliseconds -->
diff --git a/java/src/com/android/inputmethod/compat/CursorAnchorInfoCompatWrapper.java b/java/src/com/android/inputmethod/compat/CursorAnchorInfoCompatWrapper.java
index 24eaec85c..3a86ccbda 100644
--- a/java/src/com/android/inputmethod/compat/CursorAnchorInfoCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/CursorAnchorInfoCompatWrapper.java
@@ -23,34 +23,16 @@ import com.android.inputmethod.annotations.UsedForTesting;
@UsedForTesting
public final class CursorAnchorInfoCompatWrapper {
- public static final int CHARACTER_RECT_TYPE_MASK = 0x0f;
/**
- * Type for {@link #CHARACTER_RECT_TYPE_MASK}: the editor did not specify any type of this
- * character. Editor authors should not use this flag.
+ * The insertion marker or character bounds have at least one visible region.
*/
- public static final int CHARACTER_RECT_TYPE_UNSPECIFIED = 0;
+ public static final int FLAG_HAS_VISIBLE_REGION = 0x01;
/**
- * Type for {@link #CHARACTER_RECT_TYPE_MASK}: the character is entirely visible.
+ * The insertion marker or character bounds have at least one invisible (clipped) region.
*/
- public static final int CHARACTER_RECT_TYPE_FULLY_VISIBLE = 1;
-
- /**
- * Type for {@link #CHARACTER_RECT_TYPE_MASK}: some area of the character is invisible.
- */
- public static final int CHARACTER_RECT_TYPE_PARTIALLY_VISIBLE = 2;
-
- /**
- * Type for {@link #CHARACTER_RECT_TYPE_MASK}: the character is entirely invisible.
- */
- public static final int CHARACTER_RECT_TYPE_INVISIBLE = 3;
-
- /**
- * Type for {@link #CHARACTER_RECT_TYPE_MASK}: the editor gave up to calculate the rectangle
- * for this character. Input method authors should ignore the returned rectangle.
- */
- public static final int CHARACTER_RECT_TYPE_NOT_FEASIBLE = 4;
+ public static final int FLAG_HAS_INVISIBLE_REGION = 0x02;
// Note that CursorAnchorInfo has been introduced in API level XX (Build.VERSION_CODE.LXX).
private static final CompatUtils.ClassWrapper sCursorAnchorInfoClass;
@@ -63,7 +45,7 @@ public final class CursorAnchorInfoCompatWrapper {
private static final CompatUtils.ToFloatMethodWrapper sGetInsertionMarkerHorizontalMethod;
private static final CompatUtils.ToFloatMethodWrapper sGetInsertionMarkerTopMethod;
private static final CompatUtils.ToObjectMethodWrapper<Matrix> sGetMatrixMethod;
- private static final CompatUtils.ToBooleanMethodWrapper sIsInsertionMarkerClippedMethod;
+ private static final CompatUtils.ToIntMethodWrapper sGetInsertionMarkerFlagsMethod;
private static int COMPOSING_TEXT_START_DEFAULT = -1;
static {
@@ -72,7 +54,7 @@ public final class CursorAnchorInfoCompatWrapper {
sGetCharacterRectMethod = sCursorAnchorInfoClass.getMethod(
"getCharacterRect", (RectF)null, int.class);
sGetCharacterRectFlagsMethod = sCursorAnchorInfoClass.getPrimitiveMethod(
- "getCharacterRectFlags", CHARACTER_RECT_TYPE_UNSPECIFIED, int.class);
+ "getCharacterRectFlags", 0, int.class);
sGetComposingTextMethod = sCursorAnchorInfoClass.getMethod(
"getComposingText", (CharSequence)null);
sGetComposingTextStartMethod = sCursorAnchorInfoClass.getPrimitiveMethod(
@@ -86,8 +68,8 @@ public final class CursorAnchorInfoCompatWrapper {
sGetInsertionMarkerTopMethod = sCursorAnchorInfoClass.getPrimitiveMethod(
"getInsertionMarkerTop", 0.0f);
sGetMatrixMethod = sCursorAnchorInfoClass.getMethod("getMatrix", (Matrix)null);
- sIsInsertionMarkerClippedMethod = sCursorAnchorInfoClass.getPrimitiveMethod(
- "isInsertionMarkerClipped", false);
+ sGetInsertionMarkerFlagsMethod = sCursorAnchorInfoClass.getPrimitiveMethod(
+ "getInsertionMarkerFlags", 0);
}
@UsedForTesting
@@ -154,7 +136,7 @@ public final class CursorAnchorInfoCompatWrapper {
return sGetInsertionMarkerTopMethod.invoke(mInstance);
}
- public boolean isInsertionMarkerClipped() {
- return sIsInsertionMarkerClippedMethod.invoke(mInstance);
+ public int getInsertionMarkerFlags() {
+ return sGetInsertionMarkerFlagsMethod.invoke(mInstance);
}
}
diff --git a/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java
index 862ec8a58..a5c71b22f 100644
--- a/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java
@@ -21,30 +21,29 @@ import android.view.inputmethod.InputMethodManager;
public final class InputConnectionCompatUtils {
private static final CompatUtils.ClassWrapper sInputConnectionType;
- private static final CompatUtils.ToBooleanMethodWrapper sRequestUpdateCursorAnchorInfoMethod;
+ private static final CompatUtils.ToBooleanMethodWrapper sRequestCursorUpdatesMethod;
static {
sInputConnectionType = new CompatUtils.ClassWrapper(InputConnection.class);
- sRequestUpdateCursorAnchorInfoMethod = sInputConnectionType.getPrimitiveMethod(
- "requestUpdateCursorAnchorInfo", false, int.class);
+ sRequestCursorUpdatesMethod = sInputConnectionType.getPrimitiveMethod(
+ "requestCursorUpdates", false, int.class);
}
- public static boolean isRequestUpdateCursorAnchorInfoAvailable() {
- return sRequestUpdateCursorAnchorInfoMethod != null;
+ public static boolean isRequestCursorUpdatesAvailable() {
+ return sRequestCursorUpdatesMethod != null;
}
/**
- * Local copies of some constants in CursorAnchorInfoRequest until the SDK becomes publicly
- * available.
+ * Local copies of some constants in InputConnection until the SDK becomes publicly available.
*/
- private static int REQUEST_UPDATE_CURSOR_UPDATE_IMMEDIATE = 1 << 0;
- private static int REQUEST_UPDATE_CURSOR_UPDATE_MONITOR = 1 << 1;
+ private static int CURSOR_UPDATE_IMMEDIATE = 1 << 0;
+ private static int CURSOR_UPDATE_MONITOR = 1 << 1;
- private static boolean requestUpdateCursorAnchorInfoImpl(final InputConnection inputConnection,
+ private static boolean requestCursorUpdatesImpl(final InputConnection inputConnection,
final int cursorUpdateMode) {
- if (!isRequestUpdateCursorAnchorInfoAvailable()) {
+ if (!isRequestCursorUpdatesAvailable()) {
return false;
}
- return sRequestUpdateCursorAnchorInfoMethod.invoke(inputConnection, cursorUpdateMode);
+ return sRequestCursorUpdatesMethod.invoke(inputConnection, cursorUpdateMode);
}
/**
@@ -56,11 +55,10 @@ public final class InputConnectionCompatUtils {
* as soon as possible to notify the current cursor/anchor position to the input method.
* @return {@code false} if the request is not handled. Otherwise returns {@code true}.
*/
- public static boolean requestUpdateCursorAnchorInfo(final InputConnection inputConnection,
+ public static boolean requestCursorUpdates(final InputConnection inputConnection,
final boolean enableMonitor, final boolean requestImmediateCallback) {
- final int cursorUpdateMode = (enableMonitor ? REQUEST_UPDATE_CURSOR_UPDATE_MONITOR : 0)
- | (requestImmediateCallback ? REQUEST_UPDATE_CURSOR_UPDATE_IMMEDIATE : 0);
- return requestUpdateCursorAnchorInfoImpl(inputConnection, cursorUpdateMode);
+ final int cursorUpdateMode = (enableMonitor ? CURSOR_UPDATE_MONITOR : 0)
+ | (requestImmediateCallback ? CURSOR_UPDATE_IMMEDIATE : 0);
+ return requestCursorUpdatesImpl(inputConnection, cursorUpdateMode);
}
-
}
diff --git a/java/src/com/android/inputmethod/compat/NotificationCompatUtils.java b/java/src/com/android/inputmethod/compat/NotificationCompatUtils.java
new file mode 100644
index 000000000..eb180071e
--- /dev/null
+++ b/java/src/com/android/inputmethod/compat/NotificationCompatUtils.java
@@ -0,0 +1,83 @@
+/*
+ * 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.compat;
+
+import android.app.Notification;
+import android.os.Build;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+public class NotificationCompatUtils {
+ // Note that TextInfo.getCharSequence() is supposed to be available in API level 21 and later.
+ private static final Method METHOD_setColor =
+ CompatUtils.getMethod(Notification.Builder.class, "setColor", int.class);
+ private static final Method METHOD_setVisibility =
+ CompatUtils.getMethod(Notification.Builder.class, "setVisibility", int.class);
+ private static final Method METHOD_setCategory =
+ CompatUtils.getMethod(Notification.Builder.class, "setCategory", String.class);
+ private static final Method METHOD_setPriority =
+ CompatUtils.getMethod(Notification.Builder.class, "setPriority", int.class);
+ private static final Method METHOD_build =
+ CompatUtils.getMethod(Notification.Builder.class, "build");
+ private static final Field FIELD_VISIBILITY_SECRET =
+ CompatUtils.getField(Notification.class, "VISIBILITY_SECRET");
+ private static final int VISIBILITY_SECRET = null == FIELD_VISIBILITY_SECRET ? 0
+ : (Integer) CompatUtils.getFieldValue(null /* receiver */, null /* defaultValue */,
+ FIELD_VISIBILITY_SECRET);
+ private static final Field FIELD_CATEGORY_RECOMMENDATION =
+ CompatUtils.getField(Notification.class, "CATEGORY_RECOMMENDATION");
+ private static final String CATEGORY_RECOMMENDATION = null == FIELD_CATEGORY_RECOMMENDATION ? ""
+ : (String) CompatUtils.getFieldValue(null /* receiver */, null /* defaultValue */,
+ FIELD_CATEGORY_RECOMMENDATION);
+ private static final Field FIELD_PRIORITY_LOW =
+ CompatUtils.getField(Notification.class, "PRIORITY_LOW");
+ private static final int PRIORITY_LOW = null == FIELD_PRIORITY_LOW ? 0
+ : (Integer) CompatUtils.getFieldValue(null /* receiver */, null /* defaultValue */,
+ FIELD_PRIORITY_LOW);
+
+ private NotificationCompatUtils() {
+ // This class is non-instantiable.
+ }
+
+ // Sets the accent color
+ public static void setColor(final Notification.Builder builder, final int color) {
+ CompatUtils.invoke(builder, null, METHOD_setColor, color);
+ }
+
+ public static void setVisibilityToSecret(final Notification.Builder builder) {
+ CompatUtils.invoke(builder, null, METHOD_setVisibility, VISIBILITY_SECRET);
+ }
+
+ public static void setCategoryToRecommendation(final Notification.Builder builder) {
+ CompatUtils.invoke(builder, null, METHOD_setCategory, CATEGORY_RECOMMENDATION);
+ }
+
+ public static void setPriorityToLow(final Notification.Builder builder) {
+ CompatUtils.invoke(builder, null, METHOD_setPriority, PRIORITY_LOW);
+ }
+
+ public static Notification build(final Notification.Builder builder) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ // #build was added in API level 16, JELLY_BEAN
+ return (Notification) CompatUtils.invoke(builder, null, METHOD_build);
+ } else {
+ // #getNotification was deprecated in API level 16, JELLY_BEAN
+ return builder.getNotification();
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
index afbe8c890..0f00be133 100644
--- a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
@@ -34,6 +34,9 @@ public final class ViewCompatUtils {
// Note that View.setElevation(float) has been introduced in API level 21.
private static final Method METHOD_setElevation = CompatUtils.getMethod(
View.class, "setElevation", float.class);
+ // Note that View.setTextAlignment(int) has been introduced in API level 17.
+ private static final Method METHOD_setTextAlignment = CompatUtils.getMethod(
+ View.class, "setTextAlignment", int.class);
private ViewCompatUtils() {
// This utility class is not publicly instantiable.
@@ -56,9 +59,19 @@ public final class ViewCompatUtils {
}
public static void setElevation(final View view, final float elevation) {
- if (METHOD_setElevation == null) {
- return;
- }
CompatUtils.invoke(view, null, METHOD_setElevation, elevation);
}
+
+ // These TEXT_ALIGNMENT_* constants have been introduced in API 17.
+ public static final int TEXT_ALIGNMENT_INHERIT = 0;
+ public static final int TEXT_ALIGNMENT_GRAVITY = 1;
+ public static final int TEXT_ALIGNMENT_TEXT_START = 2;
+ public static final int TEXT_ALIGNMENT_TEXT_END = 3;
+ public static final int TEXT_ALIGNMENT_CENTER = 4;
+ public static final int TEXT_ALIGNMENT_VIEW_START = 5;
+ public static final int TEXT_ALIGNMENT_VIEW_END = 6;
+
+ public static void setTextAlignment(final View view, final int textAlignment) {
+ CompatUtils.invoke(view, null, METHOD_setTextAlignment, textAlignment);
+ }
}
diff --git a/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java b/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java
index 3d294acd7..3aa026e77 100644
--- a/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java
+++ b/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java
@@ -120,9 +120,10 @@ public final class ActionBatch {
if (MetadataDbHelper.STATUS_DOWNLOADING == status) {
// The word list is still downloading. Cancel the download and revert the
// word list status to "available".
- manager.remove(values.getAsLong(MetadataDbHelper.PENDINGID_COLUMN));
+ manager.remove(values.getAsLong(MetadataDbHelper.PENDINGID_COLUMN));
MetadataDbHelper.markEntryAsAvailable(db, mWordList.mId, mWordList.mVersion);
- } else if (MetadataDbHelper.STATUS_AVAILABLE != status) {
+ } else if (MetadataDbHelper.STATUS_AVAILABLE != status
+ && MetadataDbHelper.STATUS_RETRYING != status) {
// Should never happen
Log.e(TAG, "Unexpected state of the word list '" + mWordList.mId + "' : " + status
+ " for an upgrade action. Fall back to download.");
@@ -325,8 +326,8 @@ public final class ActionBatch {
mWordList.mId, mWordList.mLocale, mWordList.mDescription,
null == mWordList.mLocalFilename ? "" : mWordList.mLocalFilename,
mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mRawChecksum,
- mWordList.mChecksum, mWordList.mFileSize, mWordList.mVersion,
- mWordList.mFormatVersion);
+ mWordList.mChecksum, mWordList.mRetryCount, mWordList.mFileSize,
+ mWordList.mVersion, mWordList.mFormatVersion);
PrivateLog.log("Insert 'available' record for " + mWordList.mDescription
+ " and locale " + mWordList.mLocale);
db.insert(MetadataDbHelper.METADATA_TABLE_NAME, null, values);
@@ -374,9 +375,9 @@ public final class ActionBatch {
final ContentValues values = MetadataDbHelper.makeContentValues(0,
MetadataDbHelper.TYPE_BULK, MetadataDbHelper.STATUS_INSTALLED,
mWordList.mId, mWordList.mLocale, mWordList.mDescription,
- "", mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mRawChecksum,
- mWordList.mChecksum, mWordList.mFileSize, mWordList.mVersion,
- mWordList.mFormatVersion);
+ "", mWordList.mRemoteFilename, mWordList.mLastUpdate,
+ mWordList.mRawChecksum, mWordList.mChecksum, mWordList.mRetryCount,
+ mWordList.mFileSize, mWordList.mVersion, mWordList.mFormatVersion);
PrivateLog.log("Insert 'preinstalled' record for " + mWordList.mDescription
+ " and locale " + mWordList.mLocale);
db.insert(MetadataDbHelper.METADATA_TABLE_NAME, null, values);
@@ -417,8 +418,8 @@ public final class ActionBatch {
mWordList.mId, mWordList.mLocale, mWordList.mDescription,
oldValues.getAsString(MetadataDbHelper.LOCAL_FILENAME_COLUMN),
mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mRawChecksum,
- mWordList.mChecksum, mWordList.mFileSize, mWordList.mVersion,
- mWordList.mFormatVersion);
+ mWordList.mChecksum, mWordList.mRetryCount, mWordList.mFileSize,
+ mWordList.mVersion, mWordList.mFormatVersion);
PrivateLog.log("Updating record for " + mWordList.mDescription
+ " and locale " + mWordList.mLocale);
db.update(MetadataDbHelper.METADATA_TABLE_NAME, values,
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
index f5bd84c8c..e748321e2 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
@@ -470,7 +470,11 @@ public final class DictionaryProvider extends ContentProvider {
} else if (MetadataDbHelper.STATUS_INSTALLED == status) {
final String result = uri.getQueryParameter(QUERY_PARAMETER_DELETE_RESULT);
if (QUERY_PARAMETER_FAILURE.equals(result)) {
- UpdateHandler.markAsBroken(getContext(), clientId, wordlistId, version);
+ if (DEBUG) {
+ Log.d(TAG,
+ "Dictionary is broken, attempting to retry download & installation.");
+ }
+ UpdateHandler.markAsBrokenOrRetrying(getContext(), clientId, wordlistId, version);
}
final String localFilename =
wordList.getAsString(MetadataDbHelper.LOCAL_FILENAME_COLUMN);
diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
index 17dd781d5..e9dde4245 100644
--- a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
+++ b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
@@ -47,10 +47,13 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
// used to identify the versions for upgrades. This should never change going forward.
private static final int METADATA_DATABASE_VERSION_WITH_CLIENTID = 6;
// The current database version.
- private static final int CURRENT_METADATA_DATABASE_VERSION = 9;
+ private static final int CURRENT_METADATA_DATABASE_VERSION = 10;
private final static long NOT_A_DOWNLOAD_ID = -1;
+ // The number of retries allowed when attempting to download a broken dictionary.
+ public static final int DICTIONARY_RETRY_THRESHOLD = 2;
+
public static final String METADATA_TABLE_NAME = "pendingUpdates";
static final String CLIENT_TABLE_NAME = "clients";
public static final String PENDINGID_COLUMN = "pendingid"; // Download Manager ID
@@ -68,7 +71,8 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
public static final String FORMATVERSION_COLUMN = "formatversion";
public static final String FLAGS_COLUMN = "flags";
public static final String RAW_CHECKSUM_COLUMN = "rawChecksum";
- public static final int COLUMN_COUNT = 14;
+ public static final String RETRY_COUNT_COLUMN = "remainingRetries";
+ public static final int COLUMN_COUNT = 15;
private static final String CLIENT_CLIENT_ID_COLUMN = "clientid";
private static final String CLIENT_METADATA_URI_COLUMN = "uri";
@@ -98,6 +102,8 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
// Deleting: the user marked this word list to be deleted, but it has not been yet because
// Latin IME is not up yet.
public static final int STATUS_DELETING = 5;
+ // Retry: dictionary got corrupted, so an attempt must be done to download & install it again.
+ public static final int STATUS_RETRYING = 6;
// Types, for storing in the TYPE_COLUMN
// This is metadata about what is available.
@@ -124,6 +130,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
+ FORMATVERSION_COLUMN + " INTEGER, "
+ FLAGS_COLUMN + " INTEGER, "
+ RAW_CHECKSUM_COLUMN + " TEXT,"
+ + RETRY_COUNT_COLUMN + " INTEGER, "
+ "PRIMARY KEY (" + WORDLISTID_COLUMN + "," + VERSION_COLUMN + "));";
private static final String METADATA_CREATE_CLIENT_TABLE =
"CREATE TABLE IF NOT EXISTS " + CLIENT_TABLE_NAME + " ("
@@ -140,7 +147,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
STATUS_COLUMN, WORDLISTID_COLUMN, LOCALE_COLUMN, DESCRIPTION_COLUMN,
LOCAL_FILENAME_COLUMN, REMOTE_FILENAME_COLUMN, DATE_COLUMN, CHECKSUM_COLUMN,
FILESIZE_COLUMN, VERSION_COLUMN, FORMATVERSION_COLUMN, FLAGS_COLUMN,
- RAW_CHECKSUM_COLUMN };
+ RAW_CHECKSUM_COLUMN, RETRY_COUNT_COLUMN };
// List of all client table columns.
static final String[] CLIENT_TABLE_COLUMNS = { CLIENT_CLIENT_ID_COLUMN,
CLIENT_METADATA_URI_COLUMN, CLIENT_PENDINGID_COLUMN, FLAGS_COLUMN };
@@ -219,7 +226,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
createClientTable(db);
}
- private void addRawChecksumColumnUnlessPresent(final SQLiteDatabase db, final String clientId) {
+ private void addRawChecksumColumnUnlessPresent(final SQLiteDatabase db) {
try {
db.execSQL("SELECT " + RAW_CHECKSUM_COLUMN + " FROM "
+ METADATA_TABLE_NAME + " LIMIT 0;");
@@ -230,6 +237,17 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
}
}
+ private void addRetryCountColumnUnlessPresent(final SQLiteDatabase db) {
+ try {
+ db.execSQL("SELECT " + RETRY_COUNT_COLUMN + " FROM "
+ + METADATA_TABLE_NAME + " LIMIT 0;");
+ } catch (SQLiteException e) {
+ Log.i(TAG, "No " + RETRY_COUNT_COLUMN + " column : creating it");
+ db.execSQL("ALTER TABLE " + METADATA_TABLE_NAME + " ADD COLUMN "
+ + RETRY_COUNT_COLUMN + " INTEGER DEFAULT " + DICTIONARY_RETRY_THRESHOLD + ";");
+ }
+ }
+
/**
* Upgrade the database. Upgrade from version 3 is supported.
* Version 3 has a DB named METADATA_DATABASE_NAME_STEM containing a table METADATA_TABLE_NAME.
@@ -280,7 +298,14 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
// strengthen the system against corrupted dictionary files.
// The most secure way to upgrade a database is to just test for the column presence, and
// add it if it's not there.
- addRawChecksumColumnUnlessPresent(db, mClientId);
+ addRawChecksumColumnUnlessPresent(db);
+
+ // A retry count column that did not exist in the previous versions was added that
+ // corresponds to the number of download & installation attempts that have been made
+ // in order to strengthen the system recovery from corrupted dictionary files.
+ // The most secure way to upgrade a database is to just test for the column presence, and
+ // add it if it's not there.
+ addRetryCountColumnUnlessPresent(db);
}
/**
@@ -452,8 +477,8 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
public static ContentValues makeContentValues(final int pendingId, final int type,
final int status, final String wordlistId, final String locale,
final String description, final String filename, final String url, final long date,
- final String rawChecksum, final String checksum, final long filesize, final int version,
- final int formatVersion) {
+ final String rawChecksum, final String checksum, final int retryCount,
+ final long filesize, final int version, final int formatVersion) {
final ContentValues result = new ContentValues(COLUMN_COUNT);
result.put(PENDINGID_COLUMN, pendingId);
result.put(TYPE_COLUMN, type);
@@ -465,6 +490,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
result.put(REMOTE_FILENAME_COLUMN, url);
result.put(DATE_COLUMN, date);
result.put(RAW_CHECKSUM_COLUMN, rawChecksum);
+ result.put(RETRY_COUNT_COLUMN, retryCount);
result.put(CHECKSUM_COLUMN, checksum);
result.put(FILESIZE_COLUMN, filesize);
result.put(VERSION_COLUMN, version);
@@ -502,6 +528,9 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
if (null == result.get(DATE_COLUMN)) result.put(DATE_COLUMN, 0);
// Raw checksum unknown unless specified
if (null == result.get(RAW_CHECKSUM_COLUMN)) result.put(RAW_CHECKSUM_COLUMN, "");
+ // Retry column 0 unless specified
+ if (null == result.get(RETRY_COUNT_COLUMN)) result.put(RETRY_COUNT_COLUMN,
+ DICTIONARY_RETRY_THRESHOLD);
// Checksum unknown unless specified
if (null == result.get(CHECKSUM_COLUMN)) result.put(CHECKSUM_COLUMN, "");
// No filesize unless specified
@@ -551,6 +580,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
putIntResult(result, cursor, DATE_COLUMN);
putStringResult(result, cursor, RAW_CHECKSUM_COLUMN);
putStringResult(result, cursor, CHECKSUM_COLUMN);
+ putIntResult(result, cursor, RETRY_COUNT_COLUMN);
putIntResult(result, cursor, FILESIZE_COLUMN);
putIntResult(result, cursor, VERSION_COLUMN);
putIntResult(result, cursor, FORMATVERSION_COLUMN);
@@ -676,8 +706,16 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
final String id, final int version) {
final Cursor cursor = db.query(METADATA_TABLE_NAME,
METADATA_TABLE_COLUMNS,
- WORDLISTID_COLUMN + "= ? AND " + VERSION_COLUMN + "= ?",
- new String[] { id, Integer.toString(version) }, null, null, null);
+ WORDLISTID_COLUMN + "= ? AND " + VERSION_COLUMN + "= ? AND "
+ + FORMATVERSION_COLUMN + "<= ?",
+ new String[]
+ { id,
+ Integer.toString(version),
+ Integer.toString(UpdateHandler.MAXIMUM_SUPPORTED_FORMAT_VERSION)
+ },
+ null /* groupBy */,
+ null /* having */,
+ FORMATVERSION_COLUMN + " DESC"/* orderBy */);
if (null == cursor) {
return null;
}
@@ -706,7 +744,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
return null;
}
try {
- // This is a lookup by primary key, so there can't be more than one result.
+ // Return the first result from the list of results.
return getFirstLineAsContentValues(cursor);
} finally {
cursor.close();
@@ -1085,4 +1123,27 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
final int version) {
markEntryAs(db, id, version, STATUS_DELETING, NOT_A_DOWNLOAD_ID);
}
+
+ /**
+ * Checks retry counts and marks the word list as retrying if retry is possible.
+ *
+ * @param db the metadata database.
+ * @param id the id of the word list.
+ * @param version the version of the word list.
+ * @return {@code true} if the retry is possible.
+ */
+ public static boolean maybeMarkEntryAsRetrying(final SQLiteDatabase db, final String id,
+ final int version) {
+ final ContentValues values = MetadataDbHelper.getContentValuesByWordListId(db, id, version);
+ int retryCount = values.getAsInteger(MetadataDbHelper.RETRY_COUNT_COLUMN);
+ if (retryCount > 1) {
+ values.put(STATUS_COLUMN, STATUS_RETRYING);
+ values.put(RETRY_COUNT_COLUMN, retryCount - 1);
+ db.update(METADATA_TABLE_NAME, values,
+ WORDLISTID_COLUMN + " = ? AND " + VERSION_COLUMN + " = ?",
+ new String[] { id, Integer.toString(version) });
+ return true;
+ }
+ return false;
+ }
}
diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java b/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java
index d66b69050..639d904a0 100644
--- a/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java
+++ b/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java
@@ -16,6 +16,7 @@
package com.android.inputmethod.dictionarypack;
+import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -55,6 +56,7 @@ public class MetadataHandler {
final int rawChecksumIndex =
results.getColumnIndex(MetadataDbHelper.RAW_CHECKSUM_COLUMN);
final int checksumIndex = results.getColumnIndex(MetadataDbHelper.CHECKSUM_COLUMN);
+ final int retryCountIndex = results.getColumnIndex(MetadataDbHelper.RETRY_COUNT_COLUMN);
final int localFilenameIndex =
results.getColumnIndex(MetadataDbHelper.LOCAL_FILENAME_COLUMN);
final int remoteFilenameIndex =
@@ -70,6 +72,7 @@ public class MetadataHandler {
results.getLong(fileSizeIndex),
results.getString(rawChecksumIndex),
results.getString(checksumIndex),
+ results.getInt(retryCountIndex),
results.getString(localFilenameIndex),
results.getString(remoteFilenameIndex),
results.getInt(versionIndex),
@@ -102,6 +105,22 @@ public class MetadataHandler {
}
/**
+ * Gets the metadata, for a specific dictionary.
+ *
+ * @param context The context to open files over.
+ * @param clientId the client id for retrieving the database. null for default (deprecated).
+ * @param wordListId the word list ID.
+ * @param version the word list version.
+ * @return the current metaData
+ */
+ public static WordListMetadata getCurrentMetadataForWordList(final Context context,
+ final String clientId, final String wordListId, final int version) {
+ final ContentValues contentValues = MetadataDbHelper.getContentValuesByWordListId(
+ MetadataDbHelper.getDb(context, clientId), wordListId, version);
+ return WordListMetadata.createFromContentValues(contentValues);
+ }
+
+ /**
* Read metadata from a stream.
* @param input The stream to read from.
* @return The read metadata.
diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java b/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java
index 52290cadc..2b67ae9ff 100644
--- a/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java
+++ b/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java
@@ -83,6 +83,7 @@ public class MetadataParser {
Long.parseLong(arguments.get(FILESIZE_FIELD_NAME)),
arguments.get(RAW_CHECKSUM_FIELD_NAME),
arguments.get(CHECKSUM_FIELD_NAME),
+ MetadataDbHelper.DICTIONARY_RETRY_THRESHOLD /* retryCount */,
null,
arguments.get(REMOTE_FILENAME_FIELD_NAME),
Integer.parseInt(arguments.get(VERSION_FIELD_NAME)),
diff --git a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
index 95a094232..d8c5f3165 100644
--- a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
+++ b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
@@ -37,6 +37,7 @@ import android.util.Log;
import com.android.inputmethod.compat.ConnectivityManagerCompatUtils;
import com.android.inputmethod.compat.DownloadManagerCompatUtils;
+import com.android.inputmethod.compat.NotificationCompatUtils;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.utils.ApplicationUtils;
import com.android.inputmethod.latin.utils.DebugLogUtils;
@@ -783,6 +784,10 @@ public final class UpdateHandler {
} else {
final SQLiteDatabase db = MetadataDbHelper.getDb(context, clientId);
if (newInfo.mVersion == currentInfo.mVersion) {
+ if (newInfo.mRemoteFilename == currentInfo.mRemoteFilename) {
+ // If the dictionary url hasn't changed, we should preserve the retryCount.
+ newInfo.mRetryCount = currentInfo.mRetryCount;
+ }
// If it's the same id/version, we update the DB with the new values.
// It doesn't matter too much if they didn't change.
actions.add(new ActionBatch.UpdateDataAction(clientId, newInfo));
@@ -858,7 +863,7 @@ public final class UpdateHandler {
final String language = (null == locale ? "" : locale.getDisplayLanguage());
final String titleFormat = context.getString(R.string.dict_available_notification_title);
final String notificationTitle = String.format(titleFormat, language);
- final Notification notification = new Notification.Builder(context)
+ final Notification.Builder builder = new Notification.Builder(context)
.setAutoCancel(true)
.setContentIntent(notificationIntent)
.setContentTitle(notificationTitle)
@@ -866,8 +871,13 @@ public final class UpdateHandler {
.setTicker(notificationTitle)
.setOngoing(false)
.setOnlyAlertOnce(true)
- .setSmallIcon(R.drawable.ic_notify_dictionary)
- .getNotification();
+ .setSmallIcon(R.drawable.ic_notify_dictionary);
+ NotificationCompatUtils.setColor(builder,
+ context.getResources().getColor(R.color.notification_accent_color));
+ NotificationCompatUtils.setPriorityToLow(builder);
+ NotificationCompatUtils.setVisibilityToSecret(builder);
+ NotificationCompatUtils.setCategoryToRecommendation(builder);
+ final Notification notification = NotificationCompatUtils.build(builder);
notificationManager.notify(DICT_AVAILABLE_NOTIFICATION_ID, notification);
}
@@ -980,16 +990,17 @@ public final class UpdateHandler {
public static void markAsUsed(final Context context, final String clientId,
final String wordlistId, final int version,
final int status, final boolean allowDownloadOnMeteredData) {
- final List<WordListMetadata> currentMetadata =
- MetadataHandler.getCurrentMetadata(context, clientId);
- WordListMetadata wordList = MetadataHandler.findWordListById(currentMetadata, wordlistId);
- if (null == wordList) return;
+ final WordListMetadata wordListMetaData = MetadataHandler.getCurrentMetadataForWordList(
+ context, clientId, wordlistId, version);
+
+ if (null == wordListMetaData) return;
+
final ActionBatch actions = new ActionBatch();
if (MetadataDbHelper.STATUS_DISABLED == status
|| MetadataDbHelper.STATUS_DELETING == status) {
- actions.add(new ActionBatch.EnableAction(clientId, wordList));
+ actions.add(new ActionBatch.EnableAction(clientId, wordListMetaData));
} else if (MetadataDbHelper.STATUS_AVAILABLE == status) {
- actions.add(new ActionBatch.StartDownloadAction(clientId, wordList,
+ actions.add(new ActionBatch.StartDownloadAction(clientId, wordListMetaData,
allowDownloadOnMeteredData));
} else {
Log.e(TAG, "Unexpected state of the word list for markAsUsed : " + status);
@@ -1015,13 +1026,13 @@ public final class UpdateHandler {
// markAsUsed for consistency.
public static void markAsUnused(final Context context, final String clientId,
final String wordlistId, final int version, final int status) {
- final List<WordListMetadata> currentMetadata =
- MetadataHandler.getCurrentMetadata(context, clientId);
- final WordListMetadata wordList =
- MetadataHandler.findWordListById(currentMetadata, wordlistId);
- if (null == wordList) return;
+
+ final WordListMetadata wordListMetaData = MetadataHandler.getCurrentMetadataForWordList(
+ context, clientId, wordlistId, version);
+
+ if (null == wordListMetaData) return;
final ActionBatch actions = new ActionBatch();
- actions.add(new ActionBatch.DisableAction(clientId, wordList));
+ actions.add(new ActionBatch.DisableAction(clientId, wordListMetaData));
actions.execute(context, new LogProblemReporter(TAG));
signalNewDictionaryState(context);
}
@@ -1044,14 +1055,14 @@ public final class UpdateHandler {
*/
public static void markAsDeleting(final Context context, final String clientId,
final String wordlistId, final int version, final int status) {
- final List<WordListMetadata> currentMetadata =
- MetadataHandler.getCurrentMetadata(context, clientId);
- final WordListMetadata wordList =
- MetadataHandler.findWordListById(currentMetadata, wordlistId);
- if (null == wordList) return;
+
+ final WordListMetadata wordListMetaData = MetadataHandler.getCurrentMetadataForWordList(
+ context, clientId, wordlistId, version);
+
+ if (null == wordListMetaData) return;
final ActionBatch actions = new ActionBatch();
- actions.add(new ActionBatch.DisableAction(clientId, wordList));
- actions.add(new ActionBatch.StartDeleteAction(clientId, wordList));
+ actions.add(new ActionBatch.DisableAction(clientId, wordListMetaData));
+ actions.add(new ActionBatch.StartDeleteAction(clientId, wordListMetaData));
actions.execute(context, new LogProblemReporter(TAG));
signalNewDictionaryState(context);
}
@@ -1069,33 +1080,47 @@ public final class UpdateHandler {
*/
public static void markAsDeleted(final Context context, final String clientId,
final String wordlistId, final int version, final int status) {
- final List<WordListMetadata> currentMetadata =
- MetadataHandler.getCurrentMetadata(context, clientId);
- final WordListMetadata wordList =
- MetadataHandler.findWordListById(currentMetadata, wordlistId);
- if (null == wordList) return;
+ final WordListMetadata wordListMetaData = MetadataHandler.getCurrentMetadataForWordList(
+ context, clientId, wordlistId, version);
+
+ if (null == wordListMetaData) return;
+
final ActionBatch actions = new ActionBatch();
- actions.add(new ActionBatch.FinishDeleteAction(clientId, wordList));
+ actions.add(new ActionBatch.FinishDeleteAction(clientId, wordListMetaData));
actions.execute(context, new LogProblemReporter(TAG));
signalNewDictionaryState(context);
}
/**
- * Marks the word list with the passed id as broken.
- *
- * This effectively deletes the entry from the metadata. It doesn't prevent the same
- * word list to be downloaded again at a later time if the same or a new version is
- * available the next time we download the metadata.
+ * Checks whether the word list should be downloaded again; in which case an download &
+ * installation attempt is made. Otherwise the word list is marked broken.
*
* @param context the context to open the database on.
* @param clientId the id of the client.
- * @param wordlistId the id of the word list to mark as broken.
- * @param version the version of the word list to mark as deleted.
+ * @param wordlistId the id of the word list which is broken.
+ * @param version the version of the broken word list.
*/
- public static void markAsBroken(final Context context, final String clientId,
+ public static void markAsBrokenOrRetrying(final Context context, final String clientId,
final String wordlistId, final int version) {
- // TODO: do this on another thread to avoid blocking the UI.
- MetadataDbHelper.deleteEntry(MetadataDbHelper.getDb(context, clientId),
- wordlistId, version);
+ boolean isRetryPossible = MetadataDbHelper.maybeMarkEntryAsRetrying(
+ MetadataDbHelper.getDb(context, clientId), wordlistId, version);
+
+ if (isRetryPossible) {
+ if (DEBUG) {
+ Log.d(TAG, "Attempting to download & install the wordlist again.");
+ }
+ final WordListMetadata wordListMetaData = MetadataHandler.getCurrentMetadataForWordList(
+ context, clientId, wordlistId, version);
+
+ final ActionBatch actions = new ActionBatch();
+ actions.add(new ActionBatch.StartDownloadAction(clientId, wordListMetaData, false));
+ actions.execute(context, new LogProblemReporter(TAG));
+ } else {
+ if (DEBUG) {
+ Log.d(TAG, "Retries for wordlist exhausted, deleting the wordlist from table.");
+ }
+ MetadataDbHelper.deleteEntry(MetadataDbHelper.getDb(context, clientId),
+ wordlistId, version);
+ }
}
}
diff --git a/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java b/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java
index 9e510a68b..59f75e4ed 100644
--- a/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java
+++ b/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java
@@ -36,6 +36,7 @@ public class WordListMetadata {
public final String mRemoteFilename;
public final int mVersion; // version of this word list
public final int mFlags; // Always 0 in this version, reserved for future use
+ public int mRetryCount;
// The locale is matched against the locale requested by the client. The matching algorithm
// is a standard locale matching with fallback; it is implemented in
@@ -51,8 +52,9 @@ public class WordListMetadata {
public WordListMetadata(final String id, final int type,
final String description, final long lastUpdate, final long fileSize,
- final String rawChecksum, final String checksum, final String localFilename,
- final String remoteFilename, final int version, final int formatVersion,
+ final String rawChecksum, final String checksum, final int retryCount,
+ final String localFilename, final String remoteFilename,
+ final int version, final int formatVersion,
final int flags, final String locale) {
mId = id;
mType = type;
@@ -61,6 +63,7 @@ public class WordListMetadata {
mFileSize = fileSize;
mRawChecksum = rawChecksum;
mChecksum = checksum;
+ mRetryCount = retryCount;
mLocalFilename = localFilename;
mRemoteFilename = remoteFilename;
mVersion = version;
@@ -82,6 +85,7 @@ public class WordListMetadata {
final Long fileSize = values.getAsLong(MetadataDbHelper.FILESIZE_COLUMN);
final String rawChecksum = values.getAsString(MetadataDbHelper.RAW_CHECKSUM_COLUMN);
final String checksum = values.getAsString(MetadataDbHelper.CHECKSUM_COLUMN);
+ final int retryCount = values.getAsInteger(MetadataDbHelper.RETRY_COUNT_COLUMN);
final String localFilename = values.getAsString(MetadataDbHelper.LOCAL_FILENAME_COLUMN);
final String remoteFilename = values.getAsString(MetadataDbHelper.REMOTE_FILENAME_COLUMN);
final Integer version = values.getAsInteger(MetadataDbHelper.VERSION_COLUMN);
@@ -103,7 +107,8 @@ public class WordListMetadata {
throw new IllegalArgumentException();
}
return new WordListMetadata(id, type, description, lastUpdate, fileSize, rawChecksum,
- checksum, localFilename, remoteFilename, version, formatVersion, flags, locale);
+ checksum, retryCount, localFilename, remoteFilename, version, formatVersion,
+ flags, locale);
}
@Override
@@ -116,6 +121,7 @@ public class WordListMetadata {
sb.append("\nFileSize : ").append(mFileSize);
sb.append("\nRawChecksum : ").append(mRawChecksum);
sb.append("\nChecksum : ").append(mChecksum);
+ sb.append("\nRetryCount: ").append(mRetryCount);
sb.append("\nLocalFilename : ").append(mLocalFilename);
sb.append("\nRemoteFilename : ").append(mRemoteFilename);
sb.append("\nVersion : ").append(mVersion);
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 3743d26e6..efa527e15 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -108,11 +108,23 @@ public class Key implements Comparable<Key> {
private final MoreKeySpec[] mMoreKeys;
/** More keys column number and flags */
private final int mMoreKeysColumnAndFlags;
- private static final int MORE_KEYS_COLUMN_MASK = 0x000000ff;
- private static final int MORE_KEYS_FLAGS_FIXED_COLUMN_ORDER = 0x80000000;
+ private static final int MORE_KEYS_COLUMN_NUMBER_MASK = 0x000000ff;
+ // If this flag is specified, more keys keyboard should have the specified number of columns.
+ // Otherwise more keys keyboard should have less than or equal to the specified maximum number
+ // of columns.
+ private static final int MORE_KEYS_FLAGS_FIXED_COLUMN = 0x00000100;
+ // If this flag is specified, the order of more keys is determined by the order in the more
+ // keys' specification. Otherwise the order of more keys is automatically determined.
+ private static final int MORE_KEYS_FLAGS_FIXED_ORDER = 0x00000200;
+ private static final int MORE_KEYS_MODE_MAX_COLUMN_WITH_AUTO_ORDER = 0;
+ private static final int MORE_KEYS_MODE_FIXED_COLUMN_WITH_AUTO_ORDER =
+ MORE_KEYS_FLAGS_FIXED_COLUMN;
+ private static final int MORE_KEYS_MODE_FIXED_COLUMN_WITH_FIXED_ORDER =
+ (MORE_KEYS_FLAGS_FIXED_COLUMN | MORE_KEYS_FLAGS_FIXED_ORDER);
private static final int MORE_KEYS_FLAGS_HAS_LABELS = 0x40000000;
private static final int MORE_KEYS_FLAGS_NEEDS_DIVIDERS = 0x20000000;
private static final int MORE_KEYS_FLAGS_NO_PANEL_AUTO_MORE_KEY = 0x10000000;
+ // TODO: Rename these specifiers to !autoOrder! and !fixedOrder! respectively.
private static final String MORE_KEYS_AUTO_COLUMN_ORDER = "!autoColumnOrder!";
private static final String MORE_KEYS_FIXED_COLUMN_ORDER = "!fixedColumnOrder!";
private static final String MORE_KEYS_HAS_LABELS = "!hasLabels!";
@@ -127,7 +139,7 @@ public class Key implements Comparable<Key> {
public static final int BACKGROUND_TYPE_STICKY_OFF = 3;
public static final int BACKGROUND_TYPE_STICKY_ON = 4;
public static final int BACKGROUND_TYPE_ACTION = 5;
- public static final int BACKGROUND_TYPE_CUSTOM_ACTION = 6;
+ public static final int BACKGROUND_TYPE_SPACEBAR = 6;
private final int mActionFlags;
private static final int ACTION_FLAGS_IS_REPEATABLE = 0x01;
@@ -255,25 +267,31 @@ public class Key implements Comparable<Key> {
int actionFlags = style.getFlags(keyAttr, R.styleable.Keyboard_Key_keyActionFlags);
String[] moreKeys = style.getStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
- int moreKeysColumn = style.getInt(keyAttr,
- R.styleable.Keyboard_Key_maxMoreKeysColumn, params.mMaxMoreKeysKeyboardColumn);
+ // Get maximum column order number and set a relevant mode value.
+ int moreKeysColumnAndFlags = MORE_KEYS_MODE_MAX_COLUMN_WITH_AUTO_ORDER
+ | style.getInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn,
+ params.mMaxMoreKeysKeyboardColumn);
int value;
if ((value = MoreKeySpec.getIntValue(moreKeys, MORE_KEYS_AUTO_COLUMN_ORDER, -1)) > 0) {
- moreKeysColumn = value & MORE_KEYS_COLUMN_MASK;
+ // Override with fixed column order number and set a relevant mode value.
+ moreKeysColumnAndFlags = MORE_KEYS_MODE_FIXED_COLUMN_WITH_AUTO_ORDER
+ | (value & MORE_KEYS_COLUMN_NUMBER_MASK);
}
if ((value = MoreKeySpec.getIntValue(moreKeys, MORE_KEYS_FIXED_COLUMN_ORDER, -1)) > 0) {
- moreKeysColumn = MORE_KEYS_FLAGS_FIXED_COLUMN_ORDER | (value & MORE_KEYS_COLUMN_MASK);
+ // Override with fixed column order number and set a relevant mode value.
+ moreKeysColumnAndFlags = MORE_KEYS_MODE_FIXED_COLUMN_WITH_FIXED_ORDER
+ | (value & MORE_KEYS_COLUMN_NUMBER_MASK);
}
if (MoreKeySpec.getBooleanValue(moreKeys, MORE_KEYS_HAS_LABELS)) {
- moreKeysColumn |= MORE_KEYS_FLAGS_HAS_LABELS;
+ moreKeysColumnAndFlags |= MORE_KEYS_FLAGS_HAS_LABELS;
}
if (MoreKeySpec.getBooleanValue(moreKeys, MORE_KEYS_NEEDS_DIVIDERS)) {
- moreKeysColumn |= MORE_KEYS_FLAGS_NEEDS_DIVIDERS;
+ moreKeysColumnAndFlags |= MORE_KEYS_FLAGS_NEEDS_DIVIDERS;
}
if (MoreKeySpec.getBooleanValue(moreKeys, MORE_KEYS_NO_PANEL_AUTO_MORE_KEY)) {
- moreKeysColumn |= MORE_KEYS_FLAGS_NO_PANEL_AUTO_MORE_KEY;
+ moreKeysColumnAndFlags |= MORE_KEYS_FLAGS_NO_PANEL_AUTO_MORE_KEY;
}
- mMoreKeysColumnAndFlags = moreKeysColumn;
+ mMoreKeysColumnAndFlags = moreKeysColumnAndFlags;
final String[] additionalMoreKeys;
if ((mLabelFlags & LABEL_FLAGS_DISABLE_ADDITIONAL_MORE_KEYS) != 0) {
@@ -488,7 +506,7 @@ public class Key implements Comparable<Key> {
case BACKGROUND_TYPE_STICKY_OFF: return "stickyOff";
case BACKGROUND_TYPE_STICKY_ON: return "stickyOn";
case BACKGROUND_TYPE_ACTION: return "action";
- case BACKGROUND_TYPE_CUSTOM_ACTION: return "customAction";
+ case BACKGROUND_TYPE_SPACEBAR: return "spacebar";
default: return null;
}
}
@@ -680,12 +698,16 @@ public class Key implements Comparable<Key> {
&& !TextUtils.isEmpty(mHintLabel);
}
- public final int getMoreKeysColumn() {
- return mMoreKeysColumnAndFlags & MORE_KEYS_COLUMN_MASK;
+ public final int getMoreKeysColumnNumber() {
+ return mMoreKeysColumnAndFlags & MORE_KEYS_COLUMN_NUMBER_MASK;
}
- public final boolean isFixedColumnOrderMoreKeys() {
- return (mMoreKeysColumnAndFlags & MORE_KEYS_FLAGS_FIXED_COLUMN_ORDER) != 0;
+ public final boolean isMoreKeysFixedColumn() {
+ return (mMoreKeysColumnAndFlags & MORE_KEYS_FLAGS_FIXED_COLUMN) != 0;
+ }
+
+ public final boolean isMoreKeysFixedOrder() {
+ return (mMoreKeysColumnAndFlags & MORE_KEYS_FLAGS_FIXED_ORDER) != 0;
}
public final boolean hasLabelsInMoreKeys() {
@@ -867,8 +889,8 @@ public class Key implements Comparable<Key> {
new KeyBackgroundState(android.R.attr.state_checkable, android.R.attr.state_checked),
// 5: BACKGROUND_TYPE_ACTION
new KeyBackgroundState(android.R.attr.state_active),
- // 6: BACKGROUND_TYPE_CUSTOM_ACTION
- new KeyBackgroundState(android.R.attr.state_active, android.R.attr.state_checked)
+ // 6: BACKGROUND_TYPE_SPACEBAR
+ new KeyBackgroundState(),
};
}
@@ -882,7 +904,7 @@ public class Key implements Comparable<Key> {
final Drawable background;
if (mBackgroundType == BACKGROUND_TYPE_FUNCTIONAL) {
background = functionalKeyBackground;
- } else if (getCode() == Constants.CODE_SPACE) {
+ } else if (mBackgroundType == BACKGROUND_TYPE_SPACEBAR) {
background = spacebarBackground;
} else {
background = keyBackground;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
index 0804cebc4..3f4367313 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
@@ -119,7 +119,15 @@ public final class KeyboardLayoutSet {
new SparseArray<>();
}
- public static void clearKeyboardCache() {
+ public static void onSystemLocaleChanged() {
+ clearKeyboardCache();
+ }
+
+ public static void onKeyboardThemeChanged() {
+ clearKeyboardCache();
+ }
+
+ private static void clearKeyboardCache() {
sKeyboardCache.clear();
sKeysCache.clear();
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 30bd1dfda..91d703330 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -103,7 +103,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
if (mThemeContext == null || !keyboardTheme.equals(mKeyboardTheme)) {
mKeyboardTheme = keyboardTheme;
mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId);
- KeyboardLayoutSet.clearKeyboardCache();
+ KeyboardLayoutSet.onKeyboardThemeChanged();
return true;
}
return false;
@@ -154,9 +154,12 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
mCurrentSettingsValues.mKeyPreviewPopupOn,
mCurrentSettingsValues.mKeyPreviewPopupDismissDelay);
keyboardView.setKeyPreviewAnimationParams(
- mCurrentSettingsValues.mKeyPreviewShowUpStartScale,
+ mCurrentSettingsValues.mHasCustomKeyPreviewAnimationParams,
+ mCurrentSettingsValues.mKeyPreviewShowUpStartXScale,
+ mCurrentSettingsValues.mKeyPreviewShowUpStartYScale,
mCurrentSettingsValues.mKeyPreviewShowUpDuration,
- mCurrentSettingsValues.mKeyPreviewDismissEndScale,
+ mCurrentSettingsValues.mKeyPreviewDismissEndXScale,
+ mCurrentSettingsValues.mKeyPreviewDismissEndYScale,
mCurrentSettingsValues.mKeyPreviewDismissDuration);
keyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
final boolean subtypeChanged = (oldKeyboard == null)
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java
index 0cd606d19..7161d3f26 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java
@@ -32,6 +32,8 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
static final String KLP_KEYBOARD_THEME_KEY = "pref_keyboard_layout_20110916";
static final String LXX_KEYBOARD_THEME_KEY = "pref_keyboard_theme_20140509";
+ // These should be aligned with Keyboard.themeId and Keyboard.Case.keyboardTheme
+ // attributes' values in attrs.xml.
public static final int THEME_ID_ICS = 0;
public static final int THEME_ID_KLP = 2;
public static final int THEME_ID_LXX_LIGHT = 3;
@@ -39,16 +41,16 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
public static final int DEFAULT_THEME_ID = THEME_ID_KLP;
private static final KeyboardTheme[] KEYBOARD_THEMES = {
- new KeyboardTheme(THEME_ID_ICS, R.style.KeyboardTheme_ICS,
+ new KeyboardTheme(THEME_ID_ICS, "ICS", R.style.KeyboardTheme_ICS,
// This has never been selected because we support ICS or later.
VERSION_CODES.BASE),
- new KeyboardTheme(THEME_ID_KLP, R.style.KeyboardTheme_KLP,
+ new KeyboardTheme(THEME_ID_KLP, "KLP", R.style.KeyboardTheme_KLP,
// Default theme for ICS, JB, and KLP.
VERSION_CODES.ICE_CREAM_SANDWICH),
- new KeyboardTheme(THEME_ID_LXX_LIGHT, R.style.KeyboardTheme_LXX_Light,
+ new KeyboardTheme(THEME_ID_LXX_LIGHT, "LXXLight", R.style.KeyboardTheme_LXX_Light,
// Default theme for LXX.
BuildCompatUtils.VERSION_CODES_LXX),
- new KeyboardTheme(THEME_ID_LXX_DARK, R.style.KeyboardTheme_LXX_Dark,
+ new KeyboardTheme(THEME_ID_LXX_DARK, "LXXDark", R.style.KeyboardTheme_LXX_Dark,
VERSION_CODES.BASE),
};
@@ -59,12 +61,15 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
public final int mThemeId;
public final int mStyleId;
+ public final String mThemeName;
private final int mMinApiVersion;
// Note: The themeId should be aligned with "themeId" attribute of Keyboard style
// in values/themes-<style>.xml.
- private KeyboardTheme(final int themeId, final int styleId, final int minApiVersion) {
+ private KeyboardTheme(final int themeId, final String themeName, final int styleId,
+ final int minApiVersion) {
mThemeId = themeId;
+ mThemeName = themeName;
mStyleId = styleId;
mMinApiVersion = minApiVersion;
}
@@ -128,6 +133,11 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
return searchKeyboardThemeById(DEFAULT_THEME_ID);
}
+ public static String getKeyboardThemeName(final int themeId) {
+ final KeyboardTheme theme = searchKeyboardThemeById(themeId);
+ return theme.mThemeName;
+ }
+
public static void saveKeyboardThemeId(final String themeIdString,
final SharedPreferences prefs) {
saveKeyboardThemeId(themeIdString, prefs, BuildCompatUtils.EFFECTIVE_SDK_INT);
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 847d90711..d2f3e9714 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -85,6 +85,8 @@ import java.util.WeakHashMap;
* @attr ref R.styleable#MainKeyboardView_keyPreviewOffset
* @attr ref R.styleable#MainKeyboardView_keyPreviewHeight
* @attr ref R.styleable#MainKeyboardView_keyPreviewLingerTimeout
+ * @attr ref R.styleable#MainKeyboardView_keyPreviewShowUpAnimator
+ * @attr ref R.styleable#MainKeyboardView_keyPreviewDismissAnimator
* @attr ref R.styleable#MainKeyboardView_moreKeysKeyboardLayout
* @attr ref R.styleable#MainKeyboardView_backgroundDimAlpha
* @attr ref R.styleable#MainKeyboardView_showMoreKeysKeyboardAtTouchPoint
@@ -390,20 +392,34 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
}
/**
- * Enables or disables the key feedback popup. This is a popup that shows a magnified
+ * Enables or disables the key preview popup. This is a popup that shows a magnified
* version of the depressed key. By default the preview is enabled.
* @param previewEnabled whether or not to enable the key feedback preview
* @param delay the delay after which the preview is dismissed
- * @see #isKeyPreviewPopupEnabled()
*/
public void setKeyPreviewPopupEnabled(final boolean previewEnabled, final int delay) {
mKeyPreviewDrawParams.setPopupEnabled(previewEnabled, delay);
}
- public void setKeyPreviewAnimationParams(final float showUpStartScale, final int showUpDuration,
- final float dismissEndScale, final int dismissDuration) {
- mKeyPreviewDrawParams.setAnimationParams(
- showUpStartScale, showUpDuration, dismissEndScale, dismissDuration);
+ /**
+ * Enables or disables the key preview popup animations and set animations' parameters.
+ *
+ * @param hasCustomAnimationParams false to use the default key preview popup animations
+ * specified by keyPreviewShowUpAnimator and keyPreviewDismissAnimator attributes.
+ * true to override the default animations with the specified parameters.
+ * @param showUpStartXScale from this x-scale the show up animation will start.
+ * @param showUpStartYScale from this y-scale the show up animation will start.
+ * @param showUpDuration the duration of the show up animation in milliseconds.
+ * @param dismissEndXScale to this x-scale the dismiss animation will end.
+ * @param dismissEndYScale to this y-scale the dismiss animation will end.
+ * @param dismissDuration the duration of the dismiss animation in milliseconds.
+ */
+ public void setKeyPreviewAnimationParams(final boolean hasCustomAnimationParams,
+ final float showUpStartXScale, final float showUpStartYScale, final int showUpDuration,
+ final float dismissEndXScale, final float dismissEndYScale, final int dismissDuration) {
+ mKeyPreviewDrawParams.setAnimationParams(hasCustomAnimationParams,
+ showUpStartXScale, showUpStartYScale, showUpDuration,
+ dismissEndXScale, dismissEndYScale, dismissDuration);
}
private void locatePreviewPlacerView() {
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
index e0184d7f1..52e2e85ba 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
@@ -43,7 +43,7 @@ public final class MoreKeysKeyboard extends Keyboard {
@UsedForTesting
static class MoreKeysKeyboardParams extends KeyboardParams {
- public boolean mIsFixedOrder;
+ public boolean mIsMoreKeysFixedOrder;
/* package */int mTopRowAdjustment;
public int mNumRows;
public int mNumColumns;
@@ -61,29 +61,35 @@ public final class MoreKeysKeyboard extends Keyboard {
* Set keyboard parameters of more keys keyboard.
*
* @param numKeys number of keys in this more keys keyboard.
- * @param maxColumns number of maximum columns of this more keys keyboard.
+ * @param numColumn number of columns of this more keys keyboard.
* @param keyWidth more keys keyboard key width in pixel, including horizontal gap.
* @param rowHeight more keys keyboard row height in pixel, including vertical gap.
* @param coordXInParent coordinate x of the key preview in parent keyboard.
* @param parentKeyboardWidth parent keyboard width in pixel.
- * @param isFixedColumnOrder if true, more keys should be laid out in fixed order.
+ * @param isMoreKeysFixedColumn true if more keys keyboard should have
+ * <code>numColumn</code> columns. Otherwise more keys keyboard should have
+ * <code>numColumn</code> columns at most.
+ * @param isMoreKeysFixedOrder true if the order of more keys is determined by the order in
+ * the more keys' specification. Otherwise the order of more keys is automatically
+ * determined.
* @param dividerWidth width of divider, zero for no dividers.
*/
- public void setParameters(final int numKeys, final int maxColumns, final int keyWidth,
+ public void setParameters(final int numKeys, final int numColumn, final int keyWidth,
final int rowHeight, final int coordXInParent, final int parentKeyboardWidth,
- final boolean isFixedColumnOrder, final int dividerWidth) {
- mIsFixedOrder = isFixedColumnOrder;
- if (parentKeyboardWidth / keyWidth < Math.min(numKeys, maxColumns)) {
+ final boolean isMoreKeysFixedColumn, final boolean isMoreKeysFixedOrder,
+ final int dividerWidth) {
+ mIsMoreKeysFixedOrder = isMoreKeysFixedOrder;
+ if (parentKeyboardWidth / keyWidth < Math.min(numKeys, numColumn)) {
throw new IllegalArgumentException("Keyboard is too small to hold more keys: "
- + parentKeyboardWidth + " " + keyWidth + " " + numKeys + " " + maxColumns);
+ + parentKeyboardWidth + " " + keyWidth + " " + numKeys + " " + numColumn);
}
mDefaultKeyWidth = keyWidth;
mDefaultRowHeight = rowHeight;
- final int numRows = (numKeys + maxColumns - 1) / maxColumns;
+ final int numRows = (numKeys + numColumn - 1) / numColumn;
mNumRows = numRows;
- final int numColumns = mIsFixedOrder ? Math.min(numKeys, maxColumns)
- : getOptimizedColumns(numKeys, maxColumns);
+ final int numColumns = isMoreKeysFixedColumn ? Math.min(numKeys, numColumn)
+ : getOptimizedColumns(numKeys, numColumn);
mNumColumns = numColumns;
final int topKeys = numKeys % numColumns;
mTopKeys = topKeys == 0 ? numColumns : topKeys;
@@ -120,7 +126,7 @@ public final class MoreKeysKeyboard extends Keyboard {
mRightKeys = rightKeys;
// Adjustment of the top row.
- mTopRowAdjustment = mIsFixedOrder ? getFixedOrderTopRowAdjustment()
+ mTopRowAdjustment = isMoreKeysFixedOrder ? getFixedOrderTopRowAdjustment()
: getAutoOrderTopRowAdjustment();
mDividerWidth = dividerWidth;
mColumnWidth = mDefaultKeyWidth + mDividerWidth;
@@ -148,7 +154,7 @@ public final class MoreKeysKeyboard extends Keyboard {
// Return key position according to column count (0 is default).
/* package */int getColumnPos(final int n) {
- return mIsFixedOrder ? getFixedOrderColumnPos(n) : getAutomaticColumnPos(n);
+ return mIsMoreKeysFixedOrder ? getFixedOrderColumnPos(n) : getAutomaticColumnPos(n);
}
private int getFixedOrderColumnPos(final int n) {
@@ -263,7 +269,8 @@ public final class MoreKeysKeyboard extends Keyboard {
* @param keyboard the {@link Keyboard} that contains the parentKey.
* @param isSingleMoreKeyWithPreview true if the <code>key</code> has just a single
* "more key" and its key popup preview is enabled.
- * @param keyPreviewDrawParams the parameter to place key preview.
+ * @param keyPreviewVisibleWidth the width of visible part of key popup preview.
+ * @param keyPreviewVisibleHeight the height of visible part of key popup preview
* @param paintToMeasure the {@link Paint} object to measure a "more key" width
*/
public Builder(final Context context, final Key key, final Keyboard keyboard,
@@ -306,9 +313,9 @@ public final class MoreKeysKeyboard extends Keyboard {
dividerWidth = 0;
}
final MoreKeySpec[] moreKeys = key.getMoreKeys();
- mParams.setParameters(moreKeys.length, key.getMoreKeysColumn(), keyWidth, rowHeight,
+ mParams.setParameters(moreKeys.length, key.getMoreKeysColumnNumber(), keyWidth, rowHeight,
key.getX() + key.getWidth() / 2, keyboard.mId.mWidth,
- key.isFixedColumnOrderMoreKeys(), dividerWidth);
+ key.isMoreKeysFixedColumn(), key.isMoreKeysFixedOrder(), dividerWidth);
}
private static int getMaxKeyWidth(final Key parentKey, final int minKeyWidth,
diff --git a/java/src/com/android/inputmethod/keyboard/TextDecorator.java b/java/src/com/android/inputmethod/keyboard/TextDecorator.java
index 178516134..9192853ca 100644
--- a/java/src/com/android/inputmethod/keyboard/TextDecorator.java
+++ b/java/src/com/android/inputmethod/keyboard/TextDecorator.java
@@ -276,10 +276,10 @@ public class TextDecorator {
final int lastCharRectIndex = composingTextStart + composingText.length() - 1;
final RectF lastCharRect = info.getCharacterRect(lastCharRectIndex);
final int lastCharRectFlag = info.getCharacterRectFlags(lastCharRectIndex);
- final int lastCharRectType =
- lastCharRectFlag & CursorAnchorInfoCompatWrapper.CHARACTER_RECT_TYPE_MASK;
- if (lastCharRect == null || matrix == null || lastCharRectType !=
- CursorAnchorInfoCompatWrapper.CHARACTER_RECT_TYPE_FULLY_VISIBLE) {
+ final boolean hasInvisibleRegionInLastCharRect =
+ (lastCharRectFlag & CursorAnchorInfoCompatWrapper.FLAG_HAS_INVISIBLE_REGION)
+ != 0;
+ if (lastCharRect == null || matrix == null || hasInvisibleRegionInLastCharRect) {
mUiOperator.hideUi();
return;
}
@@ -336,7 +336,8 @@ public class TextDecorator {
}
// In MODE_ADD_TO_DICTIONARY, we cannot retrieve the character position at all because
// of the lack of composing text. We will use the insertion marker position instead.
- if (info.isInsertionMarkerClipped()) {
+ if ((info.getInsertionMarkerFlags() &
+ CursorAnchorInfoCompatWrapper.FLAG_HAS_INVISIBLE_REGION) != 0) {
mUiOperator.hideUi();
return;
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
index cd29c8d17..5005b7d7d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
@@ -18,13 +18,9 @@ package com.android.inputmethod.keyboard.internal;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.latin.utils.CoordinateUtils;
@@ -89,9 +85,9 @@ public final class KeyPreviewChoreographer {
}
final Object tag = keyPreviewView.getTag();
if (withAnimation) {
- if (tag instanceof KeyPreviewAnimations) {
- final KeyPreviewAnimations animation = (KeyPreviewAnimations)tag;
- animation.startDismiss();
+ if (tag instanceof KeyPreviewAnimators) {
+ final KeyPreviewAnimators animators = (KeyPreviewAnimators)tag;
+ animators.startDismiss();
return;
}
}
@@ -161,87 +157,60 @@ public final class KeyPreviewChoreographer {
}
// Show preview with animation.
- final Animator showUpAnimation = createShowUpAniation(key, keyPreviewView);
- final Animator dismissAnimation = createDismissAnimation(key, keyPreviewView);
- final KeyPreviewAnimations animation = new KeyPreviewAnimations(
- showUpAnimation, dismissAnimation);
- keyPreviewView.setTag(animation);
- animation.startShowUp();
+ final Animator showUpAnimator = createShowUpAnimator(key, keyPreviewView);
+ final Animator dismissAnimator = createDismissAnimator(key, keyPreviewView);
+ final KeyPreviewAnimators animators = new KeyPreviewAnimators(
+ showUpAnimator, dismissAnimator);
+ keyPreviewView.setTag(animators);
+ animators.startShowUp();
}
- private static final float KEY_PREVIEW_SHOW_UP_END_SCALE = 1.0f;
- private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR =
- new AccelerateInterpolator();
- private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
- new DecelerateInterpolator();
-
- private Animator createShowUpAniation(final Key key, final KeyPreviewView keyPreviewView) {
- // TODO: Optimization for no scale animation and no duration.
- final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat(
- keyPreviewView, View.SCALE_X, mParams.getShowUpStartScale(),
- KEY_PREVIEW_SHOW_UP_END_SCALE);
- final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat(
- keyPreviewView, View.SCALE_Y, mParams.getShowUpStartScale(),
- KEY_PREVIEW_SHOW_UP_END_SCALE);
- final AnimatorSet showUpAnimation = new AnimatorSet();
- showUpAnimation.play(scaleXAnimation).with(scaleYAnimation);
- showUpAnimation.setDuration(mParams.getShowUpDuration());
- showUpAnimation.setInterpolator(DECELERATE_INTERPOLATOR);
- showUpAnimation.addListener(new AnimatorListenerAdapter() {
+ public Animator createShowUpAnimator(final Key key, final KeyPreviewView keyPreviewView) {
+ final Animator animator = mParams.createShowUpAnimator(keyPreviewView);
+ animator.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationStart(final Animator animation) {
+ public void onAnimationStart(final Animator animator) {
showKeyPreview(key, keyPreviewView, false /* withAnimation */);
}
});
- return showUpAnimation;
+ return animator;
}
- private Animator createDismissAnimation(final Key key, final KeyPreviewView keyPreviewView) {
- // TODO: Optimization for no scale animation and no duration.
- final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat(
- keyPreviewView, View.SCALE_X, mParams.getDismissEndScale());
- final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat(
- keyPreviewView, View.SCALE_Y, mParams.getDismissEndScale());
- final AnimatorSet dismissAnimation = new AnimatorSet();
- dismissAnimation.play(scaleXAnimation).with(scaleYAnimation);
- final int dismissDuration = Math.min(
- mParams.getDismissDuration(), mParams.getLingerTimeout());
- dismissAnimation.setDuration(dismissDuration);
- dismissAnimation.setInterpolator(ACCELERATE_INTERPOLATOR);
- dismissAnimation.addListener(new AnimatorListenerAdapter() {
+ private Animator createDismissAnimator(final Key key, final KeyPreviewView keyPreviewView) {
+ final Animator animator = mParams.createDismissAnimator(keyPreviewView);
+ animator.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationEnd(final Animator animation) {
+ public void onAnimationEnd(final Animator animator) {
dismissKeyPreview(key, false /* withAnimation */);
}
});
- return dismissAnimation;
+ return animator;
}
- private static class KeyPreviewAnimations extends AnimatorListenerAdapter {
- private final Animator mShowUpAnimation;
- private final Animator mDismissAnimation;
+ private static class KeyPreviewAnimators extends AnimatorListenerAdapter {
+ private final Animator mShowUpAnimator;
+ private final Animator mDismissAnimator;
- public KeyPreviewAnimations(final Animator showUpAnimation,
- final Animator dismissAnimation) {
- mShowUpAnimation = showUpAnimation;
- mDismissAnimation = dismissAnimation;
+ public KeyPreviewAnimators(final Animator showUpAnimator, final Animator dismissAnimator) {
+ mShowUpAnimator = showUpAnimator;
+ mDismissAnimator = dismissAnimator;
}
public void startShowUp() {
- mShowUpAnimation.start();
+ mShowUpAnimator.start();
}
public void startDismiss() {
- if (mShowUpAnimation.isRunning()) {
- mShowUpAnimation.addListener(this);
+ if (mShowUpAnimator.isRunning()) {
+ mShowUpAnimator.addListener(this);
return;
}
- mDismissAnimation.start();
+ mDismissAnimator.start();
}
@Override
- public void onAnimationEnd(final Animator animation) {
- mDismissAnimation.start();
+ public void onAnimationEnd(final Animator animator) {
+ mDismissAnimator.start();
}
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
index 68c9831fa..5ed39f986 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
@@ -16,8 +16,14 @@
package com.android.inputmethod.keyboard.internal;
+import android.animation.Animator;
+import android.animation.AnimatorInflater;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
import android.content.res.TypedArray;
import android.view.View;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.DecelerateInterpolator;
import com.android.inputmethod.latin.R;
@@ -26,10 +32,15 @@ public final class KeyPreviewDrawParams {
public final int mPreviewOffset;
public final int mPreviewHeight;
public final int mPreviewBackgroundResId;
+ private final int mShowUpAnimatorResId;
+ private final int mDismissAnimatorResId;
+ private boolean mHasCustomAnimationParams;
private int mShowUpDuration;
private int mDismissDuration;
- private float mShowUpStartScale;
- private float mDismissEndScale;
+ private float mShowUpStartXScale;
+ private float mShowUpStartYScale;
+ private float mDismissEndXScale;
+ private float mDismissEndYScale;
private int mLingerTimeout;
private boolean mShowPopup = true;
@@ -67,6 +78,10 @@ public final class KeyPreviewDrawParams {
R.styleable.MainKeyboardView_keyPreviewBackground, 0);
mLingerTimeout = mainKeyboardViewAttr.getInt(
R.styleable.MainKeyboardView_keyPreviewLingerTimeout, 0);
+ mShowUpAnimatorResId = mainKeyboardViewAttr.getResourceId(
+ R.styleable.MainKeyboardView_keyPreviewShowUpAnimator, 0);
+ mDismissAnimatorResId = mainKeyboardViewAttr.getResourceId(
+ R.styleable.MainKeyboardView_keyPreviewDismissAnimator, 0);
}
public void setVisibleOffset(final int previewVisibleOffset) {
@@ -112,27 +127,62 @@ public final class KeyPreviewDrawParams {
return mLingerTimeout;
}
- public void setAnimationParams(final float showUpStartScale, final int showUpDuration,
- final float dismissEndScale, final int dismissDuration) {
- mShowUpStartScale = showUpStartScale;
+ public void setAnimationParams(final boolean hasCustomAnimationParams,
+ final float showUpStartXScale, final float showUpStartYScale, final int showUpDuration,
+ final float dismissEndXScale, final float dismissEndYScale, final int dismissDuration) {
+ mHasCustomAnimationParams = hasCustomAnimationParams;
+ mShowUpStartXScale = showUpStartXScale;
+ mShowUpStartYScale = showUpStartYScale;
mShowUpDuration = showUpDuration;
- mDismissEndScale = dismissEndScale;
+ mDismissEndXScale = dismissEndXScale;
+ mDismissEndYScale = dismissEndYScale;
mDismissDuration = dismissDuration;
}
- public float getShowUpStartScale() {
- return mShowUpStartScale;
+ private static final float KEY_PREVIEW_SHOW_UP_END_SCALE = 1.0f;
+ private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR =
+ new AccelerateInterpolator();
+ private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
+ new DecelerateInterpolator();
+
+ public Animator createShowUpAnimator(final View target) {
+ if (mHasCustomAnimationParams) {
+ final ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(
+ target, View.SCALE_X, mShowUpStartXScale,
+ KEY_PREVIEW_SHOW_UP_END_SCALE);
+ final ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(
+ target, View.SCALE_Y, mShowUpStartYScale,
+ KEY_PREVIEW_SHOW_UP_END_SCALE);
+ final AnimatorSet showUpAnimator = new AnimatorSet();
+ showUpAnimator.play(scaleXAnimator).with(scaleYAnimator);
+ showUpAnimator.setDuration(mShowUpDuration);
+ showUpAnimator.setInterpolator(DECELERATE_INTERPOLATOR);
+ return showUpAnimator;
+ }
+ final Animator animator = AnimatorInflater.loadAnimator(
+ target.getContext(), mShowUpAnimatorResId);
+ animator.setTarget(target);
+ animator.setInterpolator(DECELERATE_INTERPOLATOR);
+ return animator;
}
- public int getShowUpDuration() {
- return mShowUpDuration;
- }
-
- public float getDismissEndScale() {
- return mDismissEndScale;
- }
-
- public int getDismissDuration() {
- return mDismissDuration;
+ public Animator createDismissAnimator(final View target) {
+ if (mHasCustomAnimationParams) {
+ final ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(
+ target, View.SCALE_X, mDismissEndXScale);
+ final ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(
+ target, View.SCALE_Y, mDismissEndYScale);
+ final AnimatorSet dismissAnimator = new AnimatorSet();
+ dismissAnimator.play(scaleXAnimator).with(scaleYAnimator);
+ final int dismissDuration = Math.min(mDismissDuration, mLingerTimeout);
+ dismissAnimator.setDuration(dismissDuration);
+ dismissAnimator.setInterpolator(ACCELERATE_INTERPOLATOR);
+ return dismissAnimator;
+ }
+ final Animator animator = AnimatorInflater.loadAnimator(
+ target.getContext(), mDismissAnimatorResId);
+ animator.setTarget(target);
+ animator.setInterpolator(ACCELERATE_INTERPOLATOR);
+ return animator;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index 8bff27574..fa4192790 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -31,6 +31,7 @@ import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.KeyboardTheme;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.utils.ResourceUtils;
@@ -643,6 +644,9 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
final boolean keyboardLayoutSetElementMatched = matchTypedValue(caseAttr,
R.styleable.Keyboard_Case_keyboardLayoutSetElement, id.mElementId,
KeyboardId.elementIdToName(id.mElementId));
+ final boolean keyboardThemeMacthed = matchTypedValue(caseAttr,
+ R.styleable.Keyboard_Case_keyboardTheme, mParams.mThemeId,
+ KeyboardTheme.getKeyboardThemeName(mParams.mThemeId));
final boolean modeMatched = matchTypedValue(caseAttr,
R.styleable.Keyboard_Case_mode, id.mMode, KeyboardId.modeName(id.mMode));
final boolean navigateNextMatched = matchBoolean(caseAttr,
@@ -671,19 +675,21 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
final boolean countryCodeMatched = matchString(caseAttr,
R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry());
final boolean selected = keyboardLayoutSetMatched && keyboardLayoutSetElementMatched
- && modeMatched && navigateNextMatched && navigatePreviousMatched
- && passwordInputMatched && clobberSettingsKeyMatched && hasShortcutKeyMatched
- && languageSwitchKeyEnabledMatched && isMultiLineMatched && imeActionMatched
- && isIconDefinedMatched && localeCodeMatched && languageCodeMatched
- && countryCodeMatched;
+ && keyboardThemeMacthed && modeMatched && navigateNextMatched
+ && navigatePreviousMatched && passwordInputMatched && clobberSettingsKeyMatched
+ && hasShortcutKeyMatched && languageSwitchKeyEnabledMatched
+ && isMultiLineMatched && imeActionMatched && isIconDefinedMatched
+ && localeCodeMatched && languageCodeMatched && countryCodeMatched;
if (DEBUG) {
- startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE,
+ startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE,
textAttr(caseAttr.getString(
R.styleable.Keyboard_Case_keyboardLayoutSet), "keyboardLayoutSet"),
textAttr(caseAttr.getString(
R.styleable.Keyboard_Case_keyboardLayoutSetElement),
"keyboardLayoutSetElement"),
+ textAttr(caseAttr.getString(
+ R.styleable.Keyboard_Case_keyboardTheme), "keyboardTheme"),
textAttr(caseAttr.getString(R.styleable.Keyboard_Case_mode), "mode"),
textAttr(caseAttr.getString(R.styleable.Keyboard_Case_imeAction),
"imeAction"),
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 693e1cdcc..2e108756e 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -83,7 +83,6 @@ public final class BinaryDictionary extends Dictionary {
public static final String DIR_NAME_SUFFIX_FOR_RECORD_MIGRATION = ".migrating";
private long mNativeDict;
- private final Locale mLocale;
private final long mDictSize;
private final String mDictFilePath;
private final boolean mUseFullEditDistance;
@@ -117,8 +116,7 @@ public final class BinaryDictionary extends Dictionary {
public BinaryDictionary(final String filename, final long offset, final long length,
final boolean useFullEditDistance, final Locale locale, final String dictType,
final boolean isUpdatable) {
- super(dictType);
- mLocale = locale;
+ super(dictType, locale);
mDictSize = length;
mDictFilePath = filename;
mIsUpdatable = isUpdatable;
@@ -138,8 +136,7 @@ public final class BinaryDictionary extends Dictionary {
public BinaryDictionary(final String filename, final boolean useFullEditDistance,
final Locale locale, final String dictType, final long formatVersion,
final Map<String, String> attributeMap) {
- super(dictType);
- mLocale = locale;
+ super(dictType, locale);
mDictSize = 0;
mDictFilePath = filename;
// On memory dictionary is always updatable.
diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java
index 729481326..02d5eddaa 100644
--- a/java/src/com/android/inputmethod/latin/Constants.java
+++ b/java/src/com/android/inputmethod/latin/Constants.java
@@ -57,6 +57,13 @@ public final class Constants {
@SuppressWarnings("dep-ann")
public static final String FORCE_ASCII = "forceAscii";
+ /**
+ * The private IME option used to suppress the floating gesture preview for a given text
+ * field. This overrides the corresponding keyboard settings preference.
+ * {@link com.android.inputmethod.latin.settings.SettingsValues#mGestureFloatingPreviewTextEnabled}
+ */
+ public static final String NO_FLOATING_GESTURE_PREVIEW = "noGestureFloatingPreview";
+
private ImeOption() {
// This utility class is not publicly instantiable.
}
diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
index 560ced9c4..2f79c7662 100644
--- a/java/src/com/android/inputmethod/latin/Dictionary.java
+++ b/java/src/com/android/inputmethod/latin/Dictionary.java
@@ -16,12 +16,12 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.keyboard.ProximityInfo;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import java.util.ArrayList;
+import java.util.Locale;
/**
* Abstract base class for a dictionary that can do a fuzzy search for words based on a set of key
@@ -62,9 +62,12 @@ public abstract class Dictionary {
// Contextual dictionary.
public static final String TYPE_CONTEXTUAL = "contextual";
public final String mDictType;
+ // The locale for this dictionary. May be null if unknown (phony dictionary for example).
+ public final Locale mLocale;
- public Dictionary(final String dictType) {
+ public Dictionary(final String dictType, final Locale locale) {
mDictType = dictType;
+ mLocale = locale;
}
/**
@@ -162,7 +165,7 @@ public abstract class Dictionary {
private static class PhonyDictionary extends Dictionary {
// This class is not publicly instantiable.
private PhonyDictionary(final String type) {
- super(type);
+ super(type, null);
}
@Override
diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
index 2b4c54d48..ca5e93714 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryCollection.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
@@ -25,6 +25,7 @@ import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Locale;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -34,13 +35,14 @@ public final class DictionaryCollection extends Dictionary {
private final String TAG = DictionaryCollection.class.getSimpleName();
protected final CopyOnWriteArrayList<Dictionary> mDictionaries;
- public DictionaryCollection(final String dictType) {
- super(dictType);
+ public DictionaryCollection(final String dictType, final Locale locale) {
+ super(dictType, locale);
mDictionaries = new CopyOnWriteArrayList<>();
}
- public DictionaryCollection(final String dictType, final Dictionary... dictionaries) {
- super(dictType);
+ public DictionaryCollection(final String dictType, final Locale locale,
+ final Dictionary... dictionaries) {
+ super(dictType, locale);
if (null == dictionaries) {
mDictionaries = new CopyOnWriteArrayList<>();
} else {
@@ -49,8 +51,9 @@ public final class DictionaryCollection extends Dictionary {
}
}
- public DictionaryCollection(final String dictType, final Collection<Dictionary> dictionaries) {
- super(dictType);
+ public DictionaryCollection(final String dictType, final Locale locale,
+ final Collection<Dictionary> dictionaries) {
+ super(dictType, locale);
mDictionaries = new CopyOnWriteArrayList<>(dictionaries);
mDictionaries.removeAll(Collections.singleton(null));
}
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index 60d6bc3e5..480bd1f85 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -33,6 +33,7 @@ import com.android.inputmethod.latin.personalization.UserHistoryDictionary;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import com.android.inputmethod.latin.utils.DistracterFilter;
+import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatchesAndSuggestions;
import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary;
import com.android.inputmethod.latin.utils.ExecutorUtils;
import com.android.inputmethod.latin.utils.LanguageModelParam;
@@ -59,6 +60,7 @@ public class DictionaryFacilitator {
// HACK: This threshold is being used when adding a capitalized entry in the User History
// dictionary.
private static final int CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140;
+ private static final int MAX_DICTIONARY_FACILITATOR_CACHE_SIZE = 3;
private Dictionaries mDictionaries = new Dictionaries();
private boolean mIsUserDictEnabled = false;
@@ -66,6 +68,7 @@ public class DictionaryFacilitator {
// To synchronize assigning mDictionaries to ensure closing dictionaries.
private final Object mLock = new Object();
private final DistracterFilter mDistracterFilter;
+ private final DictionaryFacilitatorLruCache mFacilitatorCacheForPersonalization;
private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS =
new String[] {
@@ -173,10 +176,14 @@ public class DictionaryFacilitator {
public DictionaryFacilitator() {
mDistracterFilter = DistracterFilter.EMPTY_DISTRACTER_FILTER;
+ mFacilitatorCacheForPersonalization = null;
}
- public DictionaryFacilitator(final DistracterFilter distracterFilter) {
- mDistracterFilter = distracterFilter;
+ public DictionaryFacilitator(final Context context) {
+ mFacilitatorCacheForPersonalization = new DictionaryFacilitatorLruCache(context,
+ MAX_DICTIONARY_FACILITATOR_CACHE_SIZE, "" /* dictionaryNamePrefix */);
+ mDistracterFilter = new DistracterFilterCheckingExactMatchesAndSuggestions(context,
+ mFacilitatorCacheForPersonalization);
}
public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) {
@@ -351,6 +358,9 @@ public class DictionaryFacilitator {
for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
dictionaries.closeDict(dictType);
}
+ if (mFacilitatorCacheForPersonalization != null) {
+ mFacilitatorCacheForPersonalization.evictAll();
+ }
mDistracterFilter.close();
}
@@ -493,7 +503,7 @@ public class DictionaryFacilitator {
final SettingsValuesForSuggestion settingsValuesForSuggestion, final int sessionId) {
final Dictionaries dictionaries = mDictionaries;
final SuggestionResults suggestionResults =
- new SuggestionResults(dictionaries.mLocale, SuggestedWords.MAX_SUGGESTIONS);
+ new SuggestionResults(SuggestedWords.MAX_SUGGESTIONS);
final float[] languageWeight = new float[] { Dictionary.NOT_A_LANGUAGE_WEIGHT };
for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
final Dictionary dictionary = dictionaries.getDict(dictType);
@@ -597,11 +607,15 @@ public class DictionaryFacilitator {
}
return;
}
+ // TODO: Get locale from personalizationDataChunk.mDetectedLanguage.
+ final Locale dataChunkLocale = getLocale();
+ final DictionaryFacilitator dictionaryFacilitatorForLocale =
+ mFacilitatorCacheForPersonalization.get(dataChunkLocale);
final ArrayList<LanguageModelParam> languageModelParams =
LanguageModelParam.createLanguageModelParamsFrom(
personalizationDataChunk.mTokens,
personalizationDataChunk.mTimestampInSeconds,
- this /* dictionaryFacilitator */, spacingAndPunctuations,
+ dictionaryFacilitatorForLocale, spacingAndPunctuations,
new DistracterFilterCheckingIsInDictionary(
mDistracterFilter, personalizationDict));
if (languageModelParams == null || languageModelParams.isEmpty()) {
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFactory.java b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
index 59de4f82a..3459b426d 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFactory.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
@@ -50,7 +50,7 @@ public final class DictionaryFactory {
final Locale locale, final boolean useFullEditDistance) {
if (null == locale) {
Log.e(TAG, "No locale defined for dictionary");
- return new DictionaryCollection(Dictionary.TYPE_MAIN,
+ return new DictionaryCollection(Dictionary.TYPE_MAIN, locale,
createReadOnlyBinaryDictionary(context, locale));
}
@@ -75,7 +75,7 @@ public final class DictionaryFactory {
// If the list is empty, that means we should not use any dictionary (for example, the user
// explicitly disabled the main dictionary), so the following is okay. dictList is never
// null, but if for some reason it is, DictionaryCollection handles it gracefully.
- return new DictionaryCollection(Dictionary.TYPE_MAIN, dictList);
+ return new DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList);
}
/**
@@ -188,7 +188,7 @@ public final class DictionaryFactory {
public static Dictionary createDictionaryForTest(final AssetFileAddress[] dictionaryList,
final boolean useFullEditDistance, Locale locale) {
final DictionaryCollection dictionaryCollection =
- new DictionaryCollection(Dictionary.TYPE_MAIN);
+ new DictionaryCollection(Dictionary.TYPE_MAIN, locale);
for (final AssetFileAddress address : dictionaryList) {
final ReadOnlyBinaryDictionary readOnlyBinaryDictionary = new ReadOnlyBinaryDictionary(
address.mFilename, address.mOffset, address.mLength, useFullEditDistance,
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index de384037f..a1dd67f27 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -86,9 +86,6 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
*/
private final String mDictName;
- /** Dictionary locale */
- private final Locale mLocale;
-
/** Dictionary file */
private final File mDictFile;
@@ -137,10 +134,9 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
*/
public ExpandableBinaryDictionary(final Context context, final String dictName,
final Locale locale, final String dictType, final File dictFile) {
- super(dictType);
+ super(dictType, locale);
mDictName = dictName;
mContext = context;
- mLocale = locale;
mDictFile = getDictFile(context, dictName, dictFile);
mBinaryDictionary = null;
mIsReloading = new AtomicBoolean();
diff --git a/java/src/com/android/inputmethod/latin/InputAttributes.java b/java/src/com/android/inputmethod/latin/InputAttributes.java
index ebe436128..782e18255 100644
--- a/java/src/com/android/inputmethod/latin/InputAttributes.java
+++ b/java/src/com/android/inputmethod/latin/InputAttributes.java
@@ -16,6 +16,7 @@
package com.android.inputmethod.latin;
+import static com.android.inputmethod.latin.Constants.ImeOption.NO_FLOATING_GESTURE_PREVIEW;
import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE;
import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE_COMPAT;
@@ -42,6 +43,12 @@ public final class InputAttributes {
final public boolean mApplicationSpecifiedCompletionOn;
final public boolean mShouldInsertSpacesAutomatically;
final public boolean mShouldShowVoiceInputKey;
+ /**
+ * Whether the floating gesture preview should be disabled. If true, this should override the
+ * corresponding keyboard settings preference, always suppressing the floating preview text.
+ * {@link com.android.inputmethod.latin.settings.SettingsValues#mGestureFloatingPreviewTextEnabled}
+ */
+ final public boolean mDisableGestureFloatingPreviewText;
final private int mInputType;
final private EditorInfo mEditorInfo;
final private String mPackageNameForPrivateImeOptions;
@@ -76,6 +83,7 @@ public final class InputAttributes {
mApplicationSpecifiedCompletionOn = false;
mShouldInsertSpacesAutomatically = false;
mShouldShowVoiceInputKey = false;
+ mDisableGestureFloatingPreviewText = false;
return;
}
// inputClass == InputType.TYPE_CLASS_TEXT
@@ -107,6 +115,9 @@ public final class InputAttributes {
|| hasNoMicrophoneKeyOption();
mShouldShowVoiceInputKey = !noMicrophone;
+ mDisableGestureFloatingPreviewText = InputAttributes.inPrivateImeOptions(
+ mPackageNameForPrivateImeOptions, NO_FLOATING_GESTURE_PREVIEW, editorInfo);
+
// If it's a browser edit field and auto correct is not ON explicitly, then
// disable auto correction, but keep suggestions on.
// If NO_SUGGESTIONS is set, don't do prediction.
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index ee0ff5c0a..c55acd462 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -93,6 +93,7 @@ import com.android.inputmethod.latin.utils.IntentUtils;
import com.android.inputmethod.latin.utils.JniUtils;
import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper;
import com.android.inputmethod.latin.utils.StatsUtils;
+import com.android.inputmethod.latin.utils.StatsUtilsManager;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import com.android.inputmethod.latin.utils.ViewLayoutUtils;
@@ -130,8 +131,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private final Settings mSettings;
private final DictionaryFacilitator mDictionaryFacilitator =
- new DictionaryFacilitator(
- new DistracterFilterCheckingExactMatchesAndSuggestions(this /* context */));
+ new DictionaryFacilitator(this /* context */);
// TODO: Move from LatinIME.
private final PersonalizationDictionaryUpdater mPersonalizationDictionaryUpdater =
new PersonalizationDictionaryUpdater(this /* context */, mDictionaryFacilitator);
@@ -158,6 +158,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private final SubtypeSwitcher mSubtypeSwitcher;
private final SubtypeState mSubtypeState = new SubtypeState();
private final SpecialKeyDetector mSpecialKeyDetector;
+ private StatsUtilsManager mStatsUtilsManager;
// Object for reacting to adding/removing a dictionary pack.
private final BroadcastReceiver mDictionaryPackInstallReceiver =
@@ -538,6 +539,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mKeyboardSwitcher = KeyboardSwitcher.getInstance();
mSpecialKeyDetector = new SpecialKeyDetector(this);
+ mStatsUtilsManager = StatsUtilsManager.getInstance();
mIsHardwareAcceleratedDrawingEnabled =
InputMethodServiceCompatUtils.enableHardwareAcceleration(this);
Log.i(TAG, "Hardware accelerated drawing: " + mIsHardwareAcceleratedDrawingEnabled);
@@ -553,8 +555,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
KeyboardSwitcher.init(this);
AudioAndHapticFeedbackManager.init(this);
AccessibilityUtils.init(this);
- StatsUtils.init(this);
-
+ mStatsUtilsManager.onCreate(this /* context */);
super.onCreate();
mHandler.onCreate();
@@ -586,7 +587,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
registerReceiver(mDictionaryDumpBroadcastReceiver, dictDumpFilter);
DictionaryDecayBroadcastReciever.setUpIntervalAlarmForDictionaryDecaying(this);
-
StatsUtils.onCreate(mSettings.getCurrent(), mRichImm);
}
@@ -609,7 +609,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
mDictionaryFacilitator.updateEnabledSubtypes(mRichImm.getMyEnabledInputMethodSubtypeList(
true /* allowsImplicitlySelectedSubtypes */));
refreshPersonalizationDictionarySession(currentSettingsValues);
- StatsUtils.onLoadSettings(currentSettingsValues);
+ mStatsUtilsManager.onLoadSettings(currentSettingsValues);
}
private void refreshPersonalizationDictionarySession(
@@ -699,7 +699,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
unregisterReceiver(mConnectivityAndRingerModeChangeReceiver);
unregisterReceiver(mDictionaryPackInstallReceiver);
unregisterReceiver(mDictionaryDumpBroadcastReceiver);
- StatsUtils.onDestroy();
+ mStatsUtilsManager.onDestroy();
super.onDestroy();
}
@@ -1179,10 +1179,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
return mInputLogic.getCurrentRecapitalizeState();
}
- public Locale getCurrentSubtypeLocale() {
- return mSubtypeSwitcher.getCurrentSubtypeLocale();
- }
-
/**
* @param codePoints code points to get coordinates for.
* @return x,y coordinates for this keyboard, as a flattened array.
@@ -1496,7 +1492,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
final String wordToShow;
if (CapsModeUtils.isAutoCapsMode(mInputLogic.mLastComposedWord.mCapitalizedMode)) {
- wordToShow = word.toLowerCase(getCurrentSubtypeLocale());
+ wordToShow = word.toLowerCase(mSubtypeSwitcher.getCurrentSubtypeLocale());
} else {
wordToShow = word;
}
diff --git a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
index 5d4fc5861..ecf25c28b 100644
--- a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
@@ -40,7 +40,7 @@ public final class ReadOnlyBinaryDictionary extends Dictionary {
public ReadOnlyBinaryDictionary(final String filename, final long offset, final long length,
final boolean useFullEditDistance, final Locale locale, final String dictType) {
- super(dictType);
+ super(dictType, locale);
mBinaryDictionary = new BinaryDictionary(filename, offset, length, useFullEditDistance,
locale, dictType, false /* isUpdatable */);
}
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index f1c7f4340..6b6384c48 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -922,13 +922,13 @@ public final class RichInputConnection {
* prevents the application from fulfilling the request. (TODO: Improve the API when it turns
* out that we actually need more detailed error codes)
*/
- public boolean requestUpdateCursorAnchorInfo(final boolean enableMonitor,
+ public boolean requestCursorUpdates(final boolean enableMonitor,
final boolean requestImmediateCallback) {
mIC = mParent.getCurrentInputConnection();
final boolean scheduled;
if (null != mIC) {
- scheduled = InputConnectionCompatUtils.requestUpdateCursorAnchorInfo(mIC,
- enableMonitor, requestImmediateCallback);
+ scheduled = InputConnectionCompatUtils.requestCursorUpdates(mIC, enableMonitor,
+ requestImmediateCallback);
} else {
scheduled = false;
}
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 6779351fd..9e4aa40a2 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -84,7 +84,7 @@ public final class Suggest {
private static ArrayList<SuggestedWordInfo> getTransformedSuggestedWordInfoList(
final WordComposer wordComposer, final SuggestionResults results,
- final int trailingSingleQuotesCount) {
+ final int trailingSingleQuotesCount, final Locale defaultLocale) {
final boolean shouldMakeSuggestionsAllUpperCase = wordComposer.isAllUpperCase()
&& !wordComposer.isResumed();
final boolean isOnlyFirstCharCapitalized =
@@ -96,9 +96,11 @@ public final class Suggest {
|| 0 != trailingSingleQuotesCount) {
for (int i = 0; i < suggestionsCount; ++i) {
final SuggestedWordInfo wordInfo = suggestionsContainer.get(i);
+ final Locale wordLocale = wordInfo.mSourceDict.mLocale;
final SuggestedWordInfo transformedWordInfo = getTransformedSuggestedWordInfo(
- wordInfo, results.mLocale, shouldMakeSuggestionsAllUpperCase,
- isOnlyFirstCharCapitalized, trailingSingleQuotesCount);
+ wordInfo, null == wordLocale ? defaultLocale : wordLocale,
+ shouldMakeSuggestionsAllUpperCase, isOnlyFirstCharCapitalized,
+ trailingSingleQuotesCount);
suggestionsContainer.set(i, transformedWordInfo);
}
}
@@ -134,7 +136,7 @@ public final class Suggest {
SESSION_ID_TYPING);
final ArrayList<SuggestedWordInfo> suggestionsContainer =
getTransformedSuggestedWordInfoList(wordComposer, suggestionResults,
- trailingSingleQuotesCount);
+ trailingSingleQuotesCount, mDictionaryFacilitator.getLocale());
final boolean didRemoveTypedWord =
SuggestedWordInfo.removeDups(wordComposer.getTypedWord(), suggestionsContainer);
@@ -208,6 +210,7 @@ public final class Suggest {
final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
wordComposer, prevWordsInfo, proximityInfo, settingsValuesForSuggestion,
SESSION_ID_GESTURE);
+ final Locale defaultLocale = mDictionaryFacilitator.getLocale();
final ArrayList<SuggestedWordInfo> suggestionsContainer =
new ArrayList<>(suggestionResults);
final int suggestionsCount = suggestionsContainer.size();
@@ -216,9 +219,10 @@ public final class Suggest {
if (isFirstCharCapitalized || isAllUpperCase) {
for (int i = 0; i < suggestionsCount; ++i) {
final SuggestedWordInfo wordInfo = suggestionsContainer.get(i);
+ final Locale wordlocale = wordInfo.mSourceDict.mLocale;
final SuggestedWordInfo transformedWordInfo = getTransformedSuggestedWordInfo(
- wordInfo, suggestionResults.mLocale, isAllUpperCase, isFirstCharCapitalized,
- 0 /* trailingSingleQuotesCount */);
+ wordInfo, null == wordlocale ? defaultLocale : wordlocale, isAllUpperCase,
+ isFirstCharCapitalized, 0 /* trailingSingleQuotesCount */);
suggestionsContainer.set(i, transformedWordInfo);
}
}
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 1eebabece..6bc3da885 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -429,7 +429,7 @@ public class SuggestedWords {
*/
@UsedForTesting
public SuggestedWordInfo getTypedWordInfoOrNull() {
- if (this == EMPTY) {
+ if (SuggestedWords.INDEX_OF_TYPED_WORD >= size()) {
return null;
}
final SuggestedWordInfo info = getInfo(SuggestedWords.INDEX_OF_TYPED_WORD);
diff --git a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
index e4ee42660..123ab208c 100644
--- a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
+++ b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
@@ -17,21 +17,16 @@
package com.android.inputmethod.latin;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
import android.os.Process;
-import android.preference.PreferenceManager;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.compat.IntentCompatUtils;
-import com.android.inputmethod.latin.settings.Settings;
+import com.android.inputmethod.keyboard.KeyboardLayoutSet;
import com.android.inputmethod.latin.setup.LauncherIconVisibilityManager;
-import com.android.inputmethod.latin.setup.SetupActivity;
import com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils;
/**
@@ -58,6 +53,9 @@ import com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils;
* When a multiuser account has been created, {@link Intent#ACTION_USER_INITIALIZE} is received
* by this receiver and it checks the whether the setup wizard's icon should be appeared or not on
* the launcher depending on which partition this IME is installed.
+ *
+ * When the system locale has been changed, {@link Intent#ACTION_LOCALE_CHANGED} is received by
+ * this receiver and the {@link KeyboardLayoutSet}'s cache is cleared.
*/
public final class SystemBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = SystemBroadcastReceiver.class.getSimpleName();
@@ -67,21 +65,22 @@ public final class SystemBroadcastReceiver extends BroadcastReceiver {
final String intentAction = intent.getAction();
if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intentAction)) {
Log.i(TAG, "Package has been replaced: " + context.getPackageName());
- } else if (Intent.ACTION_BOOT_COMPLETED.equals(intentAction)) {
- Log.i(TAG, "Boot has been completed");
- } else if (IntentCompatUtils.is_ACTION_USER_INITIALIZE(intentAction)) {
- Log.i(TAG, "User initialize");
- }
-
- LauncherIconVisibilityManager.onReceiveGlobalIntent(intentAction, context);
-
- if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intentAction)) {
// Need to restore additional subtypes because system always clears additional
// subtypes when the package is replaced.
RichInputMethodManager.init(context);
final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
final InputMethodSubtype[] additionalSubtypes = richImm.getAdditionalSubtypes(context);
richImm.setAdditionalInputMethodSubtypes(additionalSubtypes);
+ LauncherIconVisibilityManager.updateSetupWizardIconVisibility(context);
+ } else if (Intent.ACTION_BOOT_COMPLETED.equals(intentAction)) {
+ Log.i(TAG, "Boot has been completed");
+ LauncherIconVisibilityManager.updateSetupWizardIconVisibility(context);
+ } else if (IntentCompatUtils.is_ACTION_USER_INITIALIZE(intentAction)) {
+ Log.i(TAG, "User initialize");
+ LauncherIconVisibilityManager.updateSetupWizardIconVisibility(context);
+ } else if (Intent.ACTION_LOCALE_CHANGED.equals(intentAction)) {
+ Log.i(TAG, "System locale changed");
+ KeyboardLayoutSet.onSystemLocaleChanged();
}
// The process that hosts this broadcast receiver is invoked and remains alive even after
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index 4b5edb076..233a22512 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -167,7 +167,7 @@ public final class InputLogic {
if (ProductionFlags.ENABLE_CURSOR_ANCHOR_INFO_CALLBACK) {
// AcceptTypedWord feature relies on CursorAnchorInfo.
if (settingsValues.mShouldShowUiToAcceptTypedWord) {
- mConnection.requestUpdateCursorAnchorInfo(true /* enableMonitor */,
+ mConnection.requestCursorUpdates(true /* enableMonitor */,
true /* requestImmediateCallback */);
}
}
diff --git a/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
index 6d7f53cf0..d53a61654 100644
--- a/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
@@ -30,11 +30,14 @@ import android.preference.DialogPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup;
+import android.support.v4.view.ViewCompat;
import android.util.Pair;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import android.widget.ArrayAdapter;
@@ -43,6 +46,7 @@ import android.widget.SpinnerAdapter;
import android.widget.Toast;
import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils;
+import com.android.inputmethod.compat.ViewCompatUtils;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils;
@@ -233,6 +237,12 @@ public final class CustomInputStyleSettingsFragment extends PreferenceFragment {
mSubtypeLocaleSpinner.setAdapter(mProxy.getSubtypeLocaleAdapter());
mKeyboardLayoutSetSpinner = (Spinner) v.findViewById(R.id.keyboard_layout_set_spinner);
mKeyboardLayoutSetSpinner.setAdapter(mProxy.getKeyboardLayoutSetAdapter());
+ // All keyboard layout names are in the Latin script and thus left to right. That means
+ // the view would align them to the left even if the system locale is RTL, but that
+ // would look strange. To fix this, we align them to the view's start, which will be
+ // natural for any direction.
+ ViewCompatUtils.setTextAlignment(
+ mKeyboardLayoutSetSpinner, ViewCompatUtils.TEXT_ALIGNMENT_VIEW_START);
return v;
}
@@ -398,6 +408,16 @@ public final class CustomInputStyleSettingsFragment extends PreferenceFragment {
}
@Override
+ public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
+ final Bundle savedInstanceState) {
+ final View view = super.onCreateView(inflater, container, savedInstanceState);
+ // For correct display in RTL locales, we need to set the layout direction of the
+ // fragment's top view.
+ ViewCompat.setLayoutDirection(view, ViewCompat.LAYOUT_DIRECTION_LOCALE);
+ return view;
+ }
+
+ @Override
public void onActivityCreated(final Bundle savedInstanceState) {
final Context context = getActivity();
mSubtypeLocaleAdapter = new SubtypeLocaleAdapter(context);
@@ -422,7 +442,7 @@ public final class CustomInputStyleSettingsFragment extends PreferenceFragment {
KEY_SUBTYPE_FOR_SUBTYPE_ENABLER);
final SubtypePreference subtypePref = (SubtypePreference)findPreference(
mSubtypePreferenceKeyForSubtypeEnabler);
- mSubtypeEnablerNotificationDialog = createDialog(subtypePref);
+ mSubtypeEnablerNotificationDialog = createDialog();
mSubtypeEnablerNotificationDialog.show();
}
}
@@ -476,7 +496,7 @@ public final class CustomInputStyleSettingsFragment extends PreferenceFragment {
if (findDuplicatedSubtype(subtype) == null) {
mRichImm.setAdditionalInputMethodSubtypes(getSubtypes());
mSubtypePreferenceKeyForSubtypeEnabler = subtypePref.getKey();
- mSubtypeEnablerNotificationDialog = createDialog(subtypePref);
+ mSubtypeEnablerNotificationDialog = createDialog();
mSubtypeEnablerNotificationDialog.show();
return;
}
@@ -513,7 +533,7 @@ public final class CustomInputStyleSettingsFragment extends PreferenceFragment {
localeString, keyboardLayoutSetName);
}
- private AlertDialog createDialog(final SubtypePreference subtypePref) {
+ private AlertDialog createDialog() {
final AlertDialog.Builder builder = new AlertDialog.Builder(
DialogUtils.getPlatformDialogThemeContext(getActivity()));
builder.setTitle(R.string.custom_input_styles_title)
diff --git a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
index 63d848e2d..48f4c758c 100644
--- a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
@@ -23,10 +23,16 @@ public final class DebugSettings {
"force_physical_keyboard_special_key";
public static final String PREF_SHOW_UI_TO_ACCEPT_TYPED_WORD =
"pref_show_ui_to_accept_typed_word";
- public static final String PREF_KEY_PREVIEW_SHOW_UP_START_SCALE =
- "pref_key_preview_show_up_start_scale";
- public static final String PREF_KEY_PREVIEW_DISMISS_END_SCALE =
- "pref_key_preview_dismiss_end_scale";
+ public static final String PREF_HAS_CUSTOM_KEY_PREVIEW_ANIMATION_PARAMS =
+ "pref_has_custom_key_preview_animation_params";
+ public static final String PREF_KEY_PREVIEW_SHOW_UP_START_X_SCALE =
+ "pref_key_preview_show_up_start_x_scale";
+ public static final String PREF_KEY_PREVIEW_SHOW_UP_START_Y_SCALE =
+ "pref_key_preview_show_up_start_y_scale";
+ public static final String PREF_KEY_PREVIEW_DISMISS_END_X_SCALE =
+ "pref_key_preview_dismiss_end_x_scale";
+ public static final String PREF_KEY_PREVIEW_DISMISS_END_Y_SCALE =
+ "pref_key_preview_dismiss_end_y_scale";
public static final String PREF_KEY_PREVIEW_SHOW_UP_DURATION =
"pref_key_preview_show_up_duration";
public static final String PREF_KEY_PREVIEW_DISMISS_DURATION =
diff --git a/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java
index dc2f88aa8..5640e2039 100644
--- a/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/DebugSettingsFragment.java
@@ -78,12 +78,18 @@ public final class DebugSettingsFragment extends SubScreenFragment
res.getInteger(R.integer.config_key_preview_show_up_duration));
setupKeyPreviewAnimationDuration(DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION,
res.getInteger(R.integer.config_key_preview_dismiss_duration));
- setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_SCALE,
- ResourceUtils.getFloatFromFraction(
- res, R.fraction.config_key_preview_show_up_start_scale));
- setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_SCALE,
- ResourceUtils.getFloatFromFraction(
- res, R.fraction.config_key_preview_dismiss_end_scale));
+ final float defaultKeyPreviewShowUpStartScale = ResourceUtils.getFloatFromFraction(
+ res, R.fraction.config_key_preview_show_up_start_scale);
+ final float defaultKeyPreviewDismissEndScale = ResourceUtils.getFloatFromFraction(
+ res, R.fraction.config_key_preview_dismiss_end_scale);
+ setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_X_SCALE,
+ defaultKeyPreviewShowUpStartScale);
+ setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_Y_SCALE,
+ defaultKeyPreviewShowUpStartScale);
+ setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_X_SCALE,
+ defaultKeyPreviewDismissEndScale);
+ setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_Y_SCALE,
+ defaultKeyPreviewDismissEndScale);
mServiceNeedsRestart = false;
mDebugMode = (TwoStatePreference) findPreference(DebugSettings.PREF_DEBUG_MODE);
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
index 91a2b6776..11291959c 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
@@ -104,10 +104,13 @@ public class SettingsValues {
// Debug settings
public final boolean mIsInternal;
+ public final boolean mHasCustomKeyPreviewAnimationParams;
public final int mKeyPreviewShowUpDuration;
public final int mKeyPreviewDismissDuration;
- public final float mKeyPreviewShowUpStartScale;
- public final float mKeyPreviewDismissEndScale;
+ public final float mKeyPreviewShowUpStartXScale;
+ public final float mKeyPreviewShowUpStartYScale;
+ public final float mKeyPreviewDismissEndXScale;
+ public final float mKeyPreviewDismissEndYScale;
public SettingsValues(final Context context, final SharedPreferences prefs, final Resources res,
final InputAttributes inputAttributes) {
@@ -162,8 +165,8 @@ public class SettingsValues {
autoCorrectionThresholdRawValue);
mGestureInputEnabled = Settings.readGestureInputEnabled(prefs, res);
mGestureTrailEnabled = prefs.getBoolean(Settings.PREF_GESTURE_PREVIEW_TRAIL, true);
- mGestureFloatingPreviewTextEnabled = prefs.getBoolean(
- Settings.PREF_GESTURE_FLOATING_PREVIEW_TEXT, true);
+ mGestureFloatingPreviewTextEnabled = !mInputAttributes.mDisableGestureFloatingPreviewText
+ && prefs.getBoolean(Settings.PREF_GESTURE_FLOATING_PREVIEW_TEXT, true);
mPhraseGestureEnabled = Settings.readPhraseGestureEnabled(prefs, res);
mAutoCorrectionEnabledPerUserSettings = mAutoCorrectEnabled
&& !mInputAttributes.mInputTypeNoAutoCorrect;
@@ -179,20 +182,30 @@ public class SettingsValues {
mTextHighlightColorForAddToDictionaryIndicator = res.getColor(
R.color.text_decorator_add_to_dictionary_indicator_text_highlight_color);
mIsInternal = Settings.isInternal(prefs);
+ mHasCustomKeyPreviewAnimationParams = prefs.getBoolean(
+ DebugSettings.PREF_HAS_CUSTOM_KEY_PREVIEW_ANIMATION_PARAMS, false);
mKeyPreviewShowUpDuration = Settings.readKeyPreviewAnimationDuration(
prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_DURATION,
res.getInteger(R.integer.config_key_preview_show_up_duration));
mKeyPreviewDismissDuration = Settings.readKeyPreviewAnimationDuration(
prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION,
res.getInteger(R.integer.config_key_preview_dismiss_duration));
- mKeyPreviewShowUpStartScale = Settings.readKeyPreviewAnimationScale(
- prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_SCALE,
- ResourceUtils.getFloatFromFraction(
- res, R.fraction.config_key_preview_show_up_start_scale));
- mKeyPreviewDismissEndScale = Settings.readKeyPreviewAnimationScale(
- prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_SCALE,
- ResourceUtils.getFloatFromFraction(
- res, R.fraction.config_key_preview_dismiss_end_scale));
+ final float defaultKeyPreviewShowUpStartScale = ResourceUtils.getFloatFromFraction(
+ res, R.fraction.config_key_preview_show_up_start_scale);
+ final float defaultKeyPreviewDismissEndScale = ResourceUtils.getFloatFromFraction(
+ res, R.fraction.config_key_preview_dismiss_end_scale);
+ mKeyPreviewShowUpStartXScale = Settings.readKeyPreviewAnimationScale(
+ prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_X_SCALE,
+ defaultKeyPreviewShowUpStartScale);
+ mKeyPreviewShowUpStartYScale = Settings.readKeyPreviewAnimationScale(
+ prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_Y_SCALE,
+ defaultKeyPreviewShowUpStartScale);
+ mKeyPreviewDismissEndXScale = Settings.readKeyPreviewAnimationScale(
+ prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_X_SCALE,
+ defaultKeyPreviewDismissEndScale);
+ mKeyPreviewDismissEndYScale = Settings.readKeyPreviewAnimationScale(
+ prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_Y_SCALE,
+ defaultKeyPreviewDismissEndScale);
mDisplayOrientation = res.getConfiguration().orientation;
mAppWorkarounds = new AsyncResultHolder<>();
final PackageInfo packageInfo = TargetPackageInfoGetterTask.getCachedPackageInfo(
@@ -429,10 +442,14 @@ public class SettingsValues {
sb.append("" + mKeyPreviewShowUpDuration);
sb.append("\n mKeyPreviewDismissDuration = ");
sb.append("" + mKeyPreviewDismissDuration);
- sb.append("\n mKeyPreviewShowUpStartScale = ");
- sb.append("" + mKeyPreviewShowUpStartScale);
- sb.append("\n mKeyPreviewDismissEndScale = ");
- sb.append("" + mKeyPreviewDismissEndScale);
+ sb.append("\n mKeyPreviewShowUpStartScaleX = ");
+ sb.append("" + mKeyPreviewShowUpStartXScale);
+ sb.append("\n mKeyPreviewShowUpStartScaleY = ");
+ sb.append("" + mKeyPreviewShowUpStartYScale);
+ sb.append("\n mKeyPreviewDismissEndScaleX = ");
+ sb.append("" + mKeyPreviewDismissEndXScale);
+ sb.append("\n mKeyPreviewDismissEndScaleY = ");
+ sb.append("" + mKeyPreviewDismissEndYScale);
return sb.toString();
}
}
diff --git a/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java b/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java
index 9585736e7..3f0b10225 100644
--- a/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java
+++ b/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java
@@ -24,7 +24,6 @@ import android.content.pm.PackageManager;
import android.preference.PreferenceManager;
import android.util.Log;
-import com.android.inputmethod.compat.IntentCompatUtils;
import com.android.inputmethod.latin.settings.Settings;
/**
@@ -55,14 +54,6 @@ import com.android.inputmethod.latin.settings.Settings;
public final class LauncherIconVisibilityManager {
private static final String TAG = LauncherIconVisibilityManager.class.getSimpleName();
- public static void onReceiveGlobalIntent(final String action, final Context context) {
- if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(action) ||
- Intent.ACTION_BOOT_COMPLETED.equals(action) ||
- IntentCompatUtils.is_ACTION_USER_INITIALIZE(action)) {
- updateSetupWizardIconVisibility(context);
- }
- }
-
public static void updateSetupWizardIconVisibility(final Context context) {
final ComponentName setupWizardActivity = new ComponentName(context, SetupActivity.class);
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java
index 2207ffea9..e10571e4a 100644
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java
+++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatchesAndSuggestions.java
@@ -20,13 +20,14 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.ConcurrentHashMap;
import android.content.Context;
import android.content.res.Resources;
import android.text.InputType;
import android.util.Log;
import android.util.LruCache;
+import android.util.Pair;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;
@@ -34,6 +35,7 @@ import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.KeyboardLayoutSet;
import com.android.inputmethod.latin.DictionaryFacilitator;
+import com.android.inputmethod.latin.DictionaryFacilitatorLruCache;
import com.android.inputmethod.latin.PrevWordsInfo;
import com.android.inputmethod.latin.RichInputMethodSubtype;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
@@ -49,15 +51,15 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
DistracterFilterCheckingExactMatchesAndSuggestions.class.getSimpleName();
private static final boolean DEBUG = false;
- private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120;
- private static final int MAX_DISTRACTERS_CACHE_SIZE = 512;
+ private static final int MAX_DISTRACTERS_CACHE_SIZE = 1024;
private final Context mContext;
- private final Map<Locale, InputMethodSubtype> mLocaleToSubtypeMap;
- private final Map<Locale, Keyboard> mLocaleToKeyboardMap;
- private final DictionaryFacilitator mDictionaryFacilitator;
- private final LruCache<String, Boolean> mDistractersCache;
- private Keyboard mKeyboard;
+ private final ConcurrentHashMap<Locale, InputMethodSubtype> mLocaleToSubtypeCache;
+ private final ConcurrentHashMap<Locale, Keyboard> mLocaleToKeyboardCache;
+ private final DictionaryFacilitatorLruCache mDictionaryFacilitatorLruCache;
+ // The key is a pair of a locale and a word. The value indicates the word is a distracter to
+ // words of the locale.
+ private final LruCache<Pair<Locale, String>, Boolean> mDistractersCache;
private final Object mLock = new Object();
// If the score of the top suggestion exceeds this value, the tested word (e.g.,
@@ -71,19 +73,23 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
* Create a DistracterFilter instance.
*
* @param context the context.
+ * @param dictionaryFacilitatorLruCache the cache of dictionaryFacilitators that are used for
+ * checking distracters.
*/
- public DistracterFilterCheckingExactMatchesAndSuggestions(final Context context) {
+ public DistracterFilterCheckingExactMatchesAndSuggestions(final Context context,
+ final DictionaryFacilitatorLruCache dictionaryFacilitatorLruCache) {
mContext = context;
- mLocaleToSubtypeMap = new HashMap<>();
- mLocaleToKeyboardMap = new HashMap<>();
- mDictionaryFacilitator = new DictionaryFacilitator();
+ mLocaleToSubtypeCache = new ConcurrentHashMap<>();
+ mLocaleToKeyboardCache = new ConcurrentHashMap<>();
+ mDictionaryFacilitatorLruCache = dictionaryFacilitatorLruCache;
mDistractersCache = new LruCache<>(MAX_DISTRACTERS_CACHE_SIZE);
- mKeyboard = null;
}
@Override
public void close() {
- mDictionaryFacilitator.closeDictionaries();
+ mLocaleToSubtypeCache.clear();
+ mLocaleToKeyboardCache.clear();
+ mDistractersCache.evictAll();
}
@Override
@@ -100,29 +106,36 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
newLocaleToSubtypeMap.put(locale, subtype);
}
}
- if (mLocaleToSubtypeMap.equals(newLocaleToSubtypeMap)) {
+ if (mLocaleToSubtypeCache.equals(newLocaleToSubtypeMap)) {
// Enabled subtypes have not been changed.
return;
}
- synchronized (mLock) {
- mLocaleToSubtypeMap.clear();
- mLocaleToSubtypeMap.putAll(newLocaleToSubtypeMap);
- mLocaleToKeyboardMap.clear();
+ // Update subtype and keyboard map for locales that are in the current mapping.
+ for (final Locale locale: mLocaleToSubtypeCache.keySet()) {
+ if (newLocaleToSubtypeMap.containsKey(locale)) {
+ final InputMethodSubtype newSubtype = newLocaleToSubtypeMap.remove(locale);
+ if (newSubtype.equals(newLocaleToSubtypeMap.get(locale))) {
+ // Mapping has not been changed.
+ continue;
+ }
+ mLocaleToSubtypeCache.replace(locale, newSubtype);
+ } else {
+ mLocaleToSubtypeCache.remove(locale);
+ }
+ mLocaleToKeyboardCache.remove(locale);
}
+ // Add locales that are not in the current mapping.
+ mLocaleToSubtypeCache.putAll(newLocaleToSubtypeMap);
}
- private void loadKeyboardForLocale(final Locale newLocale) {
- final Keyboard cachedKeyboard = mLocaleToKeyboardMap.get(newLocale);
+ private Keyboard getKeyboardForLocale(final Locale locale) {
+ final Keyboard cachedKeyboard = mLocaleToKeyboardCache.get(locale);
if (cachedKeyboard != null) {
- mKeyboard = cachedKeyboard;
- return;
- }
- final InputMethodSubtype subtype;
- synchronized (mLock) {
- subtype = mLocaleToSubtypeMap.get(newLocale);
+ return cachedKeyboard;
}
+ final InputMethodSubtype subtype = mLocaleToSubtypeCache.get(locale);
if (subtype == null) {
- return;
+ return null;
}
final EditorInfo editorInfo = new EditorInfo();
editorInfo.inputType = InputType.TYPE_CLASS_TEXT;
@@ -135,15 +148,9 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
builder.setSubtype(new RichInputMethodSubtype(subtype));
builder.setIsSpellChecker(false /* isSpellChecker */);
final KeyboardLayoutSet layoutSet = builder.build();
- mKeyboard = layoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET);
- }
-
- private void loadDictionariesForLocale(final Locale newlocale) throws InterruptedException {
- mDictionaryFacilitator.resetDictionaries(mContext, newlocale,
- false /* useContactsDict */, false /* usePersonalizedDicts */,
- false /* forceReloadMainDictionary */, null /* listener */);
- mDictionaryFacilitator.waitForLoadingMainDictionary(
- TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS, TimeUnit.SECONDS);
+ final Keyboard newKeyboard = layoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET);
+ mLocaleToKeyboardCache.put(locale, newKeyboard);
+ return newKeyboard;
}
/**
@@ -161,30 +168,18 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
if (locale == null) {
return false;
}
- if (!locale.equals(mDictionaryFacilitator.getLocale())) {
- synchronized (mLock) {
- if (!mLocaleToSubtypeMap.containsKey(locale)) {
- Log.e(TAG, "Locale " + locale + " is not enabled.");
- // TODO: Investigate what we should do for disabled locales.
- return false;
- }
- loadKeyboardForLocale(locale);
- // Reset dictionaries for the locale.
- try {
- mDistractersCache.evictAll();
- loadDictionariesForLocale(locale);
- } catch (final InterruptedException e) {
- Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter",
- e);
- return false;
- }
- }
+ if (!mLocaleToSubtypeCache.containsKey(locale)) {
+ Log.e(TAG, "Locale " + locale + " is not enabled.");
+ // TODO: Investigate what we should do for disabled locales.
+ return false;
}
-
+ final DictionaryFacilitator dictionaryFacilitator =
+ mDictionaryFacilitatorLruCache.get(locale);
if (DEBUG) {
Log.d(TAG, "testedWord: " + testedWord);
}
- final Boolean isCachedDistracter = mDistractersCache.get(testedWord);
+ final Pair<Locale, String> cacheKey = new Pair<>(locale, testedWord);
+ final Boolean isCachedDistracter = mDistractersCache.get(cacheKey);
if (isCachedDistracter != null && isCachedDistracter) {
if (DEBUG) {
Log.d(TAG, "isDistracter: true (cache hit)");
@@ -193,13 +188,13 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
}
final boolean isDistracterCheckedByGetMaxFreqencyOfExactMatches =
- checkDistracterUsingMaxFreqencyOfExactMatches(testedWord);
+ checkDistracterUsingMaxFreqencyOfExactMatches(dictionaryFacilitator, testedWord);
if (isDistracterCheckedByGetMaxFreqencyOfExactMatches) {
- // Add the word to the cache.
- mDistractersCache.put(testedWord, Boolean.TRUE);
+ // Add the pair of locale and word to the cache.
+ mDistractersCache.put(cacheKey, Boolean.TRUE);
return true;
}
- final boolean isValidWord = mDictionaryFacilitator.isValidWord(testedWord,
+ final boolean isValidWord = dictionaryFacilitator.isValidWord(testedWord,
false /* ignoreCase */);
if (isValidWord) {
// Valid word is not a distractor.
@@ -209,21 +204,23 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
return false;
}
+ final Keyboard keyboard = getKeyboardForLocale(locale);
final boolean isDistracterCheckedByGetSuggestion =
- checkDistracterUsingGetSuggestions(testedWord);
+ checkDistracterUsingGetSuggestions(dictionaryFacilitator, keyboard, testedWord);
if (isDistracterCheckedByGetSuggestion) {
- // Add the word to the cache.
- mDistractersCache.put(testedWord, Boolean.TRUE);
+ // Add the pair of locale and word to the cache.
+ mDistractersCache.put(cacheKey, Boolean.TRUE);
return true;
}
return false;
}
- private boolean checkDistracterUsingMaxFreqencyOfExactMatches(final String testedWord) {
+ private static boolean checkDistracterUsingMaxFreqencyOfExactMatches(
+ final DictionaryFacilitator dictionaryFacilitator, final String testedWord) {
// The tested word is a distracter when there is a word that is exact matched to the tested
// word and its probability is higher than the tested word's probability.
- final int perfectMatchFreq = mDictionaryFacilitator.getFrequency(testedWord);
- final int exactMatchFreq = mDictionaryFacilitator.getMaxFrequencyOfExactMatches(testedWord);
+ final int perfectMatchFreq = dictionaryFacilitator.getFrequency(testedWord);
+ final int exactMatchFreq = dictionaryFacilitator.getMaxFrequencyOfExactMatches(testedWord);
final boolean isDistracter = perfectMatchFreq < exactMatchFreq;
if (DEBUG) {
Log.d(TAG, "perfectMatchFreq: " + perfectMatchFreq);
@@ -233,8 +230,10 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
return isDistracter;
}
- private boolean checkDistracterUsingGetSuggestions(final String testedWord) {
- if (mKeyboard == null) {
+ private boolean checkDistracterUsingGetSuggestions(
+ final DictionaryFacilitator dictionaryFacilitator, final Keyboard keyboard,
+ final String testedWord) {
+ if (keyboard == null) {
return false;
}
final SettingsValuesForSuggestion settingsValuesForSuggestion =
@@ -247,24 +246,24 @@ public class DistracterFilterCheckingExactMatchesAndSuggestions implements Distr
testedWord;
final WordComposer composer = new WordComposer();
final int[] codePoints = StringUtils.toCodePointArray(testedWord);
-
+ final int[] coordinates = keyboard.getCoordinates(codePoints);
+ composer.setComposingWord(codePoints, coordinates);
+ final SuggestionResults suggestionResults;
synchronized (mLock) {
- final int[] coordinates = mKeyboard.getCoordinates(codePoints);
- composer.setComposingWord(codePoints, coordinates);
- final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
- composer, PrevWordsInfo.EMPTY_PREV_WORDS_INFO, mKeyboard.getProximityInfo(),
+ suggestionResults = dictionaryFacilitator.getSuggestionResults(
+ composer, PrevWordsInfo.EMPTY_PREV_WORDS_INFO, keyboard.getProximityInfo(),
settingsValuesForSuggestion, 0 /* sessionId */);
- if (suggestionResults.isEmpty()) {
- return false;
- }
- final SuggestedWordInfo firstSuggestion = suggestionResults.first();
- final boolean isDistractor = suggestionExceedsDistracterThreshold(
- firstSuggestion, consideredWord, DISTRACTER_WORD_SCORE_THRESHOLD);
- if (DEBUG) {
- Log.d(TAG, "isDistracter: " + isDistractor);
- }
- return isDistractor;
}
+ if (suggestionResults.isEmpty()) {
+ return false;
+ }
+ final SuggestedWordInfo firstSuggestion = suggestionResults.first();
+ final boolean isDistractor = suggestionExceedsDistracterThreshold(
+ firstSuggestion, consideredWord, DISTRACTER_WORD_SCORE_THRESHOLD);
+ if (DEBUG) {
+ Log.d(TAG, "isDistracter: " + isDistractor);
+ }
+ return isDistractor;
}
private static boolean suggestionExceedsDistracterThreshold(final SuggestedWordInfo suggestion,
diff --git a/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java b/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java
index 7170bd789..eaa5743d4 100644
--- a/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java
+++ b/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java
@@ -30,18 +30,16 @@ import java.util.TreeSet;
* than its limit
*/
public final class SuggestionResults extends TreeSet<SuggestedWordInfo> {
- public final Locale mLocale;
public final ArrayList<SuggestedWordInfo> mRawSuggestions;
private final int mCapacity;
- public SuggestionResults(final Locale locale, final int capacity) {
- this(locale, sSuggestedWordInfoComparator, capacity);
+ public SuggestionResults(final int capacity) {
+ this(sSuggestedWordInfoComparator, capacity);
}
- public SuggestionResults(final Locale locale, final Comparator<SuggestedWordInfo> comparator,
+ public SuggestionResults(final Comparator<SuggestedWordInfo> comparator,
final int capacity) {
super(comparator);
- mLocale = locale;
mCapacity = capacity;
if (ProductionFlags.INCLUDE_RAW_SUGGESTIONS) {
mRawSuggestions = new ArrayList<>();
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h
index 214cdfca6..e44d5ae20 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node.h
@@ -103,10 +103,10 @@ class DicNode {
PROF_NODE_COPY(&dicNode->mProfiler, mProfiler);
}
- // Init for root with prevWordsPtNodePos which is used for n-gram
- void initAsRoot(const int rootPtNodeArrayPos, const int *const prevWordsPtNodePos) {
+ // Init for root with prevWordIds which is used for n-gram
+ void initAsRoot(const int rootPtNodeArrayPos, const int *const prevWordIds) {
mIsCachedForNextSuggestion = false;
- mDicNodeProperties.init(rootPtNodeArrayPos, prevWordsPtNodePos);
+ mDicNodeProperties.init(rootPtNodeArrayPos, prevWordIds);
mDicNodeState.init();
PROF_NODE_RESET(mProfiler);
}
@@ -114,12 +114,12 @@ class DicNode {
// Init for root with previous word
void initAsRootWithPreviousWord(const DicNode *const dicNode, const int rootPtNodeArrayPos) {
mIsCachedForNextSuggestion = dicNode->mIsCachedForNextSuggestion;
- int newPrevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- newPrevWordsPtNodePos[0] = dicNode->mDicNodeProperties.getPtNodePos();
- for (size_t i = 1; i < NELEMS(newPrevWordsPtNodePos); ++i) {
- newPrevWordsPtNodePos[i] = dicNode->getPrevWordsTerminalPtNodePos()[i - 1];
+ int newPrevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ newPrevWordIds[0] = dicNode->mDicNodeProperties.getWordId();
+ for (size_t i = 1; i < NELEMS(newPrevWordIds); ++i) {
+ newPrevWordIds[i] = dicNode->getPrevWordIds()[i - 1];
}
- mDicNodeProperties.init(rootPtNodeArrayPos, newPrevWordsPtNodePos);
+ mDicNodeProperties.init(rootPtNodeArrayPos, newPrevWordIds);
mDicNodeState.initAsRootWithPreviousWord(&dicNode->mDicNodeState,
dicNode->mDicNodeProperties.getDepth());
PROF_NODE_COPY(&dicNode->mProfiler, mProfiler);
@@ -145,7 +145,7 @@ class DicNode {
dicNode->mDicNodeProperties.getLeavingDepth() + mergedNodeCodePointCount);
mDicNodeProperties.init(ptNodePos, childrenPtNodeArrayPos, mergedNodeCodePoints[0],
probability, wordId, hasChildren, isBlacklistedOrNotAWord, newDepth,
- newLeavingDepth, dicNode->mDicNodeProperties.getPrevWordsTerminalPtNodePos());
+ newLeavingDepth, dicNode->mDicNodeProperties.getPrevWordIds());
mDicNodeState.init(&dicNode->mDicNodeState, mergedNodeCodePointCount,
mergedNodeCodePoints);
PROF_NODE_COPY(&dicNode->mProfiler, mProfiler);
@@ -204,13 +204,18 @@ class DicNode {
}
// Used to get n-gram probability in DicNodeUtils.
+ int getWordId() const {
+ return mDicNodeProperties.getWordId();
+ }
+
+ // TODO: Remove
int getPtNodePos() const {
return mDicNodeProperties.getPtNodePos();
}
- // TODO: Use view class to return PtNodePos array.
- const int *getPrevWordsTerminalPtNodePos() const {
- return mDicNodeProperties.getPrevWordsTerminalPtNodePos();
+ // TODO: Use view class to return word id array.
+ const int *getPrevWordIds() const {
+ return mDicNodeProperties.getPrevWordIds();
}
// Used in DicNodeUtils
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
index 69ea67418..87d245276 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
@@ -29,8 +29,8 @@ namespace latinime {
/* static */ void DicNodeUtils::initAsRoot(
const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
- const int *const prevWordsPtNodePos, DicNode *const newRootDicNode) {
- newRootDicNode->initAsRoot(dictionaryStructurePolicy->getRootPosition(), prevWordsPtNodePos);
+ const int *const prevWordIds, DicNode *const newRootDicNode) {
+ newRootDicNode->initAsRoot(dictionaryStructurePolicy->getRootPosition(), prevWordIds);
}
/*static */ void DicNodeUtils::initAsRootWithPreviousWord(
@@ -86,9 +86,9 @@ namespace latinime {
const DicNode *const dicNode, MultiBigramMap *const multiBigramMap) {
const int unigramProbability = dicNode->getProbability();
if (multiBigramMap) {
- const int *const prevWordsPtNodePos = dicNode->getPrevWordsTerminalPtNodePos();
+ const int *const prevWordIds = dicNode->getPrevWordIds();
return multiBigramMap->getBigramProbability(dictionaryStructurePolicy,
- prevWordsPtNodePos, dicNode->getPtNodePos(), unigramProbability);
+ prevWordIds, dicNode->getWordId(), unigramProbability);
}
return dictionaryStructurePolicy->getProbability(unigramProbability,
NOT_A_PROBABILITY);
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.h b/native/jni/src/suggest/core/dicnode/dic_node_utils.h
index 00e80c604..56ff6e3d0 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.h
@@ -30,7 +30,7 @@ class DicNodeUtils {
public:
static void initAsRoot(
const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
- const int *const prevWordPtNodePos, DicNode *const newRootDicNode);
+ const int *const prevWordIds, DicNode *const newRootDicNode);
static void initAsRootWithPreviousWord(
const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
const DicNode *const prevWordLastDicNode, DicNode *const newRootDicNode);
diff --git a/native/jni/src/suggest/core/dicnode/internal/dic_node_properties.h b/native/jni/src/suggest/core/dicnode/internal/dic_node_properties.h
index fc242a92b..1d905b9fe 100644
--- a/native/jni/src/suggest/core/dicnode/internal/dic_node_properties.h
+++ b/native/jni/src/suggest/core/dicnode/internal/dic_node_properties.h
@@ -39,7 +39,7 @@ class DicNodeProperties {
// Should be called only once per DicNode is initialized.
void init(const int pos, const int childrenPos, const int nodeCodePoint, const int probability,
const int wordId, const bool hasChildren, const bool isBlacklistedOrNotAWord,
- const uint16_t depth, const uint16_t leavingDepth, const int *const prevWordsNodePos) {
+ const uint16_t depth, const uint16_t leavingDepth, const int *const prevWordIds) {
mPtNodePos = pos;
mChildrenPtNodeArrayPos = childrenPos;
mDicNodeCodePoint = nodeCodePoint;
@@ -49,11 +49,11 @@ class DicNodeProperties {
mIsBlacklistedOrNotAWord = isBlacklistedOrNotAWord;
mDepth = depth;
mLeavingDepth = leavingDepth;
- memmove(mPrevWordsTerminalPtNodePos, prevWordsNodePos, sizeof(mPrevWordsTerminalPtNodePos));
+ memmove(mPrevWordIds, prevWordIds, sizeof(mPrevWordIds));
}
// Init for root with prevWordsPtNodePos which is used for n-gram
- void init(const int rootPtNodeArrayPos, const int *const prevWordsNodePos) {
+ void init(const int rootPtNodeArrayPos, const int *const prevWordIds) {
mPtNodePos = NOT_A_DICT_POS;
mChildrenPtNodeArrayPos = rootPtNodeArrayPos;
mDicNodeCodePoint = NOT_A_CODE_POINT;
@@ -63,7 +63,7 @@ class DicNodeProperties {
mIsBlacklistedOrNotAWord = false;
mDepth = 0;
mLeavingDepth = 0;
- memmove(mPrevWordsTerminalPtNodePos, prevWordsNodePos, sizeof(mPrevWordsTerminalPtNodePos));
+ memmove(mPrevWordIds, prevWordIds, sizeof(mPrevWordIds));
}
void initByCopy(const DicNodeProperties *const dicNodeProp) {
@@ -76,8 +76,7 @@ class DicNodeProperties {
mIsBlacklistedOrNotAWord = dicNodeProp->mIsBlacklistedOrNotAWord;
mDepth = dicNodeProp->mDepth;
mLeavingDepth = dicNodeProp->mLeavingDepth;
- memmove(mPrevWordsTerminalPtNodePos, dicNodeProp->mPrevWordsTerminalPtNodePos,
- sizeof(mPrevWordsTerminalPtNodePos));
+ memmove(mPrevWordIds, dicNodeProp->mPrevWordIds, sizeof(mPrevWordIds));
}
// Init as passing child
@@ -91,8 +90,7 @@ class DicNodeProperties {
mIsBlacklistedOrNotAWord = dicNodeProp->mIsBlacklistedOrNotAWord;
mDepth = dicNodeProp->mDepth + 1; // Increment the depth of a passing child
mLeavingDepth = dicNodeProp->mLeavingDepth;
- memmove(mPrevWordsTerminalPtNodePos, dicNodeProp->mPrevWordsTerminalPtNodePos,
- sizeof(mPrevWordsTerminalPtNodePos));
+ memmove(mPrevWordIds, dicNodeProp->mPrevWordIds, sizeof(mPrevWordIds));
}
int getPtNodePos() const {
@@ -132,8 +130,12 @@ class DicNodeProperties {
return mIsBlacklistedOrNotAWord;
}
- const int *getPrevWordsTerminalPtNodePos() const {
- return mPrevWordsTerminalPtNodePos;
+ const int *getPrevWordIds() const {
+ return mPrevWordIds;
+ }
+
+ int getWordId() const {
+ return mWordId;
}
private:
@@ -149,7 +151,7 @@ class DicNodeProperties {
bool mIsBlacklistedOrNotAWord;
uint16_t mDepth;
uint16_t mLeavingDepth;
- int mPrevWordsTerminalPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ int mPrevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
};
} // namespace latinime
#endif // LATINIME_DIC_NODE_PROPERTIES_H
diff --git a/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h b/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h
index 558e0a5c3..ee1606b6a 100644
--- a/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h
+++ b/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h
@@ -31,6 +31,11 @@ class BinaryDictionaryShortcutIterator {
mPos(shortcutStructurePolicy->getStartPos(shortcutPos)),
mHasNextShortcutTarget(shortcutPos != NOT_A_DICT_POS) {}
+ BinaryDictionaryShortcutIterator(const BinaryDictionaryShortcutIterator &&shortcutIterator)
+ : mShortcutStructurePolicy(shortcutIterator.mShortcutStructurePolicy),
+ mPos(shortcutIterator.mPos),
+ mHasNextShortcutTarget(shortcutIterator.mHasNextShortcutTarget) {}
+
AK_FORCE_INLINE bool hasNextShortcutTarget() const {
return mHasNextShortcutTarget;
}
@@ -45,7 +50,8 @@ class BinaryDictionaryShortcutIterator {
}
private:
- DISALLOW_IMPLICIT_CONSTRUCTORS(BinaryDictionaryShortcutIterator);
+ DISALLOW_DEFAULT_CONSTRUCTOR(BinaryDictionaryShortcutIterator);
+ DISALLOW_ASSIGNMENT_OPERATOR(BinaryDictionaryShortcutIterator);
const DictionaryShortcutsStructurePolicy *const mShortcutStructurePolicy;
int mPos;
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index c025bfcf5..8f9b2aa12 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -67,8 +67,8 @@ Dictionary::NgramListenerForPrediction::NgramListenerForPrediction(
mDictStructurePolicy(dictStructurePolicy) {}
void Dictionary::NgramListenerForPrediction::onVisitEntry(const int ngramProbability,
- const int targetPtNodePos) {
- if (targetPtNodePos == NOT_A_DICT_POS) {
+ const int targetWordId) {
+ if (targetWordId == NOT_A_WORD_ID) {
return;
}
if (mPrevWordsInfo->isNthPrevWordBeginningOfSentence(1 /* n */)
@@ -78,8 +78,8 @@ void Dictionary::NgramListenerForPrediction::onVisitEntry(const int ngramProbabi
int targetWordCodePoints[MAX_WORD_LENGTH];
int unigramProbability = 0;
const int codePointCount = mDictStructurePolicy->
- getCodePointsAndProbabilityAndReturnCodePointCount(targetPtNodePos,
- MAX_WORD_LENGTH, targetWordCodePoints, &unigramProbability);
+ getCodePointsAndProbabilityAndReturnCodePointCount(targetWordId, MAX_WORD_LENGTH,
+ targetWordCodePoints, &unigramProbability);
if (codePointCount <= 0) {
return;
}
@@ -93,11 +93,10 @@ void Dictionary::getPredictions(const PrevWordsInfo *const prevWordsInfo,
TimeKeeper::setCurrentTime();
NgramListenerForPrediction listener(prevWordsInfo, outSuggestionResults,
mDictionaryStructureWithBufferPolicy.get());
- int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- prevWordsInfo->getPrevWordsTerminalPtNodePos(
- mDictionaryStructureWithBufferPolicy.get(), prevWordsPtNodePos,
+ int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds,
true /* tryLowerCaseSearch */);
- mDictionaryStructureWithBufferPolicy->iterateNgramEntries(prevWordsPtNodePos, &listener);
+ mDictionaryStructureWithBufferPolicy->iterateNgramEntries(prevWordIds, &listener);
}
int Dictionary::getProbability(const int *word, int length) const {
@@ -113,18 +112,17 @@ int Dictionary::getMaxProbabilityOfExactMatches(const int *word, int length) con
int Dictionary::getNgramProbability(const PrevWordsInfo *const prevWordsInfo, const int *word,
int length) const {
TimeKeeper::setCurrentTime();
- int nextWordPos = mDictionaryStructureWithBufferPolicy->getTerminalPtNodePositionOfWord(
+ int wordId = mDictionaryStructureWithBufferPolicy->getWordId(
CodePointArrayView(word, length), false /* forceLowerCaseSearch */);
- if (NOT_A_DICT_POS == nextWordPos) return NOT_A_PROBABILITY;
+ if (wordId == NOT_A_WORD_ID) return NOT_A_PROBABILITY;
if (!prevWordsInfo) {
- return getDictionaryStructurePolicy()->getProbabilityOfPtNode(
- nullptr /* prevWordsPtNodePos */, nextWordPos);
+ return getDictionaryStructurePolicy()->getProbabilityOfWord(
+ nullptr /* prevWordsPtNodePos */, wordId);
}
- int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- prevWordsInfo->getPrevWordsTerminalPtNodePos(
- mDictionaryStructureWithBufferPolicy.get(), prevWordsPtNodePos,
+ int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds,
true /* tryLowerCaseSearch */);
- return getDictionaryStructurePolicy()->getProbabilityOfPtNode(prevWordsPtNodePos, nextWordPos);
+ return getDictionaryStructurePolicy()->getProbabilityOfWord(prevWordIds, wordId);
}
bool Dictionary::addUnigramEntry(const int *const word, const int length,
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index 732d3b199..50951fbc1 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -120,7 +120,7 @@ class Dictionary {
NgramListenerForPrediction(const PrevWordsInfo *const prevWordsInfo,
SuggestionResults *const suggestionResults,
const DictionaryStructureWithBufferPolicy *const dictStructurePolicy);
- virtual void onVisitEntry(const int ngramProbability, const int targetPtNodePos);
+ virtual void onVisitEntry(const int ngramProbability, const int targetWordId);
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(NgramListenerForPrediction);
diff --git a/native/jni/src/suggest/core/dictionary/dictionary_utils.cpp b/native/jni/src/suggest/core/dictionary/dictionary_utils.cpp
index b94966cbe..b372b6b4f 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary_utils.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary_utils.cpp
@@ -34,11 +34,11 @@ namespace latinime {
// No prev words information.
PrevWordsInfo emptyPrevWordsInfo;
- int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- emptyPrevWordsInfo.getPrevWordsTerminalPtNodePos(dictionaryStructurePolicy,
- prevWordsPtNodePos, false /* tryLowerCaseSearch */);
+ int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ emptyPrevWordsInfo.getPrevWordIds(dictionaryStructurePolicy, prevWordIds,
+ false /* tryLowerCaseSearch */);
current.emplace_back();
- DicNodeUtils::initAsRoot(dictionaryStructurePolicy, prevWordsPtNodePos, &current.front());
+ DicNodeUtils::initAsRoot(dictionaryStructurePolicy, prevWordIds, &current.front());
for (int i = 0; i < codePointCount; ++i) {
// The base-lower input is used to ignore case errors and accent errors.
const int codePoint = CharUtils::toBaseLowerCase(codePoints[i]);
diff --git a/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp b/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp
index 91f33a8dd..979d61edb 100644
--- a/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp
+++ b/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp
@@ -35,39 +35,37 @@ const int MultiBigramMap::BigramMap::DEFAULT_HASH_MAP_SIZE_FOR_EACH_BIGRAM_MAP =
// Also caches the bigrams if there is space remaining and they have not been cached already.
int MultiBigramMap::getBigramProbability(
const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos, const int nextWordPosition,
+ const int *const prevWordIds, const int nextWordId,
const int unigramProbability) {
- if (!prevWordsPtNodePos || prevWordsPtNodePos[0] == NOT_A_DICT_POS) {
+ if (!prevWordIds || prevWordIds[0] == NOT_A_WORD_ID) {
return structurePolicy->getProbability(unigramProbability, NOT_A_PROBABILITY);
}
- std::unordered_map<int, BigramMap>::const_iterator mapPosition =
- mBigramMaps.find(prevWordsPtNodePos[0]);
+ const auto mapPosition = mBigramMaps.find(prevWordIds[0]);
if (mapPosition != mBigramMaps.end()) {
- return mapPosition->second.getBigramProbability(structurePolicy, nextWordPosition,
+ return mapPosition->second.getBigramProbability(structurePolicy, nextWordId,
unigramProbability);
}
if (mBigramMaps.size() < MAX_CACHED_PREV_WORDS_IN_BIGRAM_MAP) {
- addBigramsForWordPosition(structurePolicy, prevWordsPtNodePos);
- return mBigramMaps[prevWordsPtNodePos[0]].getBigramProbability(structurePolicy,
- nextWordPosition, unigramProbability);
+ addBigramsForWord(structurePolicy, prevWordIds);
+ return mBigramMaps[prevWordIds[0]].getBigramProbability(structurePolicy,
+ nextWordId, unigramProbability);
}
- return readBigramProbabilityFromBinaryDictionary(structurePolicy, prevWordsPtNodePos,
- nextWordPosition, unigramProbability);
+ return readBigramProbabilityFromBinaryDictionary(structurePolicy, prevWordIds,
+ nextWordId, unigramProbability);
}
void MultiBigramMap::BigramMap::init(
const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos) {
- structurePolicy->iterateNgramEntries(prevWordsPtNodePos, this /* listener */);
+ const int *const prevWordIds) {
+ structurePolicy->iterateNgramEntries(prevWordIds, this /* listener */);
}
int MultiBigramMap::BigramMap::getBigramProbability(
const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int nextWordPosition, const int unigramProbability) const {
+ const int nextWordId, const int unigramProbability) const {
int bigramProbability = NOT_A_PROBABILITY;
- if (mBloomFilter.isInFilter(nextWordPosition)) {
- const std::unordered_map<int, int>::const_iterator bigramProbabilityIt =
- mBigramMap.find(nextWordPosition);
+ if (mBloomFilter.isInFilter(nextWordId)) {
+ const auto bigramProbabilityIt = mBigramMap.find(nextWordId);
if (bigramProbabilityIt != mBigramMap.end()) {
bigramProbability = bigramProbabilityIt->second;
}
@@ -75,29 +73,27 @@ int MultiBigramMap::BigramMap::getBigramProbability(
return structurePolicy->getProbability(unigramProbability, bigramProbability);
}
-void MultiBigramMap::BigramMap::onVisitEntry(const int ngramProbability,
- const int targetPtNodePos) {
- if (targetPtNodePos == NOT_A_DICT_POS) {
+void MultiBigramMap::BigramMap::onVisitEntry(const int ngramProbability, const int targetWordId) {
+ if (targetWordId == NOT_A_WORD_ID) {
return;
}
- mBigramMap[targetPtNodePos] = ngramProbability;
- mBloomFilter.setInFilter(targetPtNodePos);
+ mBigramMap[targetWordId] = ngramProbability;
+ mBloomFilter.setInFilter(targetWordId);
}
-void MultiBigramMap::addBigramsForWordPosition(
+void MultiBigramMap::addBigramsForWord(
const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos) {
- if (prevWordsPtNodePos) {
- mBigramMaps[prevWordsPtNodePos[0]].init(structurePolicy, prevWordsPtNodePos);
+ const int *const prevWordIds) {
+ if (prevWordIds) {
+ mBigramMaps[prevWordIds[0]].init(structurePolicy, prevWordIds);
}
}
int MultiBigramMap::readBigramProbabilityFromBinaryDictionary(
const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos, const int nextWordPosition,
+ const int *const prevWordIds, const int nextWordId,
const int unigramProbability) {
- const int bigramProbability = structurePolicy->getProbabilityOfPtNode(prevWordsPtNodePos,
- nextWordPosition);
+ const int bigramProbability = structurePolicy->getProbabilityOfWord(prevWordIds, nextWordId);
if (bigramProbability != NOT_A_PROBABILITY) {
return bigramProbability;
}
diff --git a/native/jni/src/suggest/core/dictionary/multi_bigram_map.h b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h
index ad36dde83..a8c4ded57 100644
--- a/native/jni/src/suggest/core/dictionary/multi_bigram_map.h
+++ b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h
@@ -39,8 +39,7 @@ class MultiBigramMap {
// Look up the bigram probability for the given word pair from the cached bigram maps.
// Also caches the bigrams if there is space remaining and they have not been cached already.
int getBigramProbability(const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos, const int nextWordPosition,
- const int unigramProbability);
+ const int *const prevWordIds, const int nextWordId, const int unigramProbability);
void clear() {
mBigramMaps.clear();
@@ -58,11 +57,11 @@ class MultiBigramMap {
virtual ~BigramMap() {}
void init(const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos);
+ const int *const prevWordIds);
int getBigramProbability(
const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int nextWordPosition, const int unigramProbability) const;
- virtual void onVisitEntry(const int ngramProbability, const int targetPtNodePos);
+ const int nextWordId, const int unigramProbability) const;
+ virtual void onVisitEntry(const int ngramProbability, const int targetWordId);
private:
static const int DEFAULT_HASH_MAP_SIZE_FOR_EACH_BIGRAM_MAP;
@@ -70,14 +69,12 @@ class MultiBigramMap {
BloomFilter mBloomFilter;
};
- void addBigramsForWordPosition(
- const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos);
+ void addBigramsForWord(const DictionaryStructureWithBufferPolicy *const structurePolicy,
+ const int *const prevWordIds);
int readBigramProbabilityFromBinaryDictionary(
const DictionaryStructureWithBufferPolicy *const structurePolicy,
- const int *const prevWordsPtNodePos, const int nextWordPosition,
- const int unigramProbability);
+ const int *const prevWordIds, const int nextWordId, const int unigramProbability);
static const size_t MAX_CACHED_PREV_WORDS_IN_BIGRAM_MAP;
std::unordered_map<int, BigramMap> mBigramMaps;
diff --git a/native/jni/src/suggest/core/dictionary/ngram_listener.h b/native/jni/src/suggest/core/dictionary/ngram_listener.h
index 88b88bafb..e9b3c1aaf 100644
--- a/native/jni/src/suggest/core/dictionary/ngram_listener.h
+++ b/native/jni/src/suggest/core/dictionary/ngram_listener.h
@@ -26,7 +26,7 @@ namespace latinime {
*/
class NgramListener {
public:
- virtual void onVisitEntry(const int ngramProbability, const int targetPtNodePos) = 0;
+ virtual void onVisitEntry(const int ngramProbability, const int targetWordId) = 0;
virtual ~NgramListener() {};
protected:
diff --git a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
index 0faf00003..aeeb66f93 100644
--- a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
+++ b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
@@ -20,6 +20,7 @@
#include <memory>
#include "defines.h"
+#include "suggest/core/dictionary/binary_dictionary_shortcut_iterator.h"
#include "suggest/core/dictionary/property/word_property.h"
#include "utils/int_array_view.h"
@@ -28,7 +29,6 @@ namespace latinime {
class DicNode;
class DicNodeVector;
class DictionaryHeaderStructurePolicy;
-class DictionaryShortcutsStructurePolicy;
class NgramListener;
class PrevWordsInfo;
class UnigramProperty;
@@ -50,26 +50,23 @@ class DictionaryStructureWithBufferPolicy {
DicNodeVector *const childDicNodes) const = 0;
virtual int getCodePointsAndProbabilityAndReturnCodePointCount(
- const int ptNodePos, const int maxCodePointCount, int *const outCodePoints,
+ const int wordId, const int maxCodePointCount, int *const outCodePoints,
int *const outUnigramProbability) const = 0;
- virtual int getTerminalPtNodePositionOfWord(const CodePointArrayView wordCodePoints,
+ virtual int getWordId(const CodePointArrayView wordCodePoints,
const bool forceLowerCaseSearch) const = 0;
virtual int getProbability(const int unigramProbability, const int bigramProbability) const = 0;
- virtual int getProbabilityOfPtNode(const int *const prevWordsPtNodePos,
- const int ptNodePos) const = 0;
+ virtual int getProbabilityOfWord(const int *const prevWordIds, const int wordId) const = 0;
- virtual void iterateNgramEntries(const int *const prevWordsPtNodePos,
+ virtual void iterateNgramEntries(const int *const prevWordIds,
NgramListener *const listener) const = 0;
- virtual int getShortcutPositionOfPtNode(const int ptNodePos) const = 0;
+ virtual BinaryDictionaryShortcutIterator getShortcutIterator(const int wordId) const = 0;
virtual const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const = 0;
- virtual const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const = 0;
-
// Returns whether the update was success or not.
virtual bool addUnigramEntry(const CodePointArrayView wordCodePoints,
const UnigramProperty *const unigramProperty) = 0;
diff --git a/native/jni/src/suggest/core/result/suggestions_output_utils.cpp b/native/jni/src/suggest/core/result/suggestions_output_utils.cpp
index 0b99b75ec..ad860c4a4 100644
--- a/native/jni/src/suggest/core/result/suggestions_output_utils.cpp
+++ b/native/jni/src/suggest/core/result/suggestions_output_utils.cpp
@@ -139,10 +139,9 @@ const int SuggestionsOutputUtils::MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT = 16;
// Shortcut is not supported for multiple words suggestions.
// TODO: Check shortcuts during traversal for multiple words suggestions.
if (!terminalDicNode->hasMultipleWords()) {
- BinaryDictionaryShortcutIterator shortcutIt(
- traverseSession->getDictionaryStructurePolicy()->getShortcutsStructurePolicy(),
- traverseSession->getDictionaryStructurePolicy()
- ->getShortcutPositionOfPtNode(terminalDicNode->getPtNodePos()));
+ BinaryDictionaryShortcutIterator shortcutIt =
+ traverseSession->getDictionaryStructurePolicy()->getShortcutIterator(
+ terminalDicNode->getWordId());
const bool sameAsTyped = scoringPolicy->sameAsTyped(traverseSession, terminalDicNode);
outputShortcuts(&shortcutIt, finalScore, sameAsTyped, outSuggestionResults);
}
diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.cpp b/native/jni/src/suggest/core/session/dic_traverse_session.cpp
index f1e411f38..d4d4d1eed 100644
--- a/native/jni/src/suggest/core/session/dic_traverse_session.cpp
+++ b/native/jni/src/suggest/core/session/dic_traverse_session.cpp
@@ -35,8 +35,8 @@ void DicTraverseSession::init(const Dictionary *const dictionary,
mMultiWordCostMultiplier = getDictionaryStructurePolicy()->getHeaderStructurePolicy()
->getMultiWordCostMultiplier();
mSuggestOptions = suggestOptions;
- prevWordsInfo->getPrevWordsTerminalPtNodePos(
- getDictionaryStructurePolicy(), mPrevWordsPtNodePos, true /* tryLowerCaseSearch */);
+ prevWordsInfo->getPrevWordIds(getDictionaryStructurePolicy(), mPrevWordsIds,
+ true /* tryLowerCaseSearch */);
}
void DicTraverseSession::setupForGetSuggestions(const ProximityInfo *pInfo,
diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.h b/native/jni/src/suggest/core/session/dic_traverse_session.h
index 5a51a112d..0e676d897 100644
--- a/native/jni/src/suggest/core/session/dic_traverse_session.h
+++ b/native/jni/src/suggest/core/session/dic_traverse_session.h
@@ -55,8 +55,8 @@ class DicTraverseSession {
mMultiWordCostMultiplier(1.0f) {
// NOTE: mProximityInfoStates is an array of instances.
// No need to initialize it explicitly here.
- for (size_t i = 0; i < NELEMS(mPrevWordsPtNodePos); ++i) {
- mPrevWordsPtNodePos[i] = NOT_A_DICT_POS;
+ for (size_t i = 0; i < NELEMS(mPrevWordsIds); ++i) {
+ mPrevWordsIds[i] = NOT_A_DICT_POS;
}
}
@@ -79,7 +79,7 @@ class DicTraverseSession {
//--------------------
const ProximityInfo *getProximityInfo() const { return mProximityInfo; }
const SuggestOptions *getSuggestOptions() const { return mSuggestOptions; }
- const int *getPrevWordsPtNodePos() const { return mPrevWordsPtNodePos; }
+ const int *getPrevWordIds() const { return mPrevWordsIds; }
DicNodesCache *getDicTraverseCache() { return &mDicNodesCache; }
MultiBigramMap *getMultiBigramMap() { return &mMultiBigramMap; }
const ProximityInfoState *getProximityInfoState(int id) const {
@@ -166,7 +166,7 @@ class DicTraverseSession {
const int *const inputYs, const int *const times, const int *const pointerIds,
const int inputSize, const float maxSpatialDistance, const int maxPointerCount);
- int mPrevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ int mPrevWordsIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
const ProximityInfo *mProximityInfo;
const Dictionary *mDictionary;
const SuggestOptions *mSuggestOptions;
diff --git a/native/jni/src/suggest/core/session/prev_words_info.h b/native/jni/src/suggest/core/session/prev_words_info.h
index 9b3a7d468..fc9a35968 100644
--- a/native/jni/src/suggest/core/session/prev_words_info.h
+++ b/native/jni/src/suggest/core/session/prev_words_info.h
@@ -18,14 +18,12 @@
#define LATINIME_PREV_WORDS_INFO_H
#include "defines.h"
-#include "suggest/core/dictionary/binary_dictionary_bigrams_iterator.h"
#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
#include "utils/char_utils.h"
#include "utils/int_array_view.h"
namespace latinime {
-// TODO: Support n-gram.
class PrevWordsInfo {
public:
// No prev word information.
@@ -81,11 +79,10 @@ class PrevWordsInfo {
return false;
}
- void getPrevWordsTerminalPtNodePos(
- const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
- int *const outPrevWordsTerminalPtNodePos, const bool tryLowerCaseSearch) const {
+ void getPrevWordIds(const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
+ int *const outPrevWordIds, const bool tryLowerCaseSearch) const {
for (size_t i = 0; i < NELEMS(mPrevWordCodePoints); ++i) {
- outPrevWordsTerminalPtNodePos[i] = getTerminalPtNodePosOfWord(dictStructurePolicy,
+ outPrevWordIds[i] = getWordId(dictStructurePolicy,
mPrevWordCodePoints[i], mPrevWordCodePointCount[i],
mIsBeginningOfSentence[i], tryLowerCaseSearch);
}
@@ -110,12 +107,11 @@ class PrevWordsInfo {
private:
DISALLOW_COPY_AND_ASSIGN(PrevWordsInfo);
- static int getTerminalPtNodePosOfWord(
- const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
+ static int getWordId(const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
const int *const wordCodePoints, const int wordCodePointCount,
const bool isBeginningOfSentence, const bool tryLowerCaseSearch) {
if (!dictStructurePolicy || !wordCodePoints || wordCodePointCount > MAX_WORD_LENGTH) {
- return NOT_A_DICT_POS;
+ return NOT_A_WORD_ID;
}
int codePoints[MAX_WORD_LENGTH];
int codePointCount = wordCodePointCount;
@@ -124,21 +120,19 @@ class PrevWordsInfo {
codePointCount = CharUtils::attachBeginningOfSentenceMarker(codePoints,
codePointCount, MAX_WORD_LENGTH);
if (codePointCount <= 0) {
- return NOT_A_DICT_POS;
+ return NOT_A_WORD_ID;
}
}
const CodePointArrayView codePointArrayView(codePoints, codePointCount);
- const int wordPtNodePos = dictStructurePolicy->getTerminalPtNodePositionOfWord(
+ const int wordId = dictStructurePolicy->getWordId(
codePointArrayView, false /* forceLowerCaseSearch */);
- if (wordPtNodePos != NOT_A_DICT_POS || !tryLowerCaseSearch) {
- // Return the position when when the word was found or doesn't try lower case
- // search.
- return wordPtNodePos;
+ if (wordId != NOT_A_WORD_ID || !tryLowerCaseSearch) {
+ // Return the id when when the word was found or doesn't try lower case search.
+ return wordId;
}
// Check bigrams for lower-cased previous word if original was not found. Useful for
// auto-capitalized words like "The [current_word]".
- return dictStructurePolicy->getTerminalPtNodePositionOfWord(
- codePointArrayView, true /* forceLowerCaseSearch */);
+ return dictStructurePolicy->getWordId(codePointArrayView, true /* forceLowerCaseSearch */);
}
void clear() {
diff --git a/native/jni/src/suggest/core/suggest.cpp b/native/jni/src/suggest/core/suggest.cpp
index 0cd305f5a..66c87f04c 100644
--- a/native/jni/src/suggest/core/suggest.cpp
+++ b/native/jni/src/suggest/core/suggest.cpp
@@ -92,7 +92,7 @@ void Suggest::initializeSearch(DicTraverseSession *traverseSession) const {
// Create a new dic node here
DicNode rootNode;
DicNodeUtils::initAsRoot(traverseSession->getDictionaryStructurePolicy(),
- traverseSession->getPrevWordsPtNodePos(), &rootNode);
+ traverseSession->getPrevWordIds(), &rootNode);
traverseSession->getDicTraverseCache()->copyPushActive(&rootNode);
}
}
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
index 9f6ae114d..929dc3dc1 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
@@ -91,9 +91,10 @@ void Ver4PatriciaTriePolicy::createAndGetAllChildDicNodes(const DicNode *const d
}
int Ver4PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
- const int ptNodePos, const int maxCodePointCount, int *const outCodePoints,
+ const int wordId, const int maxCodePointCount, int *const outCodePoints,
int *const outUnigramProbability) const {
DynamicPtReadingHelper readingHelper(&mNodeReader, &mPtNodeArrayReader);
+ const int ptNodePos = getTerminalPtNodePosFromWordId(wordId);
readingHelper.initWithPtNodePos(ptNodePos);
const int codePointCount = readingHelper.getCodePointsAndProbabilityAndReturnCodePointCount(
maxCodePointCount, outCodePoints, outUnigramProbability);
@@ -104,7 +105,7 @@ int Ver4PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
return codePointCount;
}
-int Ver4PatriciaTriePolicy::getTerminalPtNodePositionOfWord(const CodePointArrayView wordCodePoints,
+int Ver4PatriciaTriePolicy::getWordId(const CodePointArrayView wordCodePoints,
const bool forceLowerCaseSearch) const {
DynamicPtReadingHelper readingHelper(&mNodeReader, &mPtNodeArrayReader);
readingHelper.initWithPtNodeArrayPos(getRootPosition());
@@ -112,9 +113,9 @@ int Ver4PatriciaTriePolicy::getTerminalPtNodePositionOfWord(const CodePointArray
wordCodePoints.size(), forceLowerCaseSearch);
if (readingHelper.isError()) {
mIsCorrupted = true;
- AKLOGE("Dictionary reading error in createAndGetAllChildDicNodes().");
+ AKLOGE("Dictionary reading error in getWordId().");
}
- return ptNodePos;
+ return getWordIdFromTerminalPtNodePos(ptNodePos);
}
int Ver4PatriciaTriePolicy::getProbability(const int unigramProbability,
@@ -133,17 +134,19 @@ int Ver4PatriciaTriePolicy::getProbability(const int unigramProbability,
}
}
-int Ver4PatriciaTriePolicy::getProbabilityOfPtNode(const int *const prevWordsPtNodePos,
- const int ptNodePos) const {
- if (ptNodePos == NOT_A_DICT_POS) {
+int Ver4PatriciaTriePolicy::getProbabilityOfWord(const int *const prevWordIds,
+ const int wordId) const {
+ if (wordId == NOT_A_WORD_ID) {
return NOT_A_PROBABILITY;
}
+ const int ptNodePos = getTerminalPtNodePosFromWordId(wordId);
const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) {
return NOT_A_PROBABILITY;
}
- if (prevWordsPtNodePos) {
- const int bigramsPosition = getBigramsPositionOfPtNode(prevWordsPtNodePos[0]);
+ if (prevWordIds) {
+ const int bigramsPosition = getBigramsPositionOfPtNode(
+ getTerminalPtNodePosFromWordId(prevWordIds[0]));
BinaryDictionaryBigramsIterator bigramsIt(&mBigramPolicy, bigramsPosition);
while (bigramsIt.hasNext()) {
bigramsIt.next();
@@ -157,19 +160,27 @@ int Ver4PatriciaTriePolicy::getProbabilityOfPtNode(const int *const prevWordsPtN
return getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY);
}
-void Ver4PatriciaTriePolicy::iterateNgramEntries(const int *const prevWordsPtNodePos,
+void Ver4PatriciaTriePolicy::iterateNgramEntries(const int *const prevWordIds,
NgramListener *const listener) const {
- if (!prevWordsPtNodePos) {
+ if (!prevWordIds) {
return;
}
- const int bigramsPosition = getBigramsPositionOfPtNode(prevWordsPtNodePos[0]);
+ const int bigramsPosition = getBigramsPositionOfPtNode(
+ getTerminalPtNodePosFromWordId(prevWordIds[0]));
BinaryDictionaryBigramsIterator bigramsIt(&mBigramPolicy, bigramsPosition);
while (bigramsIt.hasNext()) {
bigramsIt.next();
- listener->onVisitEntry(bigramsIt.getProbability(), bigramsIt.getBigramPos());
+ listener->onVisitEntry(bigramsIt.getProbability(),
+ getWordIdFromTerminalPtNodePos(bigramsIt.getBigramPos()));
}
}
+BinaryDictionaryShortcutIterator Ver4PatriciaTriePolicy::getShortcutIterator(
+ const int wordId) const {
+ const int shortcutPos = getShortcutPositionOfPtNode(getTerminalPtNodePosFromWordId(wordId));
+ return BinaryDictionaryShortcutIterator(&mShortcutPolicy, shortcutPos);
+}
+
int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) const {
if (ptNodePos == NOT_A_DICT_POS) {
return NOT_A_DICT_POS;
@@ -238,8 +249,8 @@ bool Ver4PatriciaTriePolicy::addUnigramEntry(const CodePointArrayView wordCodePo
}
if (unigramProperty->getShortcuts().size() > 0) {
// Add shortcut target.
- const int wordPos = getTerminalPtNodePositionOfWord(codePointArrayView,
- false /* forceLowerCaseSearch */);
+ const int wordPos = getTerminalPtNodePosFromWordId(
+ getWordId(codePointArrayView, false /* forceLowerCaseSearch */));
if (wordPos == NOT_A_DICT_POS) {
AKLOGE("Cannot find terminal PtNode position to add shortcut target.");
return false;
@@ -266,8 +277,8 @@ bool Ver4PatriciaTriePolicy::removeUnigramEntry(const CodePointArrayView wordCod
AKLOGI("Warning: removeUnigramEntry() is called for non-updatable dictionary.");
return false;
}
- const int ptNodePos = getTerminalPtNodePositionOfWord(wordCodePoints,
- false /* forceLowerCaseSearch */);
+ const int ptNodePos = getTerminalPtNodePosFromWordId(
+ getWordId(wordCodePoints, false /* forceLowerCaseSearch */));
if (ptNodePos == NOT_A_DICT_POS) {
return false;
}
@@ -295,11 +306,9 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
"length: %zd", bigramProperty->getTargetCodePoints()->size());
return false;
}
- int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- prevWordsInfo->getPrevWordsTerminalPtNodePos(this, prevWordsPtNodePos,
- false /* tryLowerCaseSearch */);
- // TODO: Support N-gram.
- if (prevWordsPtNodePos[0] == NOT_A_DICT_POS) {
+ int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ prevWordsInfo->getPrevWordIds(this, prevWordIds, false /* tryLowerCaseSearch */);
+ if (prevWordIds[0] == NOT_A_WORD_ID) {
if (prevWordsInfo->isNthPrevWordBeginningOfSentence(1 /* n */)) {
const std::vector<UnigramProperty::ShortcutProperty> shortcuts;
const UnigramProperty beginningOfSentenceUnigramProperty(
@@ -311,22 +320,22 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
AKLOGE("Cannot add unigram entry for the beginning-of-sentence.");
return false;
}
- // Refresh Terminal PtNode positions.
- prevWordsInfo->getPrevWordsTerminalPtNodePos(this, prevWordsPtNodePos,
- false /* tryLowerCaseSearch */);
+ // Refresh word ids.
+ prevWordsInfo->getPrevWordIds(this, prevWordIds, false /* tryLowerCaseSearch */);
} else {
return false;
}
}
- const int word1Pos = getTerminalPtNodePositionOfWord(
+ const int wordPos = getTerminalPtNodePosFromWordId(getWordId(
CodePointArrayView(*bigramProperty->getTargetCodePoints()),
- false /* forceLowerCaseSearch */);
- if (word1Pos == NOT_A_DICT_POS) {
+ false /* forceLowerCaseSearch */));
+ if (wordPos == NOT_A_DICT_POS) {
return false;
}
bool addedNewBigram = false;
- if (mUpdatingHelper.addNgramEntry(PtNodePosArrayView::fromObject(prevWordsPtNodePos),
- word1Pos, bigramProperty, &addedNewBigram)) {
+ const int prevWordPtNodePos = getTerminalPtNodePosFromWordId(prevWordIds[0]);
+ if (mUpdatingHelper.addNgramEntry(PtNodePosArrayView::fromObject(&prevWordPtNodePos),
+ wordPos, bigramProperty, &addedNewBigram)) {
if (addedNewBigram) {
mBigramCount++;
}
@@ -355,20 +364,19 @@ bool Ver4PatriciaTriePolicy::removeNgramEntry(const PrevWordsInfo *const prevWor
AKLOGE("word is too long to remove n-gram entry form the dictionary. length: %zd",
wordCodePoints.size());
}
- int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- prevWordsInfo->getPrevWordsTerminalPtNodePos(this, prevWordsPtNodePos,
- false /* tryLowerCaseSerch */);
- // TODO: Support N-gram.
- if (prevWordsPtNodePos[0] == NOT_A_DICT_POS) {
+ int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ prevWordsInfo->getPrevWordIds(this, prevWordIds, false /* tryLowerCaseSerch */);
+ if (prevWordIds[0] == NOT_A_WORD_ID) {
return false;
}
- const int wordPos = getTerminalPtNodePositionOfWord(wordCodePoints,
- false /* forceLowerCaseSearch */);
+ const int wordPos = getTerminalPtNodePosFromWordId(getWordId(wordCodePoints,
+ false /* forceLowerCaseSearch */));
if (wordPos == NOT_A_DICT_POS) {
return false;
}
+ const int prevWordPtNodePos = getTerminalPtNodePosFromWordId(prevWordIds[0]);
if (mUpdatingHelper.removeNgramEntry(
- PtNodePosArrayView::fromObject(prevWordsPtNodePos), wordPos)) {
+ PtNodePosArrayView::fromObject(&prevWordPtNodePos), wordPos)) {
mBigramCount--;
return true;
} else {
@@ -449,8 +457,8 @@ void Ver4PatriciaTriePolicy::getProperty(const char *const query, const int quer
const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
const CodePointArrayView wordCodePoints) const {
- const int ptNodePos = getTerminalPtNodePositionOfWord(wordCodePoints,
- false /* forceLowerCaseSearch */);
+ const int ptNodePos = getTerminalPtNodePosFromWordId(
+ getWordId(wordCodePoints, false /* forceLowerCaseSearch */));
if (ptNodePos == NOT_A_DICT_POS) {
AKLOGE("getWordProperty is called for invalid word.");
return WordProperty();
@@ -485,8 +493,8 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
// Word (unigram) probability
int word1Probability = NOT_A_PROBABILITY;
const int codePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
- word1TerminalPtNodePos, MAX_WORD_LENGTH, bigramWord1CodePoints,
- &word1Probability);
+ getWordIdFromTerminalPtNodePos(word1TerminalPtNodePos), MAX_WORD_LENGTH,
+ bigramWord1CodePoints, &word1Probability);
const std::vector<int> word1(bigramWord1CodePoints,
bigramWord1CodePoints + codePointCount);
const HistoricalInfo *const historicalInfo = bigramEntry.getHistoricalInfo();
@@ -543,7 +551,8 @@ int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const
const int terminalPtNodePos = mTerminalPtNodePositionsForIteratingWords[token];
int unigramProbability = NOT_A_PROBABILITY;
*outCodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
- terminalPtNodePos, MAX_WORD_LENGTH, outCodePoints, &unigramProbability);
+ getWordIdFromTerminalPtNodePos(terminalPtNodePos), MAX_WORD_LENGTH, outCodePoints,
+ &unigramProbability);
const int nextToken = token + 1;
if (nextToken >= terminalPtNodePositionsVectorSize) {
// All words have been iterated.
@@ -553,6 +562,14 @@ int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const
return nextToken;
}
+int Ver4PatriciaTriePolicy::getWordIdFromTerminalPtNodePos(const int ptNodePos) const {
+ return ptNodePos == NOT_A_DICT_POS ? NOT_A_WORD_ID : ptNodePos;
+}
+
+int Ver4PatriciaTriePolicy::getTerminalPtNodePosFromWordId(const int wordId) const {
+ return wordId == NOT_A_WORD_ID ? NOT_A_DICT_POS : wordId;
+}
+
} // namespace v402
} // namespace backward
} // namespace latinime
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
index df119e3a1..562c219f4 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
@@ -28,6 +28,8 @@
#include <vector>
#include "defines.h"
+#include "suggest/core/dictionary/binary_dictionary_bigrams_iterator.h"
+#include "suggest/core/dictionary/binary_dictionary_shortcut_iterator.h"
#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
#include "suggest/policyimpl/dictionary/header/header_policy.h"
#include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.h"
@@ -84,29 +86,23 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
DicNodeVector *const childDicNodes) const;
int getCodePointsAndProbabilityAndReturnCodePointCount(
- const int terminalPtNodePos, const int maxCodePointCount, int *const outCodePoints,
+ const int wordId, const int maxCodePointCount, int *const outCodePoints,
int *const outUnigramProbability) const;
- int getTerminalPtNodePositionOfWord(const CodePointArrayView wordCodePoints,
- const bool forceLowerCaseSearch) const;
+ int getWordId(const CodePointArrayView wordCodePoints, const bool forceLowerCaseSearch) const;
int getProbability(const int unigramProbability, const int bigramProbability) const;
- int getProbabilityOfPtNode(const int *const prevWordsPtNodePos, const int ptNodePos) const;
+ int getProbabilityOfWord(const int *const prevWordIds, const int wordId) const;
- void iterateNgramEntries(const int *const prevWordsPtNodePos,
- NgramListener *const listener) const;
+ void iterateNgramEntries(const int *const prevWordIds, NgramListener *const listener) const;
- int getShortcutPositionOfPtNode(const int ptNodePos) const;
+ BinaryDictionaryShortcutIterator getShortcutIterator(const int wordId) const;
const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
return mHeaderPolicy;
}
- const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
- return &mShortcutPolicy;
- }
-
bool addUnigramEntry(const CodePointArrayView wordCodePoints,
const UnigramProperty *const unigramProperty);
@@ -164,6 +160,9 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
mutable bool mIsCorrupted;
int getBigramsPositionOfPtNode(const int ptNodePos) const;
+ int getShortcutPositionOfPtNode(const int ptNodePos) const;
+ int getWordIdFromTerminalPtNodePos(const int ptNodePos) const;
+ int getTerminalPtNodePosFromWordId(const int wordId) const;
};
} // namespace v402
} // namespace backward
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
index 4ac366e07..8aa7234c0 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
@@ -57,7 +57,7 @@ void PatriciaTriePolicy::createAndGetAllChildDicNodes(const DicNode *const dicNo
}
}
-// This retrieves code points and the probability of the word by its terminal position.
+// This retrieves code points and the probability of the word by its id.
// Due to the fact that words are ordered in the dictionary in a strict breadth-first order,
// it is possible to check for this with advantageous complexity. For each PtNode array, we search
// for PtNodes with children and compare the children position with the position we look for.
@@ -68,16 +68,16 @@ void PatriciaTriePolicy::createAndGetAllChildDicNodes(const DicNode *const dicNo
// with a z, it's the last PtNode of the root array, so all children addresses will be smaller
// than the position we look for, and we have to descend the z PtNode).
/* Parameters :
- * ptNodePos: the byte position of the terminal PtNode of the word we are searching for (this is
- * what is stored as the "bigram position" in each bigram)
+ * wordId: Id of the word we are searching for.
* outCodePoints: an array to write the found word, with MAX_WORD_LENGTH size.
* outUnigramProbability: a pointer to an int to write the probability into.
* Return value : the code point count, of 0 if the word was not found.
*/
// TODO: Split this function to be more readable
int PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
- const int ptNodePos, const int maxCodePointCount, int *const outCodePoints,
+ const int wordId, const int maxCodePointCount, int *const outCodePoints,
int *const outUnigramProbability) const {
+ const int ptNodePos = getTerminalPtNodePosFromWordId(wordId);
int pos = getRootPosition();
int wordPos = 0;
// One iteration of the outer loop iterates through PtNode arrays. As stated above, we will
@@ -267,8 +267,8 @@ int PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
}
// This function gets the position of the terminal PtNode of the exact matching word in the
-// dictionary. If no match is found, it returns NOT_A_DICT_POS.
-int PatriciaTriePolicy::getTerminalPtNodePositionOfWord(const CodePointArrayView wordCodePoints,
+// dictionary. If no match is found, it returns NOT_A_WORD_ID.
+int PatriciaTriePolicy::getWordId(const CodePointArrayView wordCodePoints,
const bool forceLowerCaseSearch) const {
DynamicPtReadingHelper readingHelper(&mPtNodeReader, &mPtNodeArrayReader);
readingHelper.initWithPtNodeArrayPos(getRootPosition());
@@ -276,9 +276,9 @@ int PatriciaTriePolicy::getTerminalPtNodePositionOfWord(const CodePointArrayView
wordCodePoints.size(), forceLowerCaseSearch);
if (readingHelper.isError()) {
mIsCorrupted = true;
- AKLOGE("Dictionary reading error in createAndGetAllChildDicNodes().");
+ AKLOGE("Dictionary reading error in getWordId().");
}
- return ptNodePos;
+ return getWordIdFromTerminalPtNodePos(ptNodePos);
}
int PatriciaTriePolicy::getProbability(const int unigramProbability,
@@ -297,11 +297,11 @@ int PatriciaTriePolicy::getProbability(const int unigramProbability,
}
}
-int PatriciaTriePolicy::getProbabilityOfPtNode(const int *const prevWordsPtNodePos,
- const int ptNodePos) const {
- if (ptNodePos == NOT_A_DICT_POS) {
+int PatriciaTriePolicy::getProbabilityOfWord(const int *const prevWordIds, const int wordId) const {
+ if (wordId == NOT_A_WORD_ID) {
return NOT_A_PROBABILITY;
}
+ const int ptNodePos = getTerminalPtNodePosFromWordId(wordId);
const PtNodeParams ptNodeParams =
mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
if (ptNodeParams.isNotAWord() || ptNodeParams.isBlacklisted()) {
@@ -310,8 +310,9 @@ int PatriciaTriePolicy::getProbabilityOfPtNode(const int *const prevWordsPtNodeP
// for shortcuts).
return NOT_A_PROBABILITY;
}
- if (prevWordsPtNodePos) {
- const int bigramsPosition = getBigramsPositionOfPtNode(prevWordsPtNodePos[0]);
+ if (prevWordIds) {
+ const int bigramsPosition = getBigramsPositionOfPtNode(
+ getTerminalPtNodePosFromWordId(prevWordIds[0]));
BinaryDictionaryBigramsIterator bigramsIt(&mBigramListPolicy, bigramsPosition);
while (bigramsIt.hasNext()) {
bigramsIt.next();
@@ -325,19 +326,27 @@ int PatriciaTriePolicy::getProbabilityOfPtNode(const int *const prevWordsPtNodeP
return getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY);
}
-void PatriciaTriePolicy::iterateNgramEntries(const int *const prevWordsPtNodePos,
+void PatriciaTriePolicy::iterateNgramEntries(const int *const prevWordIds,
NgramListener *const listener) const {
- if (!prevWordsPtNodePos) {
+ if (!prevWordIds) {
return;
}
- const int bigramsPosition = getBigramsPositionOfPtNode(prevWordsPtNodePos[0]);
+ const int bigramsPosition = getBigramsPositionOfPtNode(
+ getTerminalPtNodePosFromWordId(prevWordIds[0]));
BinaryDictionaryBigramsIterator bigramsIt(&mBigramListPolicy, bigramsPosition);
while (bigramsIt.hasNext()) {
bigramsIt.next();
- listener->onVisitEntry(bigramsIt.getProbability(), bigramsIt.getBigramPos());
+ listener->onVisitEntry(bigramsIt.getProbability(),
+ getWordIdFromTerminalPtNodePos(bigramsIt.getBigramPos()));
}
}
+BinaryDictionaryShortcutIterator PatriciaTriePolicy::getShortcutIterator(
+ const int wordId) const {
+ const int shortcutPos = getShortcutPositionOfPtNode(getTerminalPtNodePosFromWordId(wordId));
+ return BinaryDictionaryShortcutIterator(&mShortcutListPolicy, shortcutPos);
+}
+
int PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) const {
if (ptNodePos == NOT_A_DICT_POS) {
return NOT_A_DICT_POS;
@@ -362,7 +371,7 @@ int PatriciaTriePolicy::createAndGetLeavingChildNode(const DicNode *const dicNod
int shortcutPos = NOT_A_DICT_POS;
int bigramPos = NOT_A_DICT_POS;
int siblingPos = NOT_A_DICT_POS;
- PatriciaTrieReadingUtils::readPtNodeInfo(mDictRoot, ptNodePos, getShortcutsStructurePolicy(),
+ PatriciaTrieReadingUtils::readPtNodeInfo(mDictRoot, ptNodePos, &mShortcutListPolicy,
&mBigramListPolicy, &flags, &mergedNodeCodePointCount, mergedNodeCodePoints,
&probability, &childrenPos, &shortcutPos, &bigramPos, &siblingPos);
// Skip PtNodes don't start with Unicode code point because they represent non-word information.
@@ -379,12 +388,12 @@ int PatriciaTriePolicy::createAndGetLeavingChildNode(const DicNode *const dicNod
const WordProperty PatriciaTriePolicy::getWordProperty(
const CodePointArrayView wordCodePoints) const {
- const int ptNodePos = getTerminalPtNodePositionOfWord(wordCodePoints,
- false /* forceLowerCaseSearch */);
- if (ptNodePos == NOT_A_DICT_POS) {
+ const int wordId = getWordId(wordCodePoints, false /* forceLowerCaseSearch */);
+ if (wordId == NOT_A_WORD_ID) {
AKLOGE("getWordProperty was called for invalid word.");
return WordProperty();
}
+ const int ptNodePos = getTerminalPtNodePosFromWordId(wordId);
const PtNodeParams ptNodeParams =
mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
std::vector<int> codePointVector(ptNodeParams.getCodePoints(),
@@ -401,8 +410,8 @@ const WordProperty PatriciaTriePolicy::getWordProperty(
if (bigramsIt.getBigramPos() != NOT_A_DICT_POS) {
int word1Probability = NOT_A_PROBABILITY;
const int word1CodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
- bigramsIt.getBigramPos(), MAX_WORD_LENGTH, bigramWord1CodePoints,
- &word1Probability);
+ getWordIdFromTerminalPtNodePos(bigramsIt.getBigramPos()), MAX_WORD_LENGTH,
+ bigramWord1CodePoints, &word1Probability);
const std::vector<int> word1(bigramWord1CodePoints,
bigramWord1CodePoints + word1CodePointCount);
const int probability = getProbability(word1Probability, bigramsIt.getProbability());
@@ -456,8 +465,9 @@ int PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outC
}
const int terminalPtNodePos = mTerminalPtNodePositionsForIteratingWords[token];
int unigramProbability = NOT_A_PROBABILITY;
- *outCodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(terminalPtNodePos,
- MAX_WORD_LENGTH, outCodePoints, &unigramProbability);
+ *outCodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
+ getWordIdFromTerminalPtNodePos(terminalPtNodePos), MAX_WORD_LENGTH, outCodePoints,
+ &unigramProbability);
const int nextToken = token + 1;
if (nextToken >= terminalPtNodePositionsVectorSize) {
// All words have been iterated.
@@ -467,4 +477,11 @@ int PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outC
return nextToken;
}
+int PatriciaTriePolicy::getWordIdFromTerminalPtNodePos(const int ptNodePos) const {
+ return ptNodePos == NOT_A_DICT_POS ? NOT_A_WORD_ID : ptNodePos;
+}
+
+int PatriciaTriePolicy::getTerminalPtNodePosFromWordId(const int wordId) const {
+ return wordId == NOT_A_WORD_ID ? NOT_A_DICT_POS : wordId;
+}
} // namespace latinime
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
index 4d9af2877..66df52779 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
@@ -61,29 +61,23 @@ class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
DicNodeVector *const childDicNodes) const;
int getCodePointsAndProbabilityAndReturnCodePointCount(
- const int terminalNodePos, const int maxCodePointCount, int *const outCodePoints,
+ const int wordId, const int maxCodePointCount, int *const outCodePoints,
int *const outUnigramProbability) const;
- int getTerminalPtNodePositionOfWord(const CodePointArrayView wordCodePoints,
- const bool forceLowerCaseSearch) const;
+ int getWordId(const CodePointArrayView wordCodePoints, const bool forceLowerCaseSearch) const;
int getProbability(const int unigramProbability, const int bigramProbability) const;
- int getProbabilityOfPtNode(const int *const prevWordsPtNodePos, const int ptNodePos) const;
+ int getProbabilityOfWord(const int *const prevWordIds, const int wordId) const;
- void iterateNgramEntries(const int *const prevWordsPtNodePos,
- NgramListener *const listener) const;
+ void iterateNgramEntries(const int *const prevWordIds, NgramListener *const listener) const;
- int getShortcutPositionOfPtNode(const int ptNodePos) const;
+ BinaryDictionaryShortcutIterator getShortcutIterator(const int wordId) const;
const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
return &mHeaderPolicy;
}
- const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
- return &mShortcutListPolicy;
- }
-
bool addUnigramEntry(const CodePointArrayView wordCodePoints,
const UnigramProperty *const unigramProperty) {
// This method should not be called for non-updatable dictionary.
@@ -160,9 +154,12 @@ class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
std::vector<int> mTerminalPtNodePositionsForIteratingWords;
mutable bool mIsCorrupted;
+ int getShortcutPositionOfPtNode(const int ptNodePos) const;
int getBigramsPositionOfPtNode(const int ptNodePos) const;
int createAndGetLeavingChildNode(const DicNode *const dicNode, const int ptNodePos,
DicNodeVector *const childDicNodes) const;
+ int getWordIdFromTerminalPtNodePos(const int ptNodePos) const;
+ int getTerminalPtNodePosFromWordId(const int wordId) const;
};
} // namespace latinime
#endif // LATINIME_PATRICIA_TRIE_POLICY_H
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
index 619cdb59b..094ce4292 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
@@ -81,9 +81,11 @@ void Ver4PatriciaTriePolicy::createAndGetAllChildDicNodes(const DicNode *const d
}
int Ver4PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
- const int ptNodePos, const int maxCodePointCount, int *const outCodePoints,
+ const int wordId, const int maxCodePointCount, int *const outCodePoints,
int *const outUnigramProbability) const {
DynamicPtReadingHelper readingHelper(&mNodeReader, &mPtNodeArrayReader);
+ const int ptNodePos =
+ mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(wordId);
readingHelper.initWithPtNodePos(ptNodePos);
const int codePointCount = readingHelper.getCodePointsAndProbabilityAndReturnCodePointCount(
maxCodePointCount, outCodePoints, outUnigramProbability);
@@ -94,7 +96,7 @@ int Ver4PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
return codePointCount;
}
-int Ver4PatriciaTriePolicy::getTerminalPtNodePositionOfWord(const CodePointArrayView wordCodePoints,
+int Ver4PatriciaTriePolicy::getWordId(const CodePointArrayView wordCodePoints,
const bool forceLowerCaseSearch) const {
DynamicPtReadingHelper readingHelper(&mNodeReader, &mPtNodeArrayReader);
readingHelper.initWithPtNodeArrayPos(getRootPosition());
@@ -104,7 +106,11 @@ int Ver4PatriciaTriePolicy::getTerminalPtNodePositionOfWord(const CodePointArray
mIsCorrupted = true;
AKLOGE("Dictionary reading error in createAndGetAllChildDicNodes().");
}
- return ptNodePos;
+ if (ptNodePos == NOT_A_DICT_POS) {
+ return NOT_A_WORD_ID;
+ }
+ const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
+ return ptNodeParams.getTerminalId();
}
int Ver4PatriciaTriePolicy::getProbability(const int unigramProbability,
@@ -123,24 +129,22 @@ int Ver4PatriciaTriePolicy::getProbability(const int unigramProbability,
}
}
-int Ver4PatriciaTriePolicy::getProbabilityOfPtNode(const int *const prevWordsPtNodePos,
- const int ptNodePos) const {
- if (ptNodePos == NOT_A_DICT_POS) {
+int Ver4PatriciaTriePolicy::getProbabilityOfWord(const int *const prevWordIds,
+ const int wordId) const {
+ if (wordId == NOT_A_WORD_ID) {
return NOT_A_PROBABILITY;
}
+ const int ptNodePos =
+ mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(wordId);
const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) {
return NOT_A_PROBABILITY;
}
- if (prevWordsPtNodePos) {
+ if (prevWordIds) {
// TODO: Support n-gram.
- const PtNodeParams prevWordPtNodeParams =
- mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(prevWordsPtNodePos[0]);
- const int prevWordTerminalId = prevWordPtNodeParams.getTerminalId();
const ProbabilityEntry probabilityEntry =
mBuffers->getLanguageModelDictContent()->getNgramProbabilityEntry(
- IntArrayView::fromObject(&prevWordTerminalId),
- ptNodeParams.getTerminalId());
+ IntArrayView::fromObject(prevWordIds), wordId);
if (!probabilityEntry.isValid()) {
return NOT_A_PROBABILITY;
}
@@ -154,33 +158,36 @@ int Ver4PatriciaTriePolicy::getProbabilityOfPtNode(const int *const prevWordsPtN
return getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY);
}
-void Ver4PatriciaTriePolicy::iterateNgramEntries(const int *const prevWordsPtNodePos,
+BinaryDictionaryShortcutIterator Ver4PatriciaTriePolicy::getShortcutIterator(
+ const int wordId) const {
+ const int shortcutPos = getShortcutPositionOfWord(wordId);
+ return BinaryDictionaryShortcutIterator(&mShortcutPolicy, shortcutPos);
+}
+
+void Ver4PatriciaTriePolicy::iterateNgramEntries(const int *const prevWordIds,
NgramListener *const listener) const {
- if (!prevWordsPtNodePos) {
+ if (!prevWordIds) {
return;
}
// TODO: Support n-gram.
- const PtNodeParams ptNodeParams =
- mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(prevWordsPtNodePos[0]);
- const int prevWordId = ptNodeParams.getTerminalId();
- const WordIdArrayView prevWordIds = WordIdArrayView::fromObject(&prevWordId);
const auto languageModelDictContent = mBuffers->getLanguageModelDictContent();
- for (const auto entry : languageModelDictContent->getProbabilityEntries(prevWordIds)) {
+ for (const auto entry : languageModelDictContent->getProbabilityEntries(
+ WordIdArrayView::fromObject(prevWordIds))) {
const ProbabilityEntry &probabilityEntry = entry.getProbabilityEntry();
const int probability = probabilityEntry.hasHistoricalInfo() ?
ForgettingCurveUtils::decodeProbability(
probabilityEntry.getHistoricalInfo(), mHeaderPolicy) :
probabilityEntry.getProbability();
- const int ptNodePos = mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(
- entry.getWordId());
- listener->onVisitEntry(probability, ptNodePos);
+ listener->onVisitEntry(probability, entry.getWordId());
}
}
-int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) const {
- if (ptNodePos == NOT_A_DICT_POS) {
+int Ver4PatriciaTriePolicy::getShortcutPositionOfWord(const int wordId) const {
+ if (wordId == NOT_A_WORD_ID) {
return NOT_A_DICT_POS;
}
+ const int ptNodePos =
+ mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(wordId);
const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
if (ptNodeParams.isDeleted()) {
return NOT_A_DICT_POS;
@@ -233,12 +240,13 @@ bool Ver4PatriciaTriePolicy::addUnigramEntry(const CodePointArrayView wordCodePo
}
if (unigramProperty->getShortcuts().size() > 0) {
// Add shortcut target.
- const int wordPos = getTerminalPtNodePositionOfWord(codePointArrayView,
- false /* forceLowerCaseSearch */);
- if (wordPos == NOT_A_DICT_POS) {
- AKLOGE("Cannot find terminal PtNode position to add shortcut target.");
+ const int wordId = getWordId(codePointArrayView, false /* forceLowerCaseSearch */);
+ if (wordId == NOT_A_WORD_ID) {
+ AKLOGE("Cannot find word id to add shortcut target.");
return false;
}
+ const int wordPos =
+ mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(wordId);
for (const auto &shortcut : unigramProperty->getShortcuts()) {
if (!mUpdatingHelper.addShortcutTarget(wordPos,
shortcut.getTargetCodePoints()->data(),
@@ -261,20 +269,19 @@ bool Ver4PatriciaTriePolicy::removeUnigramEntry(const CodePointArrayView wordCod
AKLOGI("Warning: removeUnigramEntry() is called for non-updatable dictionary.");
return false;
}
- const int ptNodePos = getTerminalPtNodePositionOfWord(wordCodePoints,
- false /* forceLowerCaseSearch */);
- if (ptNodePos == NOT_A_DICT_POS) {
+ const int wordId = getWordId(wordCodePoints, false /* forceLowerCaseSearch */);
+ if (wordId == NOT_A_WORD_ID) {
return false;
}
+ const int ptNodePos =
+ mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(wordId);
const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
if (!mNodeWriter.markPtNodeAsDeleted(&ptNodeParams)) {
AKLOGE("Cannot remove unigram. ptNodePos: %d", ptNodePos);
return false;
}
- if (!mBuffers->getMutableLanguageModelDictContent()->removeProbabilityEntry(
- ptNodeParams.getTerminalId())) {
- // TODO: Uncomment.
- // return false;
+ if (!mBuffers->getMutableLanguageModelDictContent()->removeProbabilityEntry(wordId)) {
+ return false;
}
if (!ptNodeParams.representsNonWordInfo()) {
mUnigramCount--;
@@ -302,12 +309,10 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
"length: %zd", bigramProperty->getTargetCodePoints()->size());
return false;
}
- int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- prevWordsInfo->getPrevWordsTerminalPtNodePos(this, prevWordsPtNodePos,
- false /* tryLowerCaseSearch */);
- const auto prevWordsPtNodePosView = PtNodePosArrayView::fromFixedSizeArray(prevWordsPtNodePos);
+ int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ prevWordsInfo->getPrevWordIds(this, prevWordIds, false /* tryLowerCaseSearch */);
// TODO: Support N-gram.
- if (prevWordsPtNodePos[0] == NOT_A_DICT_POS) {
+ if (prevWordIds[0] == NOT_A_WORD_ID) {
if (prevWordsInfo->isNthPrevWordBeginningOfSentence(1 /* n */)) {
const std::vector<UnigramProperty::ShortcutProperty> shortcuts;
const UnigramProperty beginningOfSentenceUnigramProperty(
@@ -319,22 +324,27 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
AKLOGE("Cannot add unigram entry for the beginning-of-sentence.");
return false;
}
- // Refresh Terminal PtNode positions.
- prevWordsInfo->getPrevWordsTerminalPtNodePos(this, prevWordsPtNodePos,
- false /* tryLowerCaseSearch */);
+ // Refresh word ids.
+ prevWordsInfo->getPrevWordIds(this, prevWordIds, false /* tryLowerCaseSearch */);
} else {
return false;
}
}
- const int word1Pos = getTerminalPtNodePositionOfWord(
- CodePointArrayView(*bigramProperty->getTargetCodePoints()),
+ const int wordId = getWordId(CodePointArrayView(*bigramProperty->getTargetCodePoints()),
false /* forceLowerCaseSearch */);
- if (word1Pos == NOT_A_DICT_POS) {
+ if (wordId == NOT_A_WORD_ID) {
return false;
}
bool addedNewEntry = false;
- if (mUpdatingHelper.addNgramEntry(prevWordsPtNodePosView, word1Pos, bigramProperty,
- &addedNewEntry)) {
+ int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ for (size_t i = 0; i < NELEMS(prevWordIds); ++i) {
+ prevWordsPtNodePos[i] = mBuffers->getTerminalPositionLookupTable()
+ ->getTerminalPtNodePosition(prevWordIds[i]);
+ }
+ const int wordPtNodePos = mBuffers->getTerminalPositionLookupTable()
+ ->getTerminalPtNodePosition(wordId);
+ if (mUpdatingHelper.addNgramEntry(WordIdArrayView::fromFixedSizeArray(prevWordsPtNodePos),
+ wordPtNodePos, bigramProperty, &addedNewEntry)) {
if (addedNewEntry) {
mBigramCount++;
}
@@ -363,20 +373,25 @@ bool Ver4PatriciaTriePolicy::removeNgramEntry(const PrevWordsInfo *const prevWor
AKLOGE("word is too long to remove n-gram entry form the dictionary. length: %zd",
wordCodePoints.size());
}
- int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
- prevWordsInfo->getPrevWordsTerminalPtNodePos(this, prevWordsPtNodePos,
- false /* tryLowerCaseSerch */);
- const auto prevWordsPtNodePosView = PtNodePosArrayView::fromFixedSizeArray(prevWordsPtNodePos);
+ int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ prevWordsInfo->getPrevWordIds(this, prevWordIds, false /* tryLowerCaseSerch */);
// TODO: Support N-gram.
- if (prevWordsPtNodePos[0] == NOT_A_DICT_POS) {
+ if (prevWordIds[0] == NOT_A_WORD_ID) {
return false;
}
- const int wordPos = getTerminalPtNodePositionOfWord(wordCodePoints,
- false /* forceLowerCaseSearch */);
- if (wordPos == NOT_A_DICT_POS) {
+ const int wordId = getWordId(wordCodePoints, false /* forceLowerCaseSearch */);
+ if (wordId == NOT_A_WORD_ID) {
return false;
}
- if (mUpdatingHelper.removeNgramEntry(prevWordsPtNodePosView, wordPos)) {
+ int prevWordsPtNodePos[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+ for (size_t i = 0; i < NELEMS(prevWordIds); ++i) {
+ prevWordsPtNodePos[i] = mBuffers->getTerminalPositionLookupTable()
+ ->getTerminalPtNodePosition(prevWordIds[i]);
+ }
+ const int wordPtNodePos = mBuffers->getTerminalPositionLookupTable()
+ ->getTerminalPtNodePosition(wordId);
+ if (mUpdatingHelper.removeNgramEntry(WordIdArrayView::fromFixedSizeArray(prevWordsPtNodePos),
+ wordPtNodePos)) {
mBigramCount--;
return true;
} else {
@@ -457,12 +472,13 @@ void Ver4PatriciaTriePolicy::getProperty(const char *const query, const int quer
const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
const CodePointArrayView wordCodePoints) const {
- const int ptNodePos = getTerminalPtNodePositionOfWord(wordCodePoints,
- false /* forceLowerCaseSearch */);
- if (ptNodePos == NOT_A_DICT_POS) {
+ const int wordId = getWordId(wordCodePoints, false /* forceLowerCaseSearch */);
+ if (wordId == NOT_A_WORD_ID) {
AKLOGE("getWordProperty is called for invalid word.");
return WordProperty();
}
+ const int ptNodePos =
+ mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(wordId);
const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
std::vector<int> codePointVector(ptNodeParams.getCodePoints(),
ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount());
@@ -473,20 +489,14 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
// Fetch bigram information.
// TODO: Support n-gram.
std::vector<BigramProperty> bigrams;
- const int wordId = ptNodeParams.getTerminalId();
const WordIdArrayView prevWordIds = WordIdArrayView::fromObject(&wordId);
- const TerminalPositionLookupTable *const terminalPositionLookupTable =
- mBuffers->getTerminalPositionLookupTable();
int bigramWord1CodePoints[MAX_WORD_LENGTH];
for (const auto entry : mBuffers->getLanguageModelDictContent()->getProbabilityEntries(
prevWordIds)) {
- const int word1TerminalPtNodePos =
- terminalPositionLookupTable->getTerminalPtNodePosition(entry.getWordId());
// Word (unigram) probability
int word1Probability = NOT_A_PROBABILITY;
const int codePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
- word1TerminalPtNodePos, MAX_WORD_LENGTH, bigramWord1CodePoints,
- &word1Probability);
+ entry.getWordId(), MAX_WORD_LENGTH, bigramWord1CodePoints, &word1Probability);
const std::vector<int> word1(bigramWord1CodePoints,
bigramWord1CodePoints + codePointCount);
const ProbabilityEntry probabilityEntry = entry.getProbabilityEntry();
@@ -500,7 +510,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
}
// Fetch shortcut information.
std::vector<UnigramProperty::ShortcutProperty> shortcuts;
- int shortcutPos = getShortcutPositionOfPtNode(ptNodePos);
+ int shortcutPos = getShortcutPositionOfWord(wordId);
if (shortcutPos != NOT_A_DICT_POS) {
int shortcutTarget[MAX_WORD_LENGTH];
const ShortcutDictContent *const shortcutDictContent =
@@ -540,9 +550,11 @@ int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const
return 0;
}
const int terminalPtNodePos = mTerminalPtNodePositionsForIteratingWords[token];
+ const PtNodeParams ptNodeParams =
+ mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(terminalPtNodePos);
int unigramProbability = NOT_A_PROBABILITY;
*outCodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
- terminalPtNodePos, MAX_WORD_LENGTH, outCodePoints, &unigramProbability);
+ ptNodeParams.getTerminalId(), MAX_WORD_LENGTH, outCodePoints, &unigramProbability);
const int nextToken = token + 1;
if (nextToken >= terminalPtNodePositionsVectorSize) {
// All words have been iterated.
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
index 24f92a4aa..0b8eec40b 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
@@ -63,29 +63,23 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
DicNodeVector *const childDicNodes) const;
int getCodePointsAndProbabilityAndReturnCodePointCount(
- const int terminalPtNodePos, const int maxCodePointCount, int *const outCodePoints,
+ const int wordId, const int maxCodePointCount, int *const outCodePoints,
int *const outUnigramProbability) const;
- int getTerminalPtNodePositionOfWord(const CodePointArrayView wordCodePoints,
- const bool forceLowerCaseSearch) const;
+ int getWordId(const CodePointArrayView wordCodePoints, const bool forceLowerCaseSearch) const;
int getProbability(const int unigramProbability, const int bigramProbability) const;
- int getProbabilityOfPtNode(const int *const prevWordsPtNodePos, const int ptNodePos) const;
+ int getProbabilityOfWord(const int *const prevWordIds, const int wordId) const;
- void iterateNgramEntries(const int *const prevWordsPtNodePos,
- NgramListener *const listener) const;
+ void iterateNgramEntries(const int *const prevWordIds, NgramListener *const listener) const;
- int getShortcutPositionOfPtNode(const int ptNodePos) const;
+ BinaryDictionaryShortcutIterator getShortcutIterator(const int wordId) const;
const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
return mHeaderPolicy;
}
- const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
- return &mShortcutPolicy;
- }
-
bool addUnigramEntry(const CodePointArrayView wordCodePoints,
const UnigramProperty *const unigramProperty);
@@ -140,6 +134,8 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
int mBigramCount;
std::vector<int> mTerminalPtNodePositionsForIteratingWords;
mutable bool mIsCorrupted;
+
+ int getShortcutPositionOfWord(const int wordId) const;
};
} // namespace latinime
#endif // LATINIME_VER4_PATRICIA_TRIE_POLICY_H
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java
new file mode 100644
index 000000000..a25d6d6e7
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelBase.java
@@ -0,0 +1,156 @@
+/*
+ * 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.keyboard;
+
+import android.content.res.Resources;
+import android.text.InputType;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.latin.Constants;
+import com.android.inputmethod.latin.utils.RunInLocale;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
+
+import java.util.Locale;
+
+abstract class KeyboardLayoutSetActionLabelBase extends KeyboardLayoutSetTestsBase {
+ public void testActionUnspecified() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "unspecifiled "
+ + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_UNSPECIFIED,
+ KeyboardIconsSet.NAME_ENTER_KEY);
+ }
+ }
+
+ public void testActionNone() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "none " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_NONE,
+ KeyboardIconsSet.NAME_ENTER_KEY);
+ }
+ }
+
+ public void testActionSearch() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "search " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_SEARCH,
+ KeyboardIconsSet.NAME_SEARCH_KEY);
+ }
+ }
+
+ public abstract void testActionGo();
+ public abstract void testActionSend();
+ public abstract void testActionNext();
+ public abstract void testActionDone();
+ public abstract void testActionPrevious();
+
+ public void testActionCustom() {
+ for (final InputMethodSubtype subtype : getAllSubtypesList()) {
+ final String tag = "custom " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ final CharSequence customLabel = "customLabel";
+ final EditorInfo editorInfo = new EditorInfo();
+ editorInfo.imeOptions = EditorInfo.IME_ACTION_UNSPECIFIED;
+ editorInfo.actionLabel = customLabel;
+ doTestActionKeyLabel(tag, subtype, editorInfo, customLabel);
+ }
+ }
+
+ private static void doTestActionKey(final String tag, final KeyboardLayoutSet layoutSet,
+ final int elementId, final CharSequence label, final int iconId) {
+ final Keyboard keyboard = layoutSet.getKeyboard(elementId);
+ final Key enterKey = keyboard.getKey(Constants.CODE_ENTER);
+ assertNotNull(tag + " enter key on " + keyboard.mId, enterKey);
+ assertEquals(tag + " enter label " + enterKey, label, enterKey.getLabel());
+ assertEquals(tag + " enter icon " + enterKey, iconId, enterKey.getIconId());
+ }
+
+ protected void doTestActionKeyLabelResId(final String tag, final InputMethodSubtype subtype,
+ final int actionId, final int labelResId) {
+ final Locale labelLocale = subtype.getLocale().equals(SubtypeLocaleUtils.NO_LANGUAGE)
+ ? null : SubtypeLocaleUtils.getSubtypeLocale(subtype);
+ doTestActionKeyLabelResIdInLocale(tag, subtype, actionId, labelLocale, labelResId);
+ }
+
+ protected void doTestActionKeyLabelResIdInLocale(final String tag,
+ final InputMethodSubtype subtype, final int actionId, final Locale labelLocale,
+ final int labelResId) {
+ final EditorInfo editorInfo = new EditorInfo();
+ editorInfo.imeOptions = actionId;
+ final RunInLocale<String> job = new RunInLocale<String>() {
+ @Override
+ protected String job(final Resources res) {
+ return res.getString(labelResId);
+ }
+ };
+ final String label = job.runInLocale(getContext().getResources(), labelLocale);
+ doTestActionKeyLabel(tag, subtype, editorInfo, label);
+ }
+
+ protected void doTestActionKeyLabel(final String tag, final InputMethodSubtype subtype,
+ final EditorInfo editorInfo, final CharSequence label) {
+ // Test text layouts.
+ editorInfo.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
+ final KeyboardLayoutSet layoutSet = createKeyboardLayoutSet(subtype, editorInfo);
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_ALPHABET,
+ label, KeyboardIconsSet.ICON_UNDEFINED);
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS,
+ label, KeyboardIconsSet.ICON_UNDEFINED);
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS_SHIFTED,
+ label, KeyboardIconsSet.ICON_UNDEFINED);
+ // Test phone number layouts.
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE,
+ label, KeyboardIconsSet.ICON_UNDEFINED);
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE_SYMBOLS,
+ label, KeyboardIconsSet.ICON_UNDEFINED);
+ // Test normal number layout.
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_NUMBER,
+ label, KeyboardIconsSet.ICON_UNDEFINED);
+ // Test number password layouts.
+ editorInfo.inputType =
+ InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
+ final KeyboardLayoutSet passwordSet = createKeyboardLayoutSet(subtype, editorInfo);
+ doTestActionKey(tag, passwordSet, KeyboardId.ELEMENT_NUMBER,
+ label, KeyboardIconsSet.ICON_UNDEFINED);
+ }
+
+ protected void doTestActionKeyIcon(final String tag, final InputMethodSubtype subtype,
+ final int actionId, final String iconName) {
+ final int iconId = KeyboardIconsSet.getIconId(iconName);
+ final EditorInfo editorInfo = new EditorInfo();
+ editorInfo.imeOptions = actionId;
+ // Test text layouts.
+ editorInfo.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
+ final KeyboardLayoutSet layoutSet = createKeyboardLayoutSet(subtype, editorInfo);
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_ALPHABET, null /* label */, iconId);
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS, null /* label */, iconId);
+ doTestActionKey(
+ tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS_SHIFTED, null /* label */, iconId);
+ // Test phone number layouts.
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE, null /* label */, iconId);
+ doTestActionKey(
+ tag, layoutSet, KeyboardId.ELEMENT_PHONE_SYMBOLS, null /* label */, iconId);
+ // Test normal number layout.
+ doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_NUMBER, null /* label */, iconId);
+ // Test number password layout.
+ editorInfo.inputType =
+ InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
+ final KeyboardLayoutSet passwordSet = createKeyboardLayoutSet(subtype, editorInfo);
+ doTestActionKey(tag, passwordSet, KeyboardId.ELEMENT_NUMBER, null /* label */, iconId);
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
index 96f925554..322a344ff 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelKlpTests.java
@@ -18,174 +18,125 @@ package com.android.inputmethod.keyboard;
import android.content.res.Resources;
import android.test.suitebuilder.annotation.MediumTest;
-import android.text.InputType;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
-import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.utils.RunInLocale;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
+import java.util.Locale;
+
@MediumTest
-public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetTestsBase {
+public class KeyboardLayoutSetActionLabelKlpTests extends KeyboardLayoutSetActionLabelBase {
@Override
protected int getKeyboardThemeForTests() {
return KeyboardTheme.THEME_ID_KLP;
}
- private static void doTestActionKey(final String tag, final KeyboardLayoutSet layoutSet,
- final int elementId, final CharSequence label, final int iconId) {
- final Keyboard keyboard = layoutSet.getKeyboard(elementId);
- final Key enterKey = keyboard.getKey(Constants.CODE_ENTER);
- assertNotNull(tag + " enter key on " + keyboard.mId, enterKey);
- assertEquals(tag + " enter label " + enterKey, label, enterKey.getLabel());
- assertEquals(tag + " enter icon " + enterKey, iconId, enterKey.getIconId());
- }
-
- protected void doTestActionLabel(final String tag, final InputMethodSubtype subtype,
- final int actionId, final int labelResId) {
- final EditorInfo editorInfo = new EditorInfo();
- editorInfo.imeOptions = actionId;
- final RunInLocale<String> job = new RunInLocale<String>() {
- @Override
- protected String job(final Resources res) {
- return res.getString(labelResId);
- }
- };
- final Resources res = getContext().getResources();
- final String label;
- if (subtype.getLocale().equals(SubtypeLocaleUtils.NO_LANGUAGE)) {
- // Using system locale.
- label = res.getString(labelResId);
- } else {
- label = job.runInLocale(res, SubtypeLocaleUtils.getSubtypeLocale(subtype));
- }
- doTestActionLabel(tag, subtype, editorInfo, label);
- }
-
- protected void doTestActionLabel(final String tag, final InputMethodSubtype subtype,
- final EditorInfo editorInfo, final CharSequence label) {
- // Test text layouts.
- editorInfo.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
- final KeyboardLayoutSet layoutSet = createKeyboardLayoutSet(subtype, editorInfo);
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_ALPHABET,
- label, KeyboardIconsSet.ICON_UNDEFINED);
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS,
- label, KeyboardIconsSet.ICON_UNDEFINED);
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS_SHIFTED,
- label, KeyboardIconsSet.ICON_UNDEFINED);
- // Test phone number layouts.
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE,
- label, KeyboardIconsSet.ICON_UNDEFINED);
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE_SYMBOLS,
- label, KeyboardIconsSet.ICON_UNDEFINED);
- // Test normal number layout.
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_NUMBER,
- label, KeyboardIconsSet.ICON_UNDEFINED);
- // Test number password layouts.
- editorInfo.inputType =
- InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
- final KeyboardLayoutSet passwordSet = createKeyboardLayoutSet(subtype, editorInfo);
- doTestActionKey(tag, passwordSet, KeyboardId.ELEMENT_NUMBER,
- label, KeyboardIconsSet.ICON_UNDEFINED);
- }
-
- protected void doTestActionKeyIcon(final String tag, final InputMethodSubtype subtype,
- final int actionId, final String iconName) {
- final int iconId = KeyboardIconsSet.getIconId(iconName);
- final EditorInfo editorInfo = new EditorInfo();
- editorInfo.imeOptions = actionId;
- // Test text layouts.
- editorInfo.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
- final KeyboardLayoutSet layoutSet = createKeyboardLayoutSet(subtype, editorInfo);
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_ALPHABET, null /* label */, iconId);
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS, null /* label */, iconId);
- doTestActionKey(
- tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS_SHIFTED, null /* label */, iconId);
- // Test phone number layouts.
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE, null /* label */, iconId);
- doTestActionKey(
- tag, layoutSet, KeyboardId.ELEMENT_PHONE_SYMBOLS, null /* label */, iconId);
- // Test normal number layout.
- doTestActionKey(tag, layoutSet, KeyboardId.ELEMENT_NUMBER, null /* label */, iconId);
- // Test number password layout.
- editorInfo.inputType =
- InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
- final KeyboardLayoutSet passwordSet = createKeyboardLayoutSet(subtype, editorInfo);
- doTestActionKey(tag, passwordSet, KeyboardId.ELEMENT_NUMBER, null /* label */, iconId);
- }
-
- public void testActionUnspecified() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
- final String tag = "unspecifiled "
- + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_UNSPECIFIED,
- KeyboardIconsSet.NAME_ENTER_KEY);
- }
- }
-
- public void testActionNone() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
- final String tag = "none " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_NONE,
- KeyboardIconsSet.NAME_ENTER_KEY);
- }
- }
-
+ @Override
public void testActionGo() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "go " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionLabel(tag, subtype, EditorInfo.IME_ACTION_GO, R.string.label_go_key);
- }
- }
-
- public void testActionSearch() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
- final String tag = "search " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionKeyIcon(tag, subtype, EditorInfo.IME_ACTION_SEARCH,
- KeyboardIconsSet.NAME_SEARCH_KEY);
+ doTestActionKeyLabelResId(tag, subtype, EditorInfo.IME_ACTION_GO,
+ R.string.label_go_key);
}
}
+ @Override
public void testActionSend() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "send " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionLabel(tag, subtype, EditorInfo.IME_ACTION_SEND, R.string.label_send_key);
+ doTestActionKeyLabelResId(tag, subtype, EditorInfo.IME_ACTION_SEND,
+ R.string.label_send_key);
}
}
+ @Override
public void testActionNext() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "next " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionLabel(tag, subtype, EditorInfo.IME_ACTION_NEXT, R.string.label_next_key);
+ doTestActionKeyLabelResId(tag, subtype, EditorInfo.IME_ACTION_NEXT,
+ R.string.label_next_key);
}
}
+ @Override
public void testActionDone() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "done " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionLabel(tag, subtype, EditorInfo.IME_ACTION_DONE, R.string.label_done_key);
+ doTestActionKeyLabelResId(tag, subtype, EditorInfo.IME_ACTION_DONE,
+ R.string.label_done_key);
}
}
+ @Override
public void testActionPrevious() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "previous " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- doTestActionLabel(
- tag, subtype, EditorInfo.IME_ACTION_PREVIOUS, R.string.label_previous_key);
+ doTestActionKeyLabelResId(tag, subtype, EditorInfo.IME_ACTION_PREVIOUS,
+ R.string.label_previous_key);
}
}
- public void testActionCustom() {
- for (final InputMethodSubtype subtype : getAllSubtypesList()) {
- final String tag = "custom " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
- final CharSequence customLabel = "customLabel";
- final EditorInfo editorInfo = new EditorInfo();
- editorInfo.imeOptions = EditorInfo.IME_ACTION_UNSPECIFIED;
- editorInfo.actionLabel = customLabel;
- doTestActionLabel(tag, subtype, editorInfo, customLabel);
+ // Working variable to simulate system locale changing.
+ private Locale mSystemLocale = Locale.getDefault();
+
+ private void doTestActionLabelInLocale(final InputMethodSubtype subtype,
+ final Locale labelLocale, final Locale systemLocale) {
+ // Simulate system locale changing, see {@link SystemBroadcastReceiver}.
+ if (!systemLocale.equals(mSystemLocale)) {
+ KeyboardLayoutSet.onSystemLocaleChanged();
+ mSystemLocale = systemLocale;
}
+ final String tag = "label=" + labelLocale + " system=" + systemLocale
+ + " " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
+ final RunInLocale<Void> job = new RunInLocale<Void>() {
+ @Override
+ public Void job(final Resources res) {
+ doTestActionKeyIcon(tag + " unspecified", subtype,
+ EditorInfo.IME_ACTION_UNSPECIFIED, KeyboardIconsSet.NAME_ENTER_KEY);
+ doTestActionKeyIcon(tag + " none", subtype,
+ EditorInfo.IME_ACTION_NONE, KeyboardIconsSet.NAME_ENTER_KEY);
+ doTestActionKeyLabelResIdInLocale(tag + " go", subtype,
+ EditorInfo.IME_ACTION_GO, labelLocale, R.string.label_go_key);
+ doTestActionKeyIcon(tag + " search", subtype,
+ EditorInfo.IME_ACTION_SEARCH, KeyboardIconsSet.NAME_SEARCH_KEY);
+ doTestActionKeyLabelResIdInLocale(tag + " send", subtype,
+ EditorInfo.IME_ACTION_SEND, labelLocale, R.string.label_send_key);
+ doTestActionKeyLabelResIdInLocale(tag + " next", subtype,
+ EditorInfo.IME_ACTION_NEXT, labelLocale, R.string.label_next_key);
+ doTestActionKeyLabelResIdInLocale(tag + " done", subtype,
+ EditorInfo.IME_ACTION_DONE, labelLocale, R.string.label_done_key);
+ doTestActionKeyLabelResIdInLocale(tag + " previous", subtype,
+ EditorInfo.IME_ACTION_PREVIOUS, labelLocale, R.string.label_previous_key);
+ return null;
+ }
+ };
+ job.runInLocale(getContext().getResources(), systemLocale);
+ }
+
+ public void testActionLabelInOtherLocale() {
+ final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
+ final InputMethodSubtype italian = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+ Locale.ITALIAN.toString(), SubtypeLocaleUtils.QWERTY);
+ // An action label should be displayed in subtype's locale regardless of the system locale.
+ doTestActionLabelInLocale(italian, Locale.ITALIAN, Locale.US);
+ doTestActionLabelInLocale(italian, Locale.ITALIAN, Locale.FRENCH);
+ doTestActionLabelInLocale(italian, Locale.ITALIAN, Locale.ITALIAN);
+ doTestActionLabelInLocale(italian, Locale.ITALIAN, Locale.JAPANESE);
+ }
+
+ public void testNoLanguageSubtypeActionLabel() {
+ final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
+ final InputMethodSubtype noLanguage = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+ SubtypeLocaleUtils.NO_LANGUAGE, SubtypeLocaleUtils.QWERTY);
+ // An action label of no language keyboard should be displayed in the system locale.
+ doTestActionLabelInLocale(noLanguage, Locale.US, Locale.US);
+ doTestActionLabelInLocale(noLanguage, Locale.FRENCH, Locale.FRENCH);
+ doTestActionLabelInLocale(noLanguage, Locale.ITALIAN, Locale.ITALIAN);
+ doTestActionLabelInLocale(noLanguage, Locale.JAPANESE, Locale.JAPANESE);
}
}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java
index 7747ac5f9..028b3e400 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetActionLabelLxxTests.java
@@ -24,20 +24,10 @@ import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
@MediumTest
-public class KeyboardLayoutSetActionLabelLxxTests extends KeyboardLayoutSetActionLabelKlpTests {
+public class KeyboardLayoutSetActionLabelLxxTests extends KeyboardLayoutSetActionLabelBase {
@Override
protected int getKeyboardThemeForTests() {
- return KeyboardTheme.THEME_ID_LXX_DARK;
- }
-
- @Override
- public void testActionUnspecified() {
- super.testActionUnspecified();
- }
-
- @Override
- public void testActionNone() {
- super.testActionNone();
+ return KeyboardTheme.THEME_ID_LXX_LIGHT;
}
@Override
@@ -50,11 +40,6 @@ public class KeyboardLayoutSetActionLabelLxxTests extends KeyboardLayoutSetActio
}
@Override
- public void testActionSearch() {
- super.testActionSearch();
- }
-
- @Override
public void testActionSend() {
for (final InputMethodSubtype subtype : getAllSubtypesList()) {
final String tag = "send " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
@@ -89,9 +74,4 @@ public class KeyboardLayoutSetActionLabelLxxTests extends KeyboardLayoutSetActio
KeyboardIconsSet.NAME_PREVIOUS_KEY);
}
}
-
- @Override
- public void testActionCustom() {
- super.testActionCustom();
- }
}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysBase.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysBase.java
new file mode 100644
index 000000000..1fce362b5
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysBase.java
@@ -0,0 +1,324 @@
+/*
+ * 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.keyboard;
+
+import android.text.InputType;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.keyboard.internal.MoreKeySpec;
+import com.android.inputmethod.latin.Constants;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.RichInputMethodManager;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
+
+import java.util.Arrays;
+import java.util.Locale;
+
+abstract class KeyboardLayoutSetNavigateMoreKeysBase extends KeyboardLayoutSetTestsBase {
+ private ExpectedMoreKey mExpectedNavigateNextMoreKey;
+ private ExpectedMoreKey mExpectedNavigatePreviousMoreKey;
+ private ExpectedMoreKey mExpectedEmojiMoreKey;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mExpectedNavigateNextMoreKey = new ExpectedMoreKey(R.string.label_next_key);
+ mExpectedNavigatePreviousMoreKey = new ExpectedMoreKey(R.string.label_previous_key);
+ mExpectedEmojiMoreKey = new ExpectedMoreKey(KeyboardIconsSet.NAME_EMOJI_ACTION_KEY);
+ }
+
+ /**
+ * This class represents an expected more key.
+ */
+ protected static class ExpectedMoreKey {
+ public static final int NO_LABEL = 0;
+ public static final ExpectedMoreKey[] EMPTY_MORE_KEYS = new ExpectedMoreKey[0];
+
+ public final int mLabelResId;
+ public final int mIconId;
+
+ public ExpectedMoreKey(final String iconName) {
+ mLabelResId = NO_LABEL;
+ mIconId = KeyboardIconsSet.getIconId(iconName);
+ }
+
+ public ExpectedMoreKey(final int labelResId) {
+ mLabelResId = labelResId;
+ mIconId = KeyboardIconsSet.ICON_UNDEFINED;
+ }
+ }
+
+ private void doTestMoreKeysOf(final int code, final InputMethodSubtype subtype,
+ final int elementId, final int inputType, final int imeOptions,
+ final ExpectedMoreKey ... expectedMoreKeys) {
+ final EditorInfo editorInfo = new EditorInfo();
+ editorInfo.inputType = inputType;
+ editorInfo.imeOptions = imeOptions;
+ final KeyboardLayoutSet layoutSet = createKeyboardLayoutSet(subtype, editorInfo);
+ final Keyboard keyboard = layoutSet.getKeyboard(elementId);
+
+ final Key actualKey = keyboard.getKey(code);
+ final MoreKeySpec[] actualMoreKeys = actualKey.getMoreKeys();
+ final String tag = actualKey.toString() + " moreKeys=" + Arrays.toString(actualMoreKeys);
+ if (expectedMoreKeys.length == 0) {
+ assertEquals(tag, null, actualMoreKeys);
+ return;
+ }
+ if (expectedMoreKeys.length == 1) {
+ assertEquals(tag + " fixedOrder", false, actualKey.isMoreKeysFixedOrder());
+ assertEquals(tag + " fixedColumn", false, actualKey.isMoreKeysFixedColumn());
+ } else {
+ assertEquals(tag + " fixedOrder", true, actualKey.isMoreKeysFixedOrder());
+ assertEquals(tag + " fixedColumn", true, actualKey.isMoreKeysFixedColumn());
+ // TODO: Can't handle multiple rows of more keys.
+ assertEquals(tag + " column",
+ expectedMoreKeys.length, actualKey.getMoreKeysColumnNumber());
+ }
+ assertEquals(tag, expectedMoreKeys.length, actualMoreKeys.length);
+ for (int index = 0; index < actualMoreKeys.length; index++) {
+ final int expectedLabelResId = expectedMoreKeys[index].mLabelResId;
+ if (expectedLabelResId == ExpectedMoreKey.NO_LABEL) {
+ assertEquals(tag + " label " + index, null, actualMoreKeys[index].mLabel);
+ } else {
+ final CharSequence expectedLabel = getContext().getText(expectedLabelResId);
+ assertEquals(tag + " label " + index, expectedLabel, actualMoreKeys[index].mLabel);
+ }
+ final int expectedIconId = expectedMoreKeys[index].mIconId;
+ assertEquals(tag + " icon " + index, expectedIconId, actualMoreKeys[index].mIconId);
+ }
+ }
+
+ private void doTestNavigationMoreKeysOf(final int code, final InputMethodSubtype subtype,
+ final int elementId, final int inputType) {
+ // No navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_NULL,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // With next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ mExpectedNavigateNextMoreKey);
+ // With previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedNavigatePreviousMoreKey);
+ // With next and previous naviagte flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedNavigatePreviousMoreKey, mExpectedNavigateNextMoreKey);
+ // Action next.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action next with next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action next with previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedNavigatePreviousMoreKey);
+ // Action next with next and previous navigate flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_NEXT
+ | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedNavigatePreviousMoreKey);
+ // Action previous.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action previous with next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ mExpectedNavigateNextMoreKey);
+ // Action previous with previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action previous with next and previous navigate flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_NEXT
+ | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedNavigateNextMoreKey);
+ }
+
+ private void doTestNavigationWithEmojiMoreKeysOf(final int code,
+ final InputMethodSubtype subtype, final int elementId, final int inputType) {
+ // No navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_NULL,
+ mExpectedEmojiMoreKey);
+ // With next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ mExpectedEmojiMoreKey, mExpectedNavigateNextMoreKey);
+ // With previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedEmojiMoreKey, mExpectedNavigatePreviousMoreKey);
+ // With next and previous naviagte flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedEmojiMoreKey, mExpectedNavigatePreviousMoreKey,
+ mExpectedNavigateNextMoreKey);
+ // Action next.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT,
+ mExpectedEmojiMoreKey);
+ // Action next with next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ mExpectedEmojiMoreKey);
+ // Action next with previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedEmojiMoreKey, mExpectedNavigatePreviousMoreKey);
+ // Action next with next and previous navigate flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_NEXT
+ | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedEmojiMoreKey, mExpectedNavigatePreviousMoreKey);
+ // Action previous.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS,
+ mExpectedEmojiMoreKey);
+ // Action previous with next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ mExpectedEmojiMoreKey, mExpectedNavigateNextMoreKey);
+ // Action previous with previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedEmojiMoreKey);
+ // Action previous with next and previous navigate flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_NEXT
+ | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ mExpectedEmojiMoreKey, mExpectedNavigateNextMoreKey);
+ }
+
+ private void doTestNoNavigationMoreKeysOf(final int code, final InputMethodSubtype subtype,
+ final int elementId, final int inputType) {
+ // No navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_NULL,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // With next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // With previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // With next and previous naviagte flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action next.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action next with next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action next with previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action next with next and previous navigate flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NAVIGATE_NEXT
+ | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action previous.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action previous with next navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_NEXT,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action previous with previous navigate flag.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ // Action previous with next and previous navigate flags.
+ doTestMoreKeysOf(code, subtype, elementId, inputType,
+ EditorInfo.IME_ACTION_PREVIOUS | EditorInfo.IME_FLAG_NAVIGATE_NEXT
+ | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS,
+ ExpectedMoreKey.EMPTY_MORE_KEYS);
+ }
+
+ public void testMoreKeysOfEnterKey() {
+ final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
+ final InputMethodSubtype subtype = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+ Locale.US.toString(), SubtypeLocaleUtils.QWERTY);
+
+ // Password field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_ALPHABET,
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+ // Email field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_ALPHABET,
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
+ // Url field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_ALPHABET,
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI);
+ // Phone number field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_PHONE,
+ InputType.TYPE_CLASS_PHONE);
+ // Number field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_NUMBER,
+ InputType.TYPE_CLASS_NUMBER);
+ // Date-time field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_NUMBER,
+ InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL);
+ // Date field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_NUMBER,
+ InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE);
+ // Time field.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype, KeyboardId.ELEMENT_NUMBER,
+ InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME);
+ // Text field.
+ if (isPhone()) {
+ // The enter key has an Emoji key as one of more keys.
+ doTestNavigationWithEmojiMoreKeysOf(Constants.CODE_ENTER, subtype,
+ KeyboardId.ELEMENT_ALPHABET,
+ InputType.TYPE_CLASS_TEXT);
+ } else {
+ // Tablet has a dedicated Emoji key, so the Enter key has no Emoji more key.
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype,
+ KeyboardId.ELEMENT_ALPHABET,
+ InputType.TYPE_CLASS_TEXT);
+ }
+ // Short message field.
+ if (isPhone()) {
+ // Enter key is switched to Emoji key on a short message field.
+ // Emoji key has no navigation more keys.
+ doTestNoNavigationMoreKeysOf(Constants.CODE_EMOJI, subtype,
+ KeyboardId.ELEMENT_ALPHABET,
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);
+ } else {
+ doTestNavigationMoreKeysOf(Constants.CODE_ENTER, subtype,
+ KeyboardId.ELEMENT_ALPHABET,
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);
+ }
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysKlpTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysKlpTests.java
new file mode 100644
index 000000000..286c69d33
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysKlpTests.java
@@ -0,0 +1,28 @@
+/*
+ * 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.keyboard;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+@SmallTest
+public class KeyboardLayoutSetNavigateMoreKeysKlpTests
+ extends KeyboardLayoutSetNavigateMoreKeysBase {
+ @Override
+ protected int getKeyboardThemeForTests() {
+ return KeyboardTheme.THEME_ID_KLP;
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysLxxTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysLxxTests.java
new file mode 100644
index 000000000..02593cb49
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetNavigateMoreKeysLxxTests.java
@@ -0,0 +1,28 @@
+/*
+ * 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.keyboard;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+@SmallTest
+public class KeyboardLayoutSetNavigateMoreKeysLxxTests
+ extends KeyboardLayoutSetNavigateMoreKeysBase {
+ @Override
+ protected int getKeyboardThemeForTests() {
+ return KeyboardTheme.THEME_ID_LXX_LIGHT;
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java
index 0a76a9d91..29aa7580d 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java
@@ -43,7 +43,6 @@ public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase {
private final ArrayList<InputMethodSubtype> mAsciiCapableSubtypesList = new ArrayList<>();
private final ArrayList<InputMethodSubtype> mAdditionalSubtypesList = new ArrayList<>();
- private Context mThemeContext;
private int mScreenMetrics;
protected abstract int getKeyboardThemeForTests();
@@ -51,12 +50,13 @@ public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
- mScreenMetrics = mContext.getResources().getInteger(R.integer.config_screen_metrics);
-
final KeyboardTheme keyboardTheme = KeyboardTheme.searchKeyboardThemeById(
getKeyboardThemeForTests());
- mThemeContext = new ContextThemeWrapper(mContext, keyboardTheme.mStyleId);
- RichInputMethodManager.init(mThemeContext);
+ setContext(new ContextThemeWrapper(getContext(), keyboardTheme.mStyleId));
+
+ final Context context = getContext();
+ mScreenMetrics = context.getResources().getInteger(R.integer.config_screen_metrics);
+ RichInputMethodManager.init(context);
final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
final InputMethodInfo imi = richImm.getInputMethodInfoOfThisIme();
@@ -122,7 +122,7 @@ public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase {
protected KeyboardLayoutSet createKeyboardLayoutSet(final InputMethodSubtype subtype,
final EditorInfo editorInfo, final boolean voiceInputKeyEnabled,
final boolean languageSwitchKeyEnabled) {
- final Context context = mThemeContext;
+ final Context context = getContext();
final Resources res = context.getResources();
final int keyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res);
final int keyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res);
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java
new file mode 100644
index 000000000..ebefe2d0e
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java
@@ -0,0 +1,2464 @@
+/*
+ * 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.keyboard;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.inputmethod.keyboard.MoreKeysKeyboard.MoreKeysKeyboardParams;
+
+@MediumTest
+public class MoreKeysKeyboardBuilderAutoOrderTests extends AndroidTestCase {
+ private static final int WIDTH = 10;
+ private static final int HEIGHT = 10;
+
+ private static final int KEYBOARD_WIDTH = WIDTH * 10;
+ private static final int XPOS_L0 = WIDTH * 0 + WIDTH / 2;
+ private static final int XPOS_L1 = WIDTH * 1 + WIDTH / 2;
+ private static final int XPOS_L2 = WIDTH * 2 + WIDTH / 2;
+ private static final int XPOS_L3 = WIDTH * 3 + WIDTH / 2;
+ private static final int XPOS_M0 = WIDTH * 4 + WIDTH / 2;
+ private static final int XPOS_M1 = WIDTH * 5 + WIDTH / 2;
+ private static final int XPOS_R3 = WIDTH * 6 + WIDTH / 2;
+ private static final int XPOS_R2 = WIDTH * 7 + WIDTH / 2;
+ private static final int XPOS_R1 = WIDTH * 8 + WIDTH / 2;
+ private static final int XPOS_R0 = WIDTH * 9 + WIDTH / 2;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ private static MoreKeysKeyboardParams createParams(final int numKeys, final int columnNum,
+ final int coordXInParent) {
+ final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
+ params.setParameters(numKeys, columnNum, WIDTH, HEIGHT, coordXInParent, KEYBOARD_WIDTH,
+ true /* isMoreKeysFixedColumn */, false /* isMoreKeysFixedOrder */,
+ 0 /* dividerWidth */);
+ return params;
+ }
+
+ public void testLayoutError() {
+ MoreKeysKeyboardParams params = null;
+ try {
+ final int maxColumns = KEYBOARD_WIDTH / WIDTH;
+ params = createParams(maxColumns + 1, maxColumns + 1, HEIGHT);
+ fail("Should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // Too small keyboard to hold more keys keyboard.
+ }
+ assertNull("Too small keyboard to hold more keys keyboard", params);
+ }
+
+ // More keys keyboard layout test.
+ // "[n]" represents n-th key position in more keys keyboard.
+ // "<1>" is the default key.
+
+ // <1>
+ public void testLayout1KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(1, 5, XPOS_M0);
+ assertEquals("1 key auto 5 M0 columns", 1, params.mNumColumns);
+ assertEquals("1 key auto 5 M0 rows", 1, params.mNumRows);
+ assertEquals("1 key auto 5 M0 left", 0, params.mLeftKeys);
+ assertEquals("1 key auto 5 M0 right", 1, params.mRightKeys);
+ assertEquals("1 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("1 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("1 key auto 5 M0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |<1>
+ public void testLayout1KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L0);
+ assertEquals("1 key auto 5 L0 columns", 1, params.mNumColumns);
+ assertEquals("1 key auto 5 L0 rows", 1, params.mNumRows);
+ assertEquals("1 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("1 key auto 5 L0 right", 1, params.mRightKeys);
+ assertEquals("1 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("1 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("1 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ <1>
+ public void testLayout1KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L1);
+ assertEquals("1 key auto 5 L1 columns", 1, params.mNumColumns);
+ assertEquals("1 key auto 5 L1 rows", 1, params.mNumRows);
+ assertEquals("1 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("1 key auto 5 L1 right", 1, params.mRightKeys);
+ assertEquals("1 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("1 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("1 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ <1>
+ public void testLayout1KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L2);
+ assertEquals("1 key auto 5 L2 columns", 1, params.mNumColumns);
+ assertEquals("1 key auto 5 L2 rows", 1, params.mNumRows);
+ assertEquals("1 key auto 5 L2 left", 0, params.mLeftKeys);
+ assertEquals("1 key auto 5 L2 right", 1, params.mRightKeys);
+ assertEquals("1 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("1 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("1 key auto 5 L2 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // <1>|
+ public void testLayout1KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R0);
+ assertEquals("1 key auto 5 R0 columns", 1, params.mNumColumns);
+ assertEquals("1 key auto 5 R0 rows", 1, params.mNumRows);
+ assertEquals("1 key auto 5 R0 left", 0, params.mLeftKeys);
+ assertEquals("1 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("1 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("1 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("1 key auto 5 R0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // <1> ___|
+ public void testLayout1KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R1);
+ assertEquals("1 key auto 5 R1 columns", 1, params.mNumColumns);
+ assertEquals("1 key auto 5 R1 rows", 1, params.mNumRows);
+ assertEquals("1 key auto 5 R1 left", 0, params.mLeftKeys);
+ assertEquals("1 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("1 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("1 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("1 key auto 5 R1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // <1> ___ ___|
+ public void testLayout1KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R2);
+ assertEquals("1 key auto 5 R2 columns", 1, params.mNumColumns);
+ assertEquals("1 key auto 5 R2 rows", 1, params.mNumRows);
+ assertEquals("1 key auto 5 R2 left", 0, params.mLeftKeys);
+ assertEquals("1 key auto 5 R2 right", 1, params.mRightKeys);
+ assertEquals("1 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("1 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("1 key auto 5 R2 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // <1> [2]
+ public void testLayout2KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(2, 5, XPOS_M0);
+ assertEquals("2 key auto 5 M0 columns", 2, params.mNumColumns);
+ assertEquals("2 key auto 5 M0 rows", 1, params.mNumRows);
+ assertEquals("2 key auto 5 M0 left", 0, params.mLeftKeys);
+ assertEquals("2 key auto 5 M0 right", 2, params.mRightKeys);
+ assertEquals("2 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("2 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("2 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("2 key auto 5 M0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |<1> [2]
+ public void testLayout2KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L0);
+ assertEquals("2 key auto 5 L0 columns", 2, params.mNumColumns);
+ assertEquals("2 key auto 5 L0 rows", 1, params.mNumRows);
+ assertEquals("2 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("2 key auto 5 L0 right", 2, params.mRightKeys);
+ assertEquals("2 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("2 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("2 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("2 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ <1> [2]
+ public void testLayout2KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L1);
+ assertEquals("2 key auto 5 L1 columns", 2, params.mNumColumns);
+ assertEquals("2 key auto 5 L1 rows", 1, params.mNumRows);
+ assertEquals("2 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("2 key auto 5 L1 right", 2, params.mRightKeys);
+ assertEquals("2 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("2 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("2 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("2 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ <1> [2]
+ public void testLayout2KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L2);
+ assertEquals("2 key auto 5 L2 columns", 2, params.mNumColumns);
+ assertEquals("2 key auto 5 L2 rows", 1, params.mNumRows);
+ assertEquals("2 key auto 5 L2 left", 0, params.mLeftKeys);
+ assertEquals("2 key auto 5 L2 right", 2, params.mRightKeys);
+ assertEquals("2 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("2 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("2 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("2 key auto 5 L2 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // [2] <1>|
+ public void testLayout2KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R0);
+ assertEquals("2 key auto 5 R0 columns", 2, params.mNumColumns);
+ assertEquals("2 key auto 5 R0 rows", 1, params.mNumRows);
+ assertEquals("2 key auto 5 R0 left", 1, params.mLeftKeys);
+ assertEquals("2 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("2 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("2 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("2 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("2 key auto 5 R0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [2] <1> ___|
+ public void testLayout2KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R1);
+ assertEquals("2 key auto 5 R1 columns", 2, params.mNumColumns);
+ assertEquals("2 key auto 5 R1 rows", 1, params.mNumRows);
+ assertEquals("2 key auto 5 R1 left", 1, params.mLeftKeys);
+ assertEquals("2 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("2 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("2 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("2 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("2 key auto 5 R1 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // <1> [2] ___|
+ public void testLayout2KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R2);
+ assertEquals("2 key auto 5 R2 columns", 2, params.mNumColumns);
+ assertEquals("2 key auto 5 R2 rows", 1, params.mNumRows);
+ assertEquals("2 key auto 5 R2 left", 0, params.mLeftKeys);
+ assertEquals("2 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("2 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("2 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("2 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("2 key auto 5 R2 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // [3] <1> [2]
+ public void testLayout3KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(3, 5, XPOS_M0);
+ assertEquals("3 key auto 5 M0 columns", 3, params.mNumColumns);
+ assertEquals("3 key auto 5 M0 rows", 1, params.mNumRows);
+ assertEquals("3 key auto 5 M0 left", 1, params.mLeftKeys);
+ assertEquals("3 key auto 5 M0 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("3 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 5 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |<1> [2] [3]
+ public void testLayout3KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L0);
+ assertEquals("3 key auto 5 L0 columns", 3, params.mNumColumns);
+ assertEquals("3 key auto 5 L0 rows", 1, params.mNumRows);
+ assertEquals("3 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("3 key auto 5 L0 right", 3, params.mRightKeys);
+ assertEquals("3 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("3 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ <1> [2] [3]
+ public void testLayout3KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L1);
+ assertEquals("3 key auto 5 L1 columns", 3, params.mNumColumns);
+ assertEquals("3 key auto 5 L1 rows", 1, params.mNumRows);
+ assertEquals("3 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("3 key auto 5 L1 right", 3, params.mRightKeys);
+ assertEquals("3 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("3 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [3] <1> [2]
+ public void testLayout3KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L2);
+ assertEquals("3 key auto 5 L2 columns", 3, params.mNumColumns);
+ assertEquals("3 key auto 5 L2 rows", 1, params.mNumRows);
+ assertEquals("3 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("3 key auto 5 L2 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("3 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [3] [2] <1>|
+ public void testLayout3KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R0);
+ assertEquals("3 key auto 5 R0 columns", 3, params.mNumColumns);
+ assertEquals("3 key auto 5 R0 rows", 1, params.mNumRows);
+ assertEquals("3 key auto 5 R0 left", 2, params.mLeftKeys);
+ assertEquals("3 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("3 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("3 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("3 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 5 R0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [3] [2] <1> ___|
+ public void testLayout3KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R1);
+ assertEquals("3 key auto 5 R1 columns", 3, params.mNumColumns);
+ assertEquals("3 key auto 5 R1 rows", 1, params.mNumRows);
+ assertEquals("3 key auto 5 R1 left", 2, params.mLeftKeys);
+ assertEquals("3 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("3 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("3 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("3 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 5 R1 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [3] <1> [2] ___|
+ public void testLayout3KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R2);
+ assertEquals("3 key auto 5 R2 columns", 3, params.mNumColumns);
+ assertEquals("3 key auto 5 R2 rows", 1, params.mNumRows);
+ assertEquals("3 key auto 5 R2 left", 1, params.mLeftKeys);
+ assertEquals("3 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("3 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 5 R2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [3]
+ // <1> [2]
+ public void testLayout3KeyAuto2M0() {
+ MoreKeysKeyboardParams params = createParams(3, 2, XPOS_M0);
+ assertEquals("3 key auto 2 M0 columns", 2, params.mNumColumns);
+ assertEquals("3 key auto 2 M0 rows", 2, params.mNumRows);
+ assertEquals("3 key auto 2 M0 left", 0, params.mLeftKeys);
+ assertEquals("3 key auto 2 M0 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 2 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 2 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 2 M0 [3]", 0, params.getColumnPos(2));
+ assertEquals("3 key auto 2 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 2 M0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |[3]
+ // |<1> [2]
+ public void testLayout3KeyAuto2L0() {
+ MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L0);
+ assertEquals("3 key auto 2 L0 columns", 2, params.mNumColumns);
+ assertEquals("3 key auto 2 L0 rows", 2, params.mNumRows);
+ assertEquals("3 key auto 2 L0 left", 0, params.mLeftKeys);
+ assertEquals("3 key auto 2 L0 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 2 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 2 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 2 L0 [3]", 0, params.getColumnPos(2));
+ assertEquals("3 key auto 2 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 2 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [3]
+ // |___ <1> [2]
+ public void testLayout3KeyAuto2L1() {
+ MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L1);
+ assertEquals("3 key auto 2 L1 columns", 2, params.mNumColumns);
+ assertEquals("3 key auto 2 L1 rows", 2, params.mNumRows);
+ assertEquals("3 key auto 2 L1 left", 0, params.mLeftKeys);
+ assertEquals("3 key auto 2 L1 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 2 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 2 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 2 L1 [3]", 0, params.getColumnPos(2));
+ assertEquals("3 key auto 2 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 2 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // | [3]
+ // |___ ___ <1> [2]
+ public void testLayout3KeyAuto2L2() {
+ MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L2);
+ assertEquals("3 key auto 2 L2 columns", 2, params.mNumColumns);
+ assertEquals("3 key auto 2 L2 rows", 2, params.mNumRows);
+ assertEquals("3 key auto 2 L2 left", 0, params.mLeftKeys);
+ assertEquals("3 key auto 2 L2 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 2 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 2 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 2 L2 [3]", 0, params.getColumnPos(2));
+ assertEquals("3 key auto 2 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 2 L2 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // [3]|
+ // [2] <1>|
+ public void testLayout3KeyAuto2R0() {
+ MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R0);
+ assertEquals("3 key auto 2 R0 columns", 2, params.mNumColumns);
+ assertEquals("3 key auto 2 R0 rows", 2, params.mNumRows);
+ assertEquals("3 key auto 2 R0 left", 1, params.mLeftKeys);
+ assertEquals("3 key auto 2 R0 right", 1, params.mRightKeys);
+ assertEquals("3 key auto 2 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 2 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("3 key auto 2 R0 [3]", 0, params.getColumnPos(2));
+ assertEquals("3 key auto 2 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 2 R0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [3] |
+ // [2] <1> ___|
+ public void testLayout3KeyAuto2R1() {
+ MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R1);
+ assertEquals("3 key auto 2 R1 columns", 2, params.mNumColumns);
+ assertEquals("3 key auto 2 R1 rows", 2, params.mNumRows);
+ assertEquals("3 key auto 2 R1 left", 1, params.mLeftKeys);
+ assertEquals("3 key auto 2 R1 right", 1, params.mRightKeys);
+ assertEquals("3 key auto 2 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 2 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("3 key auto 2 R1 [3]", 0, params.getColumnPos(2));
+ assertEquals("3 key auto 2 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 2 R1 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [3] |
+ // <1> [2] ___|
+ public void testLayout3KeyAuto2R2() {
+ MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R2);
+ assertEquals("3 key auto 2 R2 columns", 2, params.mNumColumns);
+ assertEquals("3 key auto 2 R2 rows", 2, params.mNumRows);
+ assertEquals("3 key auto 2 R2 left", 0, params.mLeftKeys);
+ assertEquals("3 key auto 2 R2 right", 2, params.mRightKeys);
+ assertEquals("3 key auto 2 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("3 key auto 2 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("3 key auto 2 R2 [3]", 0, params.getColumnPos(2));
+ assertEquals("3 key auto 2 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("3 key auto 2 R2 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // [4]
+ // [3] <1> [2]
+ public void testLayout4KeyAuto3M0() {
+ MoreKeysKeyboardParams params = createParams(4, 3, XPOS_M0);
+ assertEquals("4 key auto 3 M0 columns", 3, params.mNumColumns);
+ assertEquals("4 key auto 3 M0 rows", 2, params.mNumRows);
+ assertEquals("4 key auto 3 M0 left", 1, params.mLeftKeys);
+ assertEquals("4 key auto 3 M0 right", 2, params.mRightKeys);
+ assertEquals("4 key auto 3 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 3 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 3 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 3 M0 [4]", 0, params.getColumnPos(3));
+ assertEquals("4 key auto 3 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 3 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |[4]
+ // |<1> [2] [3]
+ public void testLayout4KeyAuto3L0() {
+ MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L0);
+ assertEquals("4 key auto 3 L0 columns", 3, params.mNumColumns);
+ assertEquals("4 key auto 3 L0 rows", 2, params.mNumRows);
+ assertEquals("4 key auto 3 L0 left", 0, params.mLeftKeys);
+ assertEquals("4 key auto 3 L0 right", 3, params.mRightKeys);
+ assertEquals("4 key auto 3 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 3 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 3 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("4 key auto 3 L0 [4]", 0, params.getColumnPos(3));
+ assertEquals("4 key auto 3 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 3 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [4]
+ // |___ <1> [2] [3]
+ public void testLayout4KeyAuto3L1() {
+ MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L1);
+ assertEquals("4 key auto 3 L1 columns", 3, params.mNumColumns);
+ assertEquals("4 key auto 3 L1 rows", 2, params.mNumRows);
+ assertEquals("4 key auto 3 L1 left", 0, params.mLeftKeys);
+ assertEquals("4 key auto 3 L1 right", 3, params.mRightKeys);
+ assertEquals("4 key auto 3 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 3 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 3 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("4 key auto 3 L1 [4]", 0, params.getColumnPos(3));
+ assertEquals("4 key auto 3 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 3 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ [4]
+ // |___ [3] <1> [2]
+ public void testLayout4KeyAuto3L2() {
+ MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L2);
+ assertEquals("4 key auto 3 L2 columns", 3, params.mNumColumns);
+ assertEquals("4 key auto 3 L2 rows", 2, params.mNumRows);
+ assertEquals("4 key auto 3 L2 left", 1, params.mLeftKeys);
+ assertEquals("4 key auto 3 L2 right", 2, params.mRightKeys);
+ assertEquals("4 key auto 3 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 3 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 3 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 3 L2 [4]", 0, params.getColumnPos(3));
+ assertEquals("4 key auto 3 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 3 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [4]|
+ // [3] [2] <1>|
+ public void testLayout4KeyAuto3R0() {
+ MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R0);
+ assertEquals("4 key auto 3 R0 columns", 3, params.mNumColumns);
+ assertEquals("4 key auto 3 R0 rows", 2, params.mNumRows);
+ assertEquals("4 key auto 3 R0 left", 2, params.mLeftKeys);
+ assertEquals("4 key auto 3 R0 right", 1, params.mRightKeys);
+ assertEquals("4 key auto 3 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 3 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("4 key auto 3 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("4 key auto 3 R0 [4]", 0, params.getColumnPos(3));
+ assertEquals("4 key auto 3 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 3 R0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [4] ___|
+ // [3] [2] <1> ___|
+ public void testLayout4KeyAuto3R1() {
+ MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R1);
+ assertEquals("4 key auto 3 R1 columns", 3, params.mNumColumns);
+ assertEquals("4 key auto 3 R1 rows", 2, params.mNumRows);
+ assertEquals("4 key auto 3 R1 left", 2, params.mLeftKeys);
+ assertEquals("4 key auto 3 R1 right", 1, params.mRightKeys);
+ assertEquals("4 key auto 3 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 3 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("4 key auto 3 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("4 key auto 3 R1 [4]", 0, params.getColumnPos(3));
+ assertEquals("4 key auto 3 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 3 R1 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [4] ___|
+ // [3] <1> [2] ___|
+ public void testLayout4KeyAuto3R2() {
+ MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R2);
+ assertEquals("4 key auto 3 R2 columns", 3, params.mNumColumns);
+ assertEquals("4 key auto 3 R2 rows", 2, params.mNumRows);
+ assertEquals("4 key auto 3 R2 left", 1, params.mLeftKeys);
+ assertEquals("4 key auto 3 R2 right", 2, params.mRightKeys);
+ assertEquals("4 key auto 3 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 3 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 3 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 3 R2 [4]", 0, params.getColumnPos(3));
+ assertEquals("4 key auto 3 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 3 R2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [3] <1> [2] [4]
+ public void testLayout4KeyAuto4M0() {
+ MoreKeysKeyboardParams params = createParams(4, 4, XPOS_M0);
+ assertEquals("4 key auto 4 M0 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 4 M0 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 4 M0 left", 1, params.mLeftKeys);
+ assertEquals("4 key auto 4 M0 right", 3, params.mRightKeys);
+ assertEquals("4 key auto 4 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 4 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 4 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 4 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("4 key auto 4 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 4 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |<1> [2] [3] [4]
+ public void testLayout4KeyAuto4L0() {
+ MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L0);
+ assertEquals("4 key auto 4 L0 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 4 L0 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 4 L0 left", 0, params.mLeftKeys);
+ assertEquals("4 key auto 4 L0 right", 4, params.mRightKeys);
+ assertEquals("4 key auto 4 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 4 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 4 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("4 key auto 4 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("4 key auto 4 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 4 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ <1> [2] [3] [4]
+ public void testLayout4KeyAuto4L1() {
+ MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L1);
+ assertEquals("4 key auto 4 L1 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 4 L1 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 4 L1 left", 0, params.mLeftKeys);
+ assertEquals("4 key auto 4 L1 right", 4, params.mRightKeys);
+ assertEquals("4 key auto 4 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 4 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 4 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("4 key auto 4 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("4 key auto 4 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 4 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [3] <1> [2] [4]
+ public void testLayout4KeyAuto4L2() {
+ MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L2);
+ assertEquals("4 key auto 4 L2 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 4 L2 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 4 L2 left", 1, params.mLeftKeys);
+ assertEquals("4 key auto 4 L2 right", 3, params.mRightKeys);
+ assertEquals("4 key auto 4 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 4 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 4 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 4 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("4 key auto 4 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 4 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [3] [2] <1>|
+ public void testLayout4KeyAuto4R0() {
+ MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R0);
+ assertEquals("4 key auto 4 R0 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 4 R0 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 4 R0 left", 3, params.mLeftKeys);
+ assertEquals("4 key auto 4 R0 right", 1, params.mRightKeys);
+ assertEquals("4 key auto 4 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 4 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("4 key auto 4 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("4 key auto 4 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("4 key auto 4 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 4 R0 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [3] [2] <1> ___|
+ public void testLayout4KeyAuto4R1() {
+ MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R1);
+ assertEquals("4 key auto 4 R1 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 4 R1 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 4 R1 left", 3, params.mLeftKeys);
+ assertEquals("4 key auto 4 R1 right", 1, params.mRightKeys);
+ assertEquals("4 key auto 4 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 4 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("4 key auto 4 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("4 key auto 4 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("4 key auto 4 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 4 R1 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [3] <1> [2] ___|
+ public void testLayout4KeyAuto4R2() {
+ MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R2);
+ assertEquals("4 key auto 4 R2 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 4 R2 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 4 R2 left", 2, params.mLeftKeys);
+ assertEquals("4 key auto 4 R2 right", 2, params.mRightKeys);
+ assertEquals("4 key auto 4 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 4 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 4 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 4 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("4 key auto 4 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 4 R2 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [3] <1> [2] [4]
+ public void testLayout4KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(4, 5, XPOS_M0);
+ assertEquals("4 key auto 5 M0 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 5 M0 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 5 M0 left", 1, params.mLeftKeys);
+ assertEquals("4 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("4 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("4 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 5 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |<1> [2] [3] [4]
+ public void testLayout4KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L0);
+ assertEquals("4 key auto 5 L0 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 5 L0 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("4 key auto 5 L0 right", 4, params.mRightKeys);
+ assertEquals("4 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("4 key auto 5 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("4 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ <1> [2] [3] [4]
+ public void testLayout4KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L1);
+ assertEquals("4 key auto 5 L1 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 5 L1 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("4 key auto 5 L1 right", 4, params.mRightKeys);
+ assertEquals("4 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("4 key auto 5 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("4 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [3] <1> [2] [4]
+ public void testLayout4KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L2);
+ assertEquals("4 key auto 5 L2 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 5 L2 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("4 key auto 5 L2 right", 3, params.mRightKeys);
+ assertEquals("4 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 5 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("4 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [3] [2] <1>|
+ public void testLayout4KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R0);
+ assertEquals("4 key auto 5 R0 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 5 R0 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 5 R0 left", 3, params.mLeftKeys);
+ assertEquals("4 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("4 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("4 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("4 key auto 5 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("4 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 5 R0 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [3] [2] <1> ___|
+ public void testLayout4KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R1);
+ assertEquals("4 key auto 5 R1 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 5 R1 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 5 R1 left", 3, params.mLeftKeys);
+ assertEquals("4 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("4 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("4 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("4 key auto 5 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("4 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 5 R1 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [3] <1> [2] ___|
+ public void testLayout4KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R2);
+ assertEquals("4 key auto 5 R2 columns", 4, params.mNumColumns);
+ assertEquals("4 key auto 5 R2 rows", 1, params.mNumRows);
+ assertEquals("4 key auto 5 R2 left", 2, params.mLeftKeys);
+ assertEquals("4 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("4 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("4 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("4 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("4 key auto 5 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("4 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("4 key auto 5 R2 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [5]
+ // [3] <1> [2]
+ public void testLayout5KeyAuto3M0() {
+ MoreKeysKeyboardParams params = createParams(5, 3, XPOS_M0);
+ assertEquals("5 key auto 3 M0 columns", 3, params.mNumColumns);
+ assertEquals("5 key auto 3 M0 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 3 M0 left", 1, params.mLeftKeys);
+ assertEquals("5 key auto 3 M0 right", 2, params.mRightKeys);
+ assertEquals("5 key auto 3 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 3 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 3 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 3 M0 [4]", 0, params.getColumnPos(3));
+ assertEquals("5 key auto 3 M0 [5]", 1, params.getColumnPos(4));
+ assertEquals("5 key auto 3 M0 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("5 key auto 3 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |[4] [5]
+ // |<1> [2] [3]
+ public void testLayout5KeyAuto3L0() {
+ MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L0);
+ assertEquals("5 key auto 3 L0 columns", 3, params.mNumColumns);
+ assertEquals("5 key auto 3 L0 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 3 L0 left", 0, params.mLeftKeys);
+ assertEquals("5 key auto 3 L0 right", 3, params.mRightKeys);
+ assertEquals("5 key auto 3 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 3 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 3 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("5 key auto 3 L0 [4]", 0, params.getColumnPos(3));
+ assertEquals("5 key auto 3 L0 [5]", 1, params.getColumnPos(4));
+ assertEquals("5 key auto 3 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 3 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [4] [5]
+ // |___ <1> [2] [3]
+ public void testLayout5KeyAuto3L1() {
+ MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L1);
+ assertEquals("5 key auto 3 L1 columns", 3, params.mNumColumns);
+ assertEquals("5 key auto 3 L1 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 3 L1 left", 0, params.mLeftKeys);
+ assertEquals("5 key auto 3 L1 right", 3, params.mRightKeys);
+ assertEquals("5 key auto 3 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 3 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 3 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("5 key auto 3 L1 [4]", 0, params.getColumnPos(3));
+ assertEquals("5 key auto 3 L1 [5]", 1, params.getColumnPos(4));
+ assertEquals("5 key auto 3 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 3 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [4] [5]
+ // |___ [3] <1> [2]
+ public void testLayout5KeyAuto3L2() {
+ MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L2);
+ assertEquals("5 key auto 3 L2 columns", 3, params.mNumColumns);
+ assertEquals("5 key auto 3 L2 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 3 L2 left", 1, params.mLeftKeys);
+ assertEquals("5 key auto 3 L2 right", 2, params.mRightKeys);
+ assertEquals("5 key auto 3 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 3 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 3 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 3 L2 [4]", 0, params.getColumnPos(3));
+ assertEquals("5 key auto 3 L2 [5]", 1, params.getColumnPos(4));
+ assertEquals("5 key auto 3 L2 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("5 key auto 3 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [4]|
+ // [3] [2] <1>|
+ public void testLayout5KeyAuto3R0() {
+ MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R0);
+ assertEquals("5 key auto 3 R0 columns", 3, params.mNumColumns);
+ assertEquals("5 key auto 3 R0 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 3 R0 left", 2, params.mLeftKeys);
+ assertEquals("5 key auto 3 R0 right", 1, params.mRightKeys);
+ assertEquals("5 key auto 3 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 3 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("5 key auto 3 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("5 key auto 3 R0 [4]", 0, params.getColumnPos(3));
+ assertEquals("5 key auto 3 R0 [5]", -1, params.getColumnPos(4));
+ assertEquals("5 key auto 3 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 3 R0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [4] ___|
+ // [3] [2] <1> ___|
+ public void testLayout5KeyAuto3R1() {
+ MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R1);
+ assertEquals("5 key auto 3 R1 columns", 3, params.mNumColumns);
+ assertEquals("5 key auto 3 R1 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 3 R1 left", 2, params.mLeftKeys);
+ assertEquals("5 key auto 3 R1 right", 1, params.mRightKeys);
+ assertEquals("5 key auto 3 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 3 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("5 key auto 3 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("5 key auto 3 R1 [4]", 0, params.getColumnPos(3));
+ assertEquals("5 key auto 3 R1 [5]", -1, params.getColumnPos(4));
+ assertEquals("5 key auto 3 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 3 R1 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [4] [5] ___|
+ // [3] <1> [2] ___|
+ public void testLayout5KeyAuto3R2() {
+ MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R2);
+ assertEquals("5 key auto 3 R2 columns", 3, params.mNumColumns);
+ assertEquals("5 key auto 3 R2 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 3 R2 left", 1, params.mLeftKeys);
+ assertEquals("5 key auto 3 R2 right", 2, params.mRightKeys);
+ assertEquals("5 key auto 3 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 3 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 3 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 3 R2 [4]", 0, params.getColumnPos(3));
+ assertEquals("5 key auto 3 R2 [5]", 1, params.getColumnPos(4));
+ assertEquals("5 key auto 3 R2 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("5 key auto 3 R2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [5]
+ // [3] <1> [2] [4]
+ public void testLayout5KeyAuto4M0() {
+ MoreKeysKeyboardParams params = createParams(5, 4, XPOS_M0);
+ assertEquals("5 key auto 4 M0 columns", 4, params.mNumColumns);
+ assertEquals("5 key auto 4 M0 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 4 M0 left", 1, params.mLeftKeys);
+ assertEquals("5 key auto 4 M0 right", 3, params.mRightKeys);
+ assertEquals("5 key auto 4 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 4 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 4 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 4 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("5 key auto 4 M0 [5]", 0, params.getColumnPos(4));
+ assertEquals("5 key auto 4 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 4 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |[5]
+ // |<1> [2] [3] [4]
+ public void testLayout5KeyAuto4L0() {
+ MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L0);
+ assertEquals("5 key auto 4 L0 columns", 4, params.mNumColumns);
+ assertEquals("5 key auto 4 L0 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 4 L0 left", 0, params.mLeftKeys);
+ assertEquals("5 key auto 4 L0 right", 4, params.mRightKeys);
+ assertEquals("5 key auto 4 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 4 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 4 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("5 key auto 4 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("5 key auto 4 L0 [5]", 0, params.getColumnPos(4));
+ assertEquals("5 key auto 4 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 4 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [5]
+ // |___ <1> [2] [3] [4]
+ public void testLayout5KeyAuto4L1() {
+ MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L1);
+ assertEquals("5 key auto 4 L1 columns", 4, params.mNumColumns);
+ assertEquals("5 key auto 4 L1 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 4 L1 left", 0, params.mLeftKeys);
+ assertEquals("5 key auto 4 L1 right", 4, params.mRightKeys);
+ assertEquals("5 key auto 4 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 4 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 4 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("5 key auto 4 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("5 key auto 4 L1 [5]", 0, params.getColumnPos(4));
+ assertEquals("5 key auto 4 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 4 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [5]
+ // |___ [3] <1> [2] [4]
+ public void testLayout5KeyAuto4L2() {
+ MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L2);
+ assertEquals("5 key auto 4 L2 columns", 4, params.mNumColumns);
+ assertEquals("5 key auto 4 L2 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 4 L2 left", 1, params.mLeftKeys);
+ assertEquals("5 key auto 4 L2 right", 3, params.mRightKeys);
+ assertEquals("5 key auto 4 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 4 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 4 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 4 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("5 key auto 4 L2 [5]", 0, params.getColumnPos(4));
+ assertEquals("5 key auto 4 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 4 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [5]|
+ // [4] [3] [2] <1>|
+ public void testLayout5KeyAuto4R0() {
+ MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R0);
+ assertEquals("5 key auto 4 R0 columns", 4, params.mNumColumns);
+ assertEquals("5 key auto 4 R0 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 4 R0 left", 3, params.mLeftKeys);
+ assertEquals("5 key auto 4 R0 right", 1, params.mRightKeys);
+ assertEquals("5 key auto 4 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 4 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("5 key auto 4 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("5 key auto 4 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("5 key auto 4 R0 [5]", 0, params.getColumnPos(4));
+ assertEquals("5 key auto 4 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 4 R0 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [5] ___|
+ // [4] [3] [2] <1> ___|
+ public void testLayout5KeyAuto4R1() {
+ MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R1);
+ assertEquals("5 key auto 4 R1 columns", 4, params.mNumColumns);
+ assertEquals("5 key auto 4 R1 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 4 R1 left", 3, params.mLeftKeys);
+ assertEquals("5 key auto 4 R1 right", 1, params.mRightKeys);
+ assertEquals("5 key auto 4 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 4 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("5 key auto 4 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("5 key auto 4 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("5 key auto 4 R1 [5]", 0, params.getColumnPos(4));
+ assertEquals("5 key auto 4 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 4 R1 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [5] ___|
+ // [4] [3] <1> [2] ___|
+ public void testLayout5KeyAuto4R2() {
+ MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R2);
+ assertEquals("5 key auto 4 R2 columns", 4, params.mNumColumns);
+ assertEquals("5 key auto 4 R2 rows", 2, params.mNumRows);
+ assertEquals("5 key auto 4 R2 left", 2, params.mLeftKeys);
+ assertEquals("5 key auto 4 R2 right", 2, params.mRightKeys);
+ assertEquals("5 key auto 4 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 4 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 4 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 4 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("5 key auto 4 R2 [5]", 0, params.getColumnPos(4));
+ assertEquals("5 key auto 4 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 4 R2 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [3] <1> [2] [4]
+ public void testLayout5KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(5, 5, XPOS_M0);
+ assertEquals("5 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("5 key auto 5 M0 rows", 1, params.mNumRows);
+ assertEquals("5 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("5 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("5 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("5 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("5 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // |<1> [2] [3] [4] [5]
+ public void testLayout5KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L0);
+ assertEquals("5 key auto 5 L0 columns", 5, params.mNumColumns);
+ assertEquals("5 key auto 5 L0 rows", 1, params.mNumRows);
+ assertEquals("5 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("5 key auto 5 L0 right", 5, params.mRightKeys);
+ assertEquals("5 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("5 key auto 5 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("5 key auto 5 L0 [5]", 4, params.getColumnPos(4));
+ assertEquals("5 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ <1> [2] [3] [4] [5]
+ public void testLayout5KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L1);
+ assertEquals("5 key auto 5 L1 columns", 5, params.mNumColumns);
+ assertEquals("5 key auto 5 L1 rows", 1, params.mNumRows);
+ assertEquals("5 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("5 key auto 5 L1 right", 5, params.mRightKeys);
+ assertEquals("5 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("5 key auto 5 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("5 key auto 5 L1 [5]", 4, params.getColumnPos(4));
+ assertEquals("5 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [3] <1> [2] [4] [5]
+ public void testLayout5KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L2);
+ assertEquals("5 key auto 5 L2 columns", 5, params.mNumColumns);
+ assertEquals("5 key auto 5 L2 rows", 1, params.mNumRows);
+ assertEquals("5 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("5 key auto 5 L2 right", 4, params.mRightKeys);
+ assertEquals("5 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 5 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("5 key auto 5 L2 [5]", 3, params.getColumnPos(4));
+ assertEquals("5 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [4] [3] [2] <1>|
+ public void testLayout5KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R0);
+ assertEquals("5 key auto 5 R0 columns", 5, params.mNumColumns);
+ assertEquals("5 key auto 5 R0 rows", 1, params.mNumRows);
+ assertEquals("5 key auto 5 R0 left", 4, params.mLeftKeys);
+ assertEquals("5 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("5 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("5 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("5 key auto 5 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("5 key auto 5 R0 [5]", -4, params.getColumnPos(4));
+ assertEquals("5 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 5 R0 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [4] [3] [2] <1> ___|
+ public void testLayout5KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R1);
+ assertEquals("5 key auto 5 R1 columns", 5, params.mNumColumns);
+ assertEquals("5 key auto 5 R1 rows", 1, params.mNumRows);
+ assertEquals("5 key auto 5 R1 left", 4, params.mLeftKeys);
+ assertEquals("5 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("5 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("5 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("5 key auto 5 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("5 key auto 5 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("5 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 5 R1 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [4] [3] <1> [2] ___|
+ public void testLayout5KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R2);
+ assertEquals("5 key auto 5 R2 columns", 5, params.mNumColumns);
+ assertEquals("5 key auto 5 R2 rows", 1, params.mNumRows);
+ assertEquals("5 key auto 5 R2 left", 3, params.mLeftKeys);
+ assertEquals("5 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("5 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("5 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("5 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("5 key auto 5 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("5 key auto 5 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("5 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("5 key auto 5 R2 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [6]
+ // [3] <1> [2] [4]
+ public void testLayout6KeyAuto4M0() {
+ MoreKeysKeyboardParams params = createParams(6, 4, XPOS_M0);
+ assertEquals("6 key auto 4 M0 columns", 4, params.mNumColumns);
+ assertEquals("6 key auto 4 M0 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 4 M0 left", 1, params.mLeftKeys);
+ assertEquals("6 key auto 4 M0 right", 3, params.mRightKeys);
+ assertEquals("6 key auto 4 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 4 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 4 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("6 key auto 4 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("6 key auto 4 M0 [5]", 0, params.getColumnPos(4));
+ assertEquals("6 key auto 4 M0 [6]", 1, params.getColumnPos(5));
+ assertEquals("6 key auto 4 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 4 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |[5] [6]
+ // |<1> [2] [3] [4]
+ public void testLayout6KeyAuto4L0() {
+ MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L0);
+ assertEquals("6 key auto 4 L0 columns", 4, params.mNumColumns);
+ assertEquals("6 key auto 4 L0 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 4 L0 left", 0, params.mLeftKeys);
+ assertEquals("6 key auto 4 L0 right", 4, params.mRightKeys);
+ assertEquals("6 key auto 4 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 4 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 4 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("6 key auto 4 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("6 key auto 4 L0 [5]", 0, params.getColumnPos(4));
+ assertEquals("6 key auto 4 L0 [6]", 1, params.getColumnPos(5));
+ assertEquals("6 key auto 4 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 4 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [5] [6]
+ // |___ <1> [2] [3] [4]
+ public void testLayout6KeyAuto4L1() {
+ MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L1);
+ assertEquals("6 key auto 4 L1 columns", 4, params.mNumColumns);
+ assertEquals("6 key auto 4 L1 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 4 L1 left", 0, params.mLeftKeys);
+ assertEquals("6 key auto 4 L1 right", 4, params.mRightKeys);
+ assertEquals("6 key auto 4 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 4 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 4 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("6 key auto 4 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("6 key auto 4 L1 [5]", 0, params.getColumnPos(4));
+ assertEquals("6 key auto 4 L1 [6]", 1, params.getColumnPos(5));
+ assertEquals("6 key auto 4 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 4 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [5] [6]
+ // |___ [3] <1> [2] [4]
+ public void testLayout6KeyAuto4L2() {
+ MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L2);
+ assertEquals("6 key auto 4 L2 columns", 4, params.mNumColumns);
+ assertEquals("6 key auto 4 L2 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 4 L2 left", 1, params.mLeftKeys);
+ assertEquals("6 key auto 4 L2 right", 3, params.mRightKeys);
+ assertEquals("6 key auto 4 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 4 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 4 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("6 key auto 4 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("6 key auto 4 L2 [5]", 0, params.getColumnPos(4));
+ assertEquals("6 key auto 4 L2 [6]", 1, params.getColumnPos(5));
+ assertEquals("6 key auto 4 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 4 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [6] [5]|
+ // [4] [3] [2] <1>|
+ public void testLayout6KeyAuto4R0() {
+ MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R0);
+ assertEquals("6 key auto 4 R0 columns", 4, params.mNumColumns);
+ assertEquals("6 key auto 4 R0 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 4 R0 left", 3, params.mLeftKeys);
+ assertEquals("6 key auto 4 R0 right", 1, params.mRightKeys);
+ assertEquals("6 key auto 4 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 4 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("6 key auto 4 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("6 key auto 4 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("6 key auto 4 R0 [5]", 0, params.getColumnPos(4));
+ assertEquals("6 key auto 4 R0 [6]", -1, params.getColumnPos(5));
+ assertEquals("6 key auto 4 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 4 R0 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [6] [5] ___|
+ // [4] [3] [2] <1> ___|
+ public void testLayout6KeyAuto4R1() {
+ MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R1);
+ assertEquals("6 key auto 4 R1 columns", 4, params.mNumColumns);
+ assertEquals("6 key auto 4 R1 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 4 R1 left", 3, params.mLeftKeys);
+ assertEquals("6 key auto 4 R1 right", 1, params.mRightKeys);
+ assertEquals("6 key auto 4 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 4 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("6 key auto 4 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("6 key auto 4 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("6 key auto 4 R1 [5]", 0, params.getColumnPos(4));
+ assertEquals("6 key auto 4 R1 [6]", -1, params.getColumnPos(5));
+ assertEquals("6 key auto 4 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 4 R1 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [5] [6] ___|
+ // [4] [3] <1> [2] ___|
+ public void testLayout6KeyAuto4R2() {
+ MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R2);
+ assertEquals("6 key auto 4 R2 columns", 4, params.mNumColumns);
+ assertEquals("6 key auto 4 R2 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 4 R2 left", 2, params.mLeftKeys);
+ assertEquals("6 key auto 4 R2 right", 2, params.mRightKeys);
+ assertEquals("6 key auto 4 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 4 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 4 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("6 key auto 4 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("6 key auto 4 R2 [5]", 0, params.getColumnPos(4));
+ assertEquals("6 key auto 4 R2 [6]", 1, params.getColumnPos(5));
+ assertEquals("6 key auto 4 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 4 R2 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [6]
+ // [5] [3] <1> [2] [4]
+ public void testLayout6KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(6, 5, XPOS_M0);
+ assertEquals("6 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("6 key auto 5 M0 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("6 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("6 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("6 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("6 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("6 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("6 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // |[6]
+ // |<1> [2] [3] [4] [5]
+ public void testLayout6KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L0);
+ assertEquals("6 key auto 5 L0 columns", 5, params.mNumColumns);
+ assertEquals("6 key auto 5 L0 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("6 key auto 5 L0 right", 5, params.mRightKeys);
+ assertEquals("6 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("6 key auto 5 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("6 key auto 5 L0 [5]", 4, params.getColumnPos(4));
+ assertEquals("6 key auto 5 L0 [6]", 0, params.getColumnPos(5));
+ assertEquals("6 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6]
+ // |___ <1> [2] [3] [4] [5]
+ public void testLayout6KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L1);
+ assertEquals("6 key auto 5 L1 columns", 5, params.mNumColumns);
+ assertEquals("6 key auto 5 L1 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("6 key auto 5 L1 right", 5, params.mRightKeys);
+ assertEquals("6 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("6 key auto 5 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("6 key auto 5 L1 [5]", 4, params.getColumnPos(4));
+ assertEquals("6 key auto 5 L1 [6]", 0, params.getColumnPos(5));
+ assertEquals("6 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6]
+ // |___ [3] <1> [2] [4] [5]
+ public void testLayout6KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L2);
+ assertEquals("6 key auto 5 L2 columns", 5, params.mNumColumns);
+ assertEquals("6 key auto 5 L2 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("6 key auto 5 L2 right", 4, params.mRightKeys);
+ assertEquals("6 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("6 key auto 5 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("6 key auto 5 L2 [5]", 3, params.getColumnPos(4));
+ assertEquals("6 key auto 5 L2 [6]", 0, params.getColumnPos(5));
+ assertEquals("6 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [6]|
+ // [5] [4] [3] [2] <1>|
+ public void testLayout6KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R0);
+ assertEquals("6 key auto 5 R0 columns", 5, params.mNumColumns);
+ assertEquals("6 key auto 5 R0 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 5 R0 left", 4, params.mLeftKeys);
+ assertEquals("6 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("6 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("6 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("6 key auto 5 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("6 key auto 5 R0 [5]", -4, params.getColumnPos(4));
+ assertEquals("6 key auto 5 R0 [6]", 0, params.getColumnPos(5));
+ assertEquals("6 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 5 R0 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [6] ___|
+ // [5] [4] [3] [2] <1> ___|
+ public void testLayout6KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R1);
+ assertEquals("6 key auto 5 R1 columns", 5, params.mNumColumns);
+ assertEquals("6 key auto 5 R1 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 5 R1 left", 4, params.mLeftKeys);
+ assertEquals("6 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("6 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("6 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("6 key auto 5 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("6 key auto 5 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("6 key auto 5 R1 [6]", 0, params.getColumnPos(5));
+ assertEquals("6 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 5 R1 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [6] ___|
+ // [5] [4] [3] <1> [2] ___|
+ public void testLayout6KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R2);
+ assertEquals("6 key auto 5 R2 columns", 5, params.mNumColumns);
+ assertEquals("6 key auto 5 R2 rows", 2, params.mNumRows);
+ assertEquals("6 key auto 5 R2 left", 3, params.mLeftKeys);
+ assertEquals("6 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("6 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("6 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("6 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("6 key auto 5 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("6 key auto 5 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("6 key auto 5 R2 [6]", 0, params.getColumnPos(5));
+ assertEquals("6 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("6 key auto 5 R2 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // |<1> [2] [3] [4] [5] [6] [7] ___ ___ ___|
+ public void testLayout7KeyAuto7L0() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L0);
+ assertEquals("7 key auto 7 L0 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 L0 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 L0 left", 0, params.mLeftKeys);
+ assertEquals("7 key auto 7 L0 right", 7, params.mRightKeys);
+ assertEquals("7 key auto 7 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("7 key auto 7 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("7 key auto 7 L0 [5]", 4, params.getColumnPos(4));
+ assertEquals("7 key auto 7 L0 [6]", 5, params.getColumnPos(5));
+ assertEquals("7 key auto 7 L0 [7]", 6, params.getColumnPos(6));
+ assertEquals("7 key auto 7 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ <1> [2] [3] [4] [5] [6] [7] ___ ___|
+ public void testLayout7KeyAuto7L1() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L1);
+ assertEquals("7 key auto 7 L1 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 L1 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 L1 left", 0, params.mLeftKeys);
+ assertEquals("7 key auto 7 L1 right", 7, params.mRightKeys);
+ assertEquals("7 key auto 7 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("7 key auto 7 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("7 key auto 7 L1 [5]", 4, params.getColumnPos(4));
+ assertEquals("7 key auto 7 L1 [6]", 5, params.getColumnPos(5));
+ assertEquals("7 key auto 7 L1 [7]", 6, params.getColumnPos(6));
+ assertEquals("7 key auto 7 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [3] <1> [2] [4] [5] [6] [7] ___ ___|
+ public void testLayout7KeyAuto7L2() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L2);
+ assertEquals("7 key auto 7 L2 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 L2 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 L2 left", 1, params.mLeftKeys);
+ assertEquals("7 key auto 7 L2 right", 6, params.mRightKeys);
+ assertEquals("7 key auto 7 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 7 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("7 key auto 7 L2 [5]", 3, params.getColumnPos(4));
+ assertEquals("7 key auto 7 L2 [6]", 4, params.getColumnPos(5));
+ assertEquals("7 key auto 7 L2 [7]", 5, params.getColumnPos(6));
+ assertEquals("7 key auto 7 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [5] [3] <1> [2] [4] [6] [7] ___ ___|
+ public void testLayout7KeyAuto7L3() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L3);
+ assertEquals("7 key auto 7 L3 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 L3 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 L3 left", 2, params.mLeftKeys);
+ assertEquals("7 key auto 7 L3 right", 5, params.mRightKeys);
+ assertEquals("7 key auto 7 L3 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 L3 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 L3 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 7 L3 [4]", 2, params.getColumnPos(3));
+ assertEquals("7 key auto 7 L3 [5]", -2, params.getColumnPos(4));
+ assertEquals("7 key auto 7 L3 [6]", 3, params.getColumnPos(5));
+ assertEquals("7 key auto 7 L3 [7]", 4, params.getColumnPos(6));
+ assertEquals("7 key auto 7 L3 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 L3 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [7] [5] [3] <1> [2] [4] [6] ___ ___|
+ public void testLayout7KeyAuto7M0() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M0);
+ assertEquals("7 key auto 7 M0 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 M0 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 M0 left", 3, params.mLeftKeys);
+ assertEquals("7 key auto 7 M0 right", 4, params.mRightKeys);
+ assertEquals("7 key auto 7 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 7 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("7 key auto 7 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("7 key auto 7 M0 [6]", 3, params.getColumnPos(5));
+ assertEquals("7 key auto 7 M0 [7]", -3, params.getColumnPos(6));
+ assertEquals("7 key auto 7 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 M0 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ [7] [5] [3] <1> [2] [4] [6] ___|
+ public void testLayout7KeyAuto7M1() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M1);
+ assertEquals("7 key auto 7 M1 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 M1 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 M1 left", 3, params.mLeftKeys);
+ assertEquals("7 key auto 7 M1 right", 4, params.mRightKeys);
+ assertEquals("7 key auto 7 M1 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 M1 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 M1 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 7 M1 [4]", 2, params.getColumnPos(3));
+ assertEquals("7 key auto 7 M1 [5]", -2, params.getColumnPos(4));
+ assertEquals("7 key auto 7 M1 [6]", 3, params.getColumnPos(5));
+ assertEquals("7 key auto 7 M1 [7]", -3, params.getColumnPos(6));
+ assertEquals("7 key auto 7 M1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 M1 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ [7] [6] [5] [3] <1> [2] [4] ___|
+ public void testLayout7KeyAuto7R3() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R3);
+ assertEquals("7 key auto 7 R3 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 R3 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 R3 left", 4, params.mLeftKeys);
+ assertEquals("7 key auto 7 R3 right", 3, params.mRightKeys);
+ assertEquals("7 key auto 7 R3 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 R3 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 R3 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 7 R3 [4]", 2, params.getColumnPos(3));
+ assertEquals("7 key auto 7 R3 [5]", -2, params.getColumnPos(4));
+ assertEquals("7 key auto 7 R3 [6]", -3, params.getColumnPos(5));
+ assertEquals("7 key auto 7 R3 [7]", -4, params.getColumnPos(6));
+ assertEquals("7 key auto 7 R3 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 R3 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ [7] [6] [5] [4] [3] <1> [2] ___|
+ public void testLayout7KeyAuto7R2() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R2);
+ assertEquals("7 key auto 7 R2 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 R2 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 R2 left", 5, params.mLeftKeys);
+ assertEquals("7 key auto 7 R2 right", 2, params.mRightKeys);
+ assertEquals("7 key auto 7 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 7 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("7 key auto 7 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("7 key auto 7 R2 [6]", -4, params.getColumnPos(5));
+ assertEquals("7 key auto 7 R2 [7]", -5, params.getColumnPos(6));
+ assertEquals("7 key auto 7 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 R2 default", WIDTH * 5, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ [7] [6] [5] [4] [3] [2] <1> ___|
+ public void testLayout7KeyAuto7R1() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R1);
+ assertEquals("7 key auto 7 R1 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 R1 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 R1 left", 6, params.mLeftKeys);
+ assertEquals("7 key auto 7 R1 right", 1, params.mRightKeys);
+ assertEquals("7 key auto 7 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("7 key auto 7 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("7 key auto 7 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("7 key auto 7 R1 [6]", -5, params.getColumnPos(5));
+ assertEquals("7 key auto 7 R1 [7]", -6, params.getColumnPos(6));
+ assertEquals("7 key auto 7 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 R1 default", WIDTH * 6, params.getDefaultKeyCoordX());
+ }
+
+ // |___ ___ [7] [6] [5] [4] [3] [2] <1>|
+ public void testLayout7KeyAuto7R0() {
+ MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R0);
+ assertEquals("7 key auto 7 R0 columns", 7, params.mNumColumns);
+ assertEquals("7 key auto 7 R0 rows", 1, params.mNumRows);
+ assertEquals("7 key auto 7 R0 left", 6, params.mLeftKeys);
+ assertEquals("7 key auto 7 R0 right", 1, params.mRightKeys);
+ assertEquals("7 key auto 7 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 7 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("7 key auto 7 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("7 key auto 7 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("7 key auto 7 R0 [5]", -4, params.getColumnPos(4));
+ assertEquals("7 key auto 7 R0 [6]", -5, params.getColumnPos(5));
+ assertEquals("7 key auto 7 R0 [7]", -6, params.getColumnPos(6));
+ assertEquals("7 key auto 7 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 7 R0 default", WIDTH * 6, params.getDefaultKeyCoordX());
+ }
+
+ // [6] [7]
+ // [5] [3] <1> [2] [4]
+ public void testLayout7KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(7, 5, XPOS_M0);
+ assertEquals("7 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("7 key auto 5 M0 rows", 2, params.mNumRows);
+ assertEquals("7 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("7 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("7 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("7 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("7 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("7 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("7 key auto 5 M0 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("7 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // |[6] [7]
+ // |<1> [2] [3] [4] [5]
+ public void testLayout7KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L0);
+ assertEquals("7 key auto 5 L0 columns", 5, params.mNumColumns);
+ assertEquals("7 key auto 5 L0 rows", 2, params.mNumRows);
+ assertEquals("7 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("7 key auto 5 L0 right", 5, params.mRightKeys);
+ assertEquals("7 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("7 key auto 5 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("7 key auto 5 L0 [5]", 4, params.getColumnPos(4));
+ assertEquals("7 key auto 5 L0 [6]", 0, params.getColumnPos(5));
+ assertEquals("7 key auto 5 L0 [7]", 1, params.getColumnPos(6));
+ assertEquals("7 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6] [7]
+ // |___ <1> [2] [3] [4] [5]
+ public void testLayout7KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L1);
+ assertEquals("7 key auto 5 L1 columns", 5, params.mNumColumns);
+ assertEquals("7 key auto 5 L1 rows", 2, params.mNumRows);
+ assertEquals("7 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("7 key auto 5 L1 right", 5, params.mRightKeys);
+ assertEquals("7 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("7 key auto 5 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("7 key auto 5 L1 [5]", 4, params.getColumnPos(4));
+ assertEquals("7 key auto 5 L1 [6]", 0, params.getColumnPos(5));
+ assertEquals("7 key auto 5 L1 [7]", 1, params.getColumnPos(6));
+ assertEquals("7 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6] [7]
+ // |___ [3] <1> [2] [4] [5]
+ public void testLayout7KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L2);
+ assertEquals("7 key auto 5 L2 columns", 5, params.mNumColumns);
+ assertEquals("7 key auto 5 L2 rows", 2, params.mNumRows);
+ assertEquals("7 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("7 key auto 5 L2 right", 4, params.mRightKeys);
+ assertEquals("7 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 5 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("7 key auto 5 L2 [5]", 3, params.getColumnPos(4));
+ assertEquals("7 key auto 5 L2 [6]", 0, params.getColumnPos(5));
+ assertEquals("7 key auto 5 L2 [7]", 1, params.getColumnPos(6));
+ assertEquals("7 key auto 5 L2 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("7 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [7] [6]|
+ // [5] [4] [3] [2] <1>|
+ public void testLayout7KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R0);
+ assertEquals("7 key auto 5 R0 columns", 5, params.mNumColumns);
+ assertEquals("7 key auto 5 R0 rows", 2, params.mNumRows);
+ assertEquals("7 key auto 5 R0 left", 4, params.mLeftKeys);
+ assertEquals("7 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("7 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("7 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("7 key auto 5 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("7 key auto 5 R0 [5]", -4, params.getColumnPos(4));
+ assertEquals("7 key auto 5 R0 [6]", 0, params.getColumnPos(5));
+ assertEquals("7 key auto 5 R0 [7]", -1, params.getColumnPos(6));
+ assertEquals("7 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 5 R0 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [7] [6] ___|
+ // [5] [4] [3] [2] <1> ___|
+ public void testLayout7KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R1);
+ assertEquals("7 key auto 5 R1 columns", 5, params.mNumColumns);
+ assertEquals("7 key auto 5 R1 rows", 2, params.mNumRows);
+ assertEquals("7 key auto 5 R1 left", 4, params.mLeftKeys);
+ assertEquals("7 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("7 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("7 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("7 key auto 5 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("7 key auto 5 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("7 key auto 5 R1 [6]", 0, params.getColumnPos(5));
+ assertEquals("7 key auto 5 R1 [7]", -1, params.getColumnPos(6));
+ assertEquals("7 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 5 R1 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [6] [7] ___|
+ // [5] [4] [3] <1> [2] ___|
+ public void testLayout7KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R2);
+ assertEquals("7 key auto 5 R2 columns", 5, params.mNumColumns);
+ assertEquals("7 key auto 5 R2 rows", 2, params.mNumRows);
+ assertEquals("7 key auto 5 R2 left", 3, params.mLeftKeys);
+ assertEquals("7 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("7 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 5 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("7 key auto 5 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("7 key auto 5 R2 [6]", 0, params.getColumnPos(5));
+ assertEquals("7 key auto 5 R2 [7]", 1, params.getColumnPos(6));
+ assertEquals("7 key auto 5 R2 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("7 key auto 5 R2 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [7]
+ // [6] [4] [5]
+ // [3] <1> [2]
+ public void testLayout7KeyAuto3M0() {
+ MoreKeysKeyboardParams params = createParams(7, 3, XPOS_M0);
+ assertEquals("7 key auto 3 M0 columns", 3, params.mNumColumns);
+ assertEquals("7 key auto 3 M0 rows", 3, params.mNumRows);
+ assertEquals("7 key auto 3 M0 left", 1, params.mLeftKeys);
+ assertEquals("7 key auto 3 M0 right", 2, params.mRightKeys);
+ assertEquals("7 key auto 3 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 3 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 3 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 3 M0 [4]", 0, params.getColumnPos(3));
+ assertEquals("7 key auto 3 M0 [5]", 1, params.getColumnPos(4));
+ assertEquals("7 key auto 3 M0 [6]", -1, params.getColumnPos(5));
+ assertEquals("7 key auto 3 M0 [7]", 0, params.getColumnPos(6));
+ assertEquals("7 key auto 3 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 3 M0 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // |[7]
+ // |[4] [5] [6]
+ // |<1> [2] [3]
+ public void testLayout7KeyAuto3L0() {
+ MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L0);
+ assertEquals("7 key auto 3 L0 columns", 3, params.mNumColumns);
+ assertEquals("7 key auto 3 L0 rows", 3, params.mNumRows);
+ assertEquals("7 key auto 3 L0 left", 0, params.mLeftKeys);
+ assertEquals("7 key auto 3 L0 right", 3, params.mRightKeys);
+ assertEquals("7 key auto 3 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 3 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 3 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("7 key auto 3 L0 [4]", 0, params.getColumnPos(3));
+ assertEquals("7 key auto 3 L0 [5]", 1, params.getColumnPos(4));
+ assertEquals("7 key auto 3 L0 [6]", 2, params.getColumnPos(5));
+ assertEquals("7 key auto 3 L0 [7]", 0, params.getColumnPos(6));
+ assertEquals("7 key auto 3 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 3 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [7]
+ // |___ [4] [5] [6]
+ // |___ <1> [2] [3]
+ public void testLayout7KeyAuto3L1() {
+ MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L1);
+ assertEquals("7 key auto 3 L1 columns", 3, params.mNumColumns);
+ assertEquals("7 key auto 3 L1 rows", 3, params.mNumRows);
+ assertEquals("7 key auto 3 L1 left", 0, params.mLeftKeys);
+ assertEquals("7 key auto 3 L1 right", 3, params.mRightKeys);
+ assertEquals("7 key auto 3 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 3 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 3 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("7 key auto 3 L1 [4]", 0, params.getColumnPos(3));
+ assertEquals("7 key auto 3 L1 [5]", 1, params.getColumnPos(4));
+ assertEquals("7 key auto 3 L1 [6]", 2, params.getColumnPos(5));
+ assertEquals("7 key auto 3 L1 [7]", 0, params.getColumnPos(6));
+ assertEquals("7 key auto 3 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 3 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [7]
+ // |___ [6] [4] [5]
+ // |___ [3] <1> [2]
+ public void testLayout7KeyAuto3L2() {
+ MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L2);
+ assertEquals("7 key auto 3 L2 columns", 3, params.mNumColumns);
+ assertEquals("7 key auto 3 L2 rows", 3, params.mNumRows);
+ assertEquals("7 key auto 3 L2 left", 1, params.mLeftKeys);
+ assertEquals("7 key auto 3 L2 right", 2, params.mRightKeys);
+ assertEquals("7 key auto 3 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 3 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 3 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 3 L2 [4]", 0, params.getColumnPos(3));
+ assertEquals("7 key auto 3 L2 [5]", 1, params.getColumnPos(4));
+ assertEquals("7 key auto 3 L2 [6]", -1, params.getColumnPos(5));
+ assertEquals("7 key auto 3 L2 [7]", 0, params.getColumnPos(6));
+ assertEquals("7 key auto 3 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 3 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [7]|
+ // [6] [5] [4]|
+ // [3] [2] <1>|
+ public void testLayout7KeyAuto3R0() {
+ MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R0);
+ assertEquals("7 key auto 3 R0 columns", 3, params.mNumColumns);
+ assertEquals("7 key auto 3 R0 rows", 3, params.mNumRows);
+ assertEquals("7 key auto 3 R0 left", 2, params.mLeftKeys);
+ assertEquals("7 key auto 3 R0 right", 1, params.mRightKeys);
+ assertEquals("7 key auto 3 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 3 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("7 key auto 3 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("7 key auto 3 R0 [4]", 0, params.getColumnPos(3));
+ assertEquals("7 key auto 3 R0 [5]", -1, params.getColumnPos(4));
+ assertEquals("7 key auto 3 R0 [6]", -2, params.getColumnPos(5));
+ assertEquals("7 key auto 3 R0 [7]", 0, params.getColumnPos(6));
+ assertEquals("7 key auto 3 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 3 R0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [7] ___|
+ // [6] [5] [4] ___|
+ // [3] [2] <1> ___|
+ public void testLayout7KeyAuto3R1() {
+ MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R1);
+ assertEquals("7 key auto 3 R1 columns", 3, params.mNumColumns);
+ assertEquals("7 key auto 3 R1 rows", 3, params.mNumRows);
+ assertEquals("7 key auto 3 R1 left", 2, params.mLeftKeys);
+ assertEquals("7 key auto 3 R1 right", 1, params.mRightKeys);
+ assertEquals("7 key auto 3 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 3 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("7 key auto 3 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("7 key auto 3 R1 [4]", 0, params.getColumnPos(3));
+ assertEquals("7 key auto 3 R1 [5]", -1, params.getColumnPos(4));
+ assertEquals("7 key auto 3 R1 [6]", -2, params.getColumnPos(5));
+ assertEquals("7 key auto 3 R1 [7]", 0, params.getColumnPos(6));
+ assertEquals("7 key auto 3 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 3 R1 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [7] ___|
+ // [6] [4] [5] ___|
+ // [3] <1> [2] ___|
+ public void testLayout7KeyAuto3R2() {
+ MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R2);
+ assertEquals("7 key auto 3 R2 columns", 3, params.mNumColumns);
+ assertEquals("7 key auto 3 R2 rows", 3, params.mNumRows);
+ assertEquals("7 key auto 3 R2 left", 1, params.mLeftKeys);
+ assertEquals("7 key auto 3 R2 right", 2, params.mRightKeys);
+ assertEquals("7 key auto 3 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("7 key auto 3 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("7 key auto 3 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("7 key auto 3 R2 [4]", 0, params.getColumnPos(3));
+ assertEquals("7 key auto 3 R2 [5]", 1, params.getColumnPos(4));
+ assertEquals("7 key auto 3 R2 [6]", -1, params.getColumnPos(5));
+ assertEquals("7 key auto 3 R2 [7]", 0, params.getColumnPos(6));
+ assertEquals("7 key auto 3 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("7 key auto 3 R2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [8] [6] [7]
+ // [5] [3] <1> [2] [4]
+ public void testLayout8KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(8, 5, XPOS_M0);
+ assertEquals("8 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("8 key auto 5 M0 rows", 2, params.mNumRows);
+ assertEquals("8 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("8 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("8 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("8 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("8 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("8 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("8 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("8 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("8 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("8 key auto 5 M0 [8]", -1, params.getColumnPos(7));
+ assertEquals("8 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("8 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // |[6] [7] [8]
+ // |<1> [2] [3] [4] [5]
+ public void testLayout8KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L0);
+ assertEquals("8 key auto 5 L0 columns", 5, params.mNumColumns);
+ assertEquals("8 key auto 5 L0 rows", 2, params.mNumRows);
+ assertEquals("8 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("8 key auto 5 L0 right", 5, params.mRightKeys);
+ assertEquals("8 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("8 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("8 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("8 key auto 5 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("8 key auto 5 L0 [5]", 4, params.getColumnPos(4));
+ assertEquals("8 key auto 5 L0 [6]", 0, params.getColumnPos(5));
+ assertEquals("8 key auto 5 L0 [7]", 1, params.getColumnPos(6));
+ assertEquals("8 key auto 5 L0 [8]", 2, params.getColumnPos(7));
+ assertEquals("8 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("8 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6] [7] [8]
+ // |___ <1> [2] [3] [4] [5]
+ public void testLayout8KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L1);
+ assertEquals("8 key auto 5 L1 columns", 5, params.mNumColumns);
+ assertEquals("8 key auto 5 L1 rows", 2, params.mNumRows);
+ assertEquals("8 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("8 key auto 5 L1 right", 5, params.mRightKeys);
+ assertEquals("8 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("8 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("8 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("8 key auto 5 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("8 key auto 5 L1 [5]", 4, params.getColumnPos(4));
+ assertEquals("8 key auto 5 L1 [6]", 0, params.getColumnPos(5));
+ assertEquals("8 key auto 5 L1 [7]", 1, params.getColumnPos(6));
+ assertEquals("8 key auto 5 L1 [8]", 2, params.getColumnPos(7));
+ assertEquals("8 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("8 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [8] [6] [7]
+ // |___ [3] <1> [2] [4] [5]
+ public void testLayout8KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L2);
+ assertEquals("8 key auto 5 L2 columns", 5, params.mNumColumns);
+ assertEquals("8 key auto 5 L2 rows", 2, params.mNumRows);
+ assertEquals("8 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("8 key auto 5 L2 right", 4, params.mRightKeys);
+ assertEquals("8 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("8 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("8 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("8 key auto 5 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("8 key auto 5 L2 [5]", 3, params.getColumnPos(4));
+ assertEquals("8 key auto 5 L2 [6]", 0, params.getColumnPos(5));
+ assertEquals("8 key auto 5 L2 [7]", 1, params.getColumnPos(6));
+ assertEquals("8 key auto 5 L2 [8]", -1, params.getColumnPos(7));
+ assertEquals("8 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("8 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [8] [7] [6]|
+ // [5] [4] [3] [2] <1>|
+ public void testLayout8KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R0);
+ assertEquals("8 key auto 5 R0 columns", 5, params.mNumColumns);
+ assertEquals("8 key auto 5 R0 rows", 2, params.mNumRows);
+ assertEquals("8 key auto 5 R0 left", 4, params.mLeftKeys);
+ assertEquals("8 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("8 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("8 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("8 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("8 key auto 5 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("8 key auto 5 R0 [5]", -4, params.getColumnPos(4));
+ assertEquals("8 key auto 5 R0 [6]", 0, params.getColumnPos(5));
+ assertEquals("8 key auto 5 R0 [7]", -1, params.getColumnPos(6));
+ assertEquals("8 key auto 5 R0 [8]", -2, params.getColumnPos(7));
+ assertEquals("8 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("8 key auto 5 R0 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [8] [7] [6] ___|
+ // [5] [4] [3] [2] <1> ___|
+ public void testLayout8KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R1);
+ assertEquals("8 key auto 5 R1 columns", 5, params.mNumColumns);
+ assertEquals("8 key auto 5 R1 rows", 2, params.mNumRows);
+ assertEquals("8 key auto 5 R1 left", 4, params.mLeftKeys);
+ assertEquals("8 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("8 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("8 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("8 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("8 key auto 5 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("8 key auto 5 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("8 key auto 5 R1 [6]", 0, params.getColumnPos(5));
+ assertEquals("8 key auto 5 R1 [7]", -1, params.getColumnPos(6));
+ assertEquals("8 key auto 5 R1 [8]", -2, params.getColumnPos(7));
+ assertEquals("8 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("8 key auto 5 R1 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [8] [6] [7] ___|
+ // [5] [4] [3] <1> [2] ___|
+ public void testLayout8KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R2);
+ assertEquals("8 key auto 5 R2 columns", 5, params.mNumColumns);
+ assertEquals("8 key auto 5 R2 rows", 2, params.mNumRows);
+ assertEquals("8 key auto 5 R2 left", 3, params.mLeftKeys);
+ assertEquals("8 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("8 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("8 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("8 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("8 key auto 5 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("8 key auto 5 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("8 key auto 5 R2 [6]", 0, params.getColumnPos(5));
+ assertEquals("8 key auto 5 R2 [7]", 1, params.getColumnPos(6));
+ assertEquals("8 key auto 5 R2 [8]", -1, params.getColumnPos(7));
+ assertEquals("8 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("8 key auto 5 R2 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [8] [6] [7] [9]
+ // [5] [3] <1> [2] [4]
+ public void testLayout9KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(9, 5, XPOS_M0);
+ assertEquals("9 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("9 key auto 5 M0 rows", 2, params.mNumRows);
+ assertEquals("9 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("9 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("9 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("9 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("9 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("9 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("9 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("9 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("9 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("9 key auto 5 M0 [8]", -1, params.getColumnPos(7));
+ assertEquals("9 key auto 5 M0 [9]", 2, params.getColumnPos(8));
+ assertEquals("9 key auto 5 M0 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("9 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // |[6] [7] [8] [9]
+ // |<1> [2] [3] [4] [5]
+ public void testLayout9KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L0);
+ assertEquals("9 key auto 5 L0 columns", 5, params.mNumColumns);
+ assertEquals("9 key auto 5 L0 rows", 2, params.mNumRows);
+ assertEquals("9 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("9 key auto 5 L0 right", 5, params.mRightKeys);
+ assertEquals("9 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("9 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("9 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("9 key auto 5 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("9 key auto 5 L0 [5]", 4, params.getColumnPos(4));
+ assertEquals("9 key auto 5 L0 [6]", 0, params.getColumnPos(5));
+ assertEquals("9 key auto 5 L0 [7]", 1, params.getColumnPos(6));
+ assertEquals("9 key auto 5 L0 [8]", 2, params.getColumnPos(7));
+ assertEquals("9 key auto 5 L0 [9]", 3, params.getColumnPos(8));
+ assertEquals("9 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("9 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6] [7] [8] [9]
+ // |___ <1> [2] [3] [4] [5]
+ public void testLayout9KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L1);
+ assertEquals("9 key auto 5 L1 columns", 5, params.mNumColumns);
+ assertEquals("9 key auto 5 L1 rows", 2, params.mNumRows);
+ assertEquals("9 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("9 key auto 5 L1 right", 5, params.mRightKeys);
+ assertEquals("9 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("9 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("9 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("9 key auto 5 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("9 key auto 5 L1 [5]", 4, params.getColumnPos(4));
+ assertEquals("9 key auto 5 L1 [6]", 0, params.getColumnPos(5));
+ assertEquals("9 key auto 5 L1 [7]", 1, params.getColumnPos(6));
+ assertEquals("9 key auto 5 L1 [8]", 2, params.getColumnPos(7));
+ assertEquals("9 key auto 5 L1 [9]", 3, params.getColumnPos(8));
+ assertEquals("9 key auto 5 L1 adjust",0, params.mTopRowAdjustment);
+ assertEquals("9 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6] [7] [8] [9]
+ // |___ [3] <1> [2] [4] [5]
+ public void testLayout9KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L2);
+ assertEquals("9 key auto 5 L2 columns", 5, params.mNumColumns);
+ assertEquals("9 key auto 5 L2 rows", 2, params.mNumRows);
+ assertEquals("9 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("9 key auto 5 L2 right", 4, params.mRightKeys);
+ assertEquals("9 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("9 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("9 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("9 key auto 5 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("9 key auto 5 L2 [5]", 3, params.getColumnPos(4));
+ assertEquals("9 key auto 5 L2 [6]", 0, params.getColumnPos(5));
+ assertEquals("9 key auto 5 L2 [7]", 1, params.getColumnPos(6));
+ assertEquals("9 key auto 5 L2 [8]", 2, params.getColumnPos(7));
+ assertEquals("9 key auto 5 L2 [9]", 3, params.getColumnPos(8));
+ assertEquals("9 key auto 5 L2 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("9 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [9] [8] [7] [6]|
+ // [5] [4] [3] [2] <1>|
+ public void testLayout9KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R0);
+ assertEquals("9 key auto 5 R0 columns", 5, params.mNumColumns);
+ assertEquals("9 key auto 5 R0 rows", 2, params.mNumRows);
+ assertEquals("9 key auto 5 R0 left", 4, params.mLeftKeys);
+ assertEquals("9 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("9 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("9 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("9 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("9 key auto 5 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("9 key auto 5 R0 [5]", -4, params.getColumnPos(4));
+ assertEquals("9 key auto 5 R0 [6]", 0, params.getColumnPos(5));
+ assertEquals("9 key auto 5 R0 [7]", -1, params.getColumnPos(6));
+ assertEquals("9 key auto 5 R0 [8]", -2, params.getColumnPos(7));
+ assertEquals("9 key auto 5 R0 [9]", -3, params.getColumnPos(8));
+ assertEquals("9 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("9 key auto 5 R0 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [9] [8] [7] [6] ___|
+ // [5] [4] [3] [2] <1> ___|
+ public void testLayout9KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R1);
+ assertEquals("9 key auto 5 R1 columns", 5, params.mNumColumns);
+ assertEquals("9 key auto 5 R1 rows", 2, params.mNumRows);
+ assertEquals("9 key auto 5 R1 left", 4, params.mLeftKeys);
+ assertEquals("9 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("9 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("9 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("9 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("9 key auto 5 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("9 key auto 5 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("9 key auto 5 R1 [6]", 0, params.getColumnPos(5));
+ assertEquals("9 key auto 5 R1 [7]", -1, params.getColumnPos(6));
+ assertEquals("9 key auto 5 R1 [8]", -2, params.getColumnPos(7));
+ assertEquals("9 key auto 5 R1 [9]", -3, params.getColumnPos(8));
+ assertEquals("9 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("9 key auto 5 R1 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [9] [8] [6] [7] ___|
+ // [5] [4] [3] <1> [2] ___|
+ public void testLayout9KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R2);
+ assertEquals("9 key auto 5 R2 columns", 5, params.mNumColumns);
+ assertEquals("9 key auto 5 R2 rows", 2, params.mNumRows);
+ assertEquals("9 key auto 5 R2 left", 3, params.mLeftKeys);
+ assertEquals("9 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("9 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("9 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("9 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("9 key auto 5 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("9 key auto 5 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("9 key auto 5 R2 [6]", 0, params.getColumnPos(5));
+ assertEquals("9 key auto 5 R2 [7]", 1, params.getColumnPos(6));
+ assertEquals("9 key auto 5 R2 [8]", -1, params.getColumnPos(7));
+ assertEquals("9 key auto 5 R2 [9]", -2, params.getColumnPos(8));
+ assertEquals("9 key auto 5 R2 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("9 key auto 5 R2 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [A] [8] [6] [7] [9]
+ // [5] [3] <1> [2] [4]
+ public void testLayout10KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(10, 5, XPOS_M0);
+ assertEquals("10 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("10 key auto 5 M0 rows", 2, params.mNumRows);
+ assertEquals("10 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("10 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("10 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("10 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("10 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("10 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("10 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("10 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("10 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("10 key auto 5 M0 [8]", -1, params.getColumnPos(7));
+ assertEquals("10 key auto 5 M0 [9]", 2, params.getColumnPos(8));
+ assertEquals("10 key auto 5 M0 [A]", -2, params.getColumnPos(9));
+ assertEquals("10 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("10 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // |[6] [7] [8] [9] [A]
+ // |<1> [2] [3] [4] [5]
+ public void testLayout10KeyAuto5L0() {
+ MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L0);
+ assertEquals("10 key auto 5 L0 columns", 5, params.mNumColumns);
+ assertEquals("10 key auto 5 L0 rows", 2, params.mNumRows);
+ assertEquals("10 key auto 5 L0 left", 0, params.mLeftKeys);
+ assertEquals("10 key auto 5 L0 right", 5, params.mRightKeys);
+ assertEquals("10 key auto 5 L0 <1>", 0, params.getColumnPos(0));
+ assertEquals("10 key auto 5 L0 [2]", 1, params.getColumnPos(1));
+ assertEquals("10 key auto 5 L0 [3]", 2, params.getColumnPos(2));
+ assertEquals("10 key auto 5 L0 [4]", 3, params.getColumnPos(3));
+ assertEquals("10 key auto 5 L0 [5]", 4, params.getColumnPos(4));
+ assertEquals("10 key auto 5 L0 [6]", 0, params.getColumnPos(5));
+ assertEquals("10 key auto 5 L0 [7]", 1, params.getColumnPos(6));
+ assertEquals("10 key auto 5 L0 [8]", 2, params.getColumnPos(7));
+ assertEquals("10 key auto 5 L0 [9]", 3, params.getColumnPos(8));
+ assertEquals("10 key auto 5 L0 [A]", 4, params.getColumnPos(9));
+ assertEquals("10 key auto 5 L0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("10 key auto 5 L0 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [6] [7] [8] [9] [A]
+ // |___ <1> [2] [3] [4] [5]
+ public void testLayout10KeyAuto5L1() {
+ MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L1);
+ assertEquals("10 key auto 5 L1 columns", 5, params.mNumColumns);
+ assertEquals("10 key auto 5 L1 rows", 2, params.mNumRows);
+ assertEquals("10 key auto 5 L1 left", 0, params.mLeftKeys);
+ assertEquals("10 key auto 5 L1 right", 5, params.mRightKeys);
+ assertEquals("10 key auto 5 L1 <1>", 0, params.getColumnPos(0));
+ assertEquals("10 key auto 5 L1 [2]", 1, params.getColumnPos(1));
+ assertEquals("10 key auto 5 L1 [3]", 2, params.getColumnPos(2));
+ assertEquals("10 key auto 5 L1 [4]", 3, params.getColumnPos(3));
+ assertEquals("10 key auto 5 L1 [5]", 4, params.getColumnPos(4));
+ assertEquals("10 key auto 5 L1 [6]", 0, params.getColumnPos(5));
+ assertEquals("10 key auto 5 L1 [7]", 1, params.getColumnPos(6));
+ assertEquals("10 key auto 5 L1 [8]", 2, params.getColumnPos(7));
+ assertEquals("10 key auto 5 L1 [9]", 3, params.getColumnPos(8));
+ assertEquals("10 key auto 5 L1 [A]", 4, params.getColumnPos(9));
+ assertEquals("10 key auto 5 L1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("10 key auto 5 L1 default", WIDTH * 0, params.getDefaultKeyCoordX());
+ }
+
+ // |___ [8] [6] [7] [9] [A]
+ // |___ [3] <1> [2] [4] [5]
+ public void testLayout10KeyAuto5L2() {
+ MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L2);
+ assertEquals("10 key auto 5 L2 columns", 5, params.mNumColumns);
+ assertEquals("10 key auto 5 L2 rows", 2, params.mNumRows);
+ assertEquals("10 key auto 5 L2 left", 1, params.mLeftKeys);
+ assertEquals("10 key auto 5 L2 right", 4, params.mRightKeys);
+ assertEquals("10 key auto 5 L2 <1>", 0, params.getColumnPos(0));
+ assertEquals("10 key auto 5 L2 [2]", 1, params.getColumnPos(1));
+ assertEquals("10 key auto 5 L2 [3]", -1, params.getColumnPos(2));
+ assertEquals("10 key auto 5 L2 [4]", 2, params.getColumnPos(3));
+ assertEquals("10 key auto 5 L2 [5]", 3, params.getColumnPos(4));
+ assertEquals("10 key auto 5 L2 [6]", 0, params.getColumnPos(5));
+ assertEquals("10 key auto 5 L2 [7]", 1, params.getColumnPos(6));
+ assertEquals("10 key auto 5 L2 [8]", -1, params.getColumnPos(7));
+ assertEquals("10 key auto 5 L2 [9]", 2, params.getColumnPos(8));
+ assertEquals("10 key auto 5 L2 [A]", 3, params.getColumnPos(9));
+ assertEquals("10 key auto 5 L2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("10 key auto 5 L2 default", WIDTH * 1, params.getDefaultKeyCoordX());
+ }
+
+ // [A] [9] [8] [7] [6]|
+ // [5] [4] [3] [2] <1>|
+ public void testLayout10KeyAuto5R0() {
+ MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R0);
+ assertEquals("10 key auto 5 R0 columns", 5, params.mNumColumns);
+ assertEquals("10 key auto 5 R0 rows", 2, params.mNumRows);
+ assertEquals("10 key auto 5 R0 left", 4, params.mLeftKeys);
+ assertEquals("10 key auto 5 R0 right", 1, params.mRightKeys);
+ assertEquals("10 key auto 5 R0 <1>", 0, params.getColumnPos(0));
+ assertEquals("10 key auto 5 R0 [2]", -1, params.getColumnPos(1));
+ assertEquals("10 key auto 5 R0 [3]", -2, params.getColumnPos(2));
+ assertEquals("10 key auto 5 R0 [4]", -3, params.getColumnPos(3));
+ assertEquals("10 key auto 5 R0 [5]", -4, params.getColumnPos(4));
+ assertEquals("10 key auto 5 R0 [6]", 0, params.getColumnPos(5));
+ assertEquals("10 key auto 5 R0 [7]", -1, params.getColumnPos(6));
+ assertEquals("10 key auto 5 R0 [8]", -2, params.getColumnPos(7));
+ assertEquals("10 key auto 5 R0 [9]", -3, params.getColumnPos(8));
+ assertEquals("10 key auto 5 R0 [A]", -4, params.getColumnPos(9));
+ assertEquals("10 key auto 5 R0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("10 key auto 5 R0 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [A] [9] [8] [7] [6] ___|
+ // [5] [4] [3] [2] <1> ___|
+ public void testLayout10KeyAuto5R1() {
+ MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R1);
+ assertEquals("10 key auto 5 R1 columns", 5, params.mNumColumns);
+ assertEquals("10 key auto 5 R1 rows", 2, params.mNumRows);
+ assertEquals("10 key auto 5 R1 left", 4, params.mLeftKeys);
+ assertEquals("10 key auto 5 R1 right", 1, params.mRightKeys);
+ assertEquals("10 key auto 5 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("10 key auto 5 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("10 key auto 5 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("10 key auto 5 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("10 key auto 5 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("10 key auto 5 R1 [6]", 0, params.getColumnPos(5));
+ assertEquals("10 key auto 5 R1 [7]", -1, params.getColumnPos(6));
+ assertEquals("10 key auto 5 R1 [8]", -2, params.getColumnPos(7));
+ assertEquals("10 key auto 5 R1 [9]", -3, params.getColumnPos(8));
+ assertEquals("10 key auto 5 R1 [A]", -4, params.getColumnPos(9));
+ assertEquals("10 key auto 5 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("10 key auto 5 R1 default", WIDTH * 4, params.getDefaultKeyCoordX());
+ }
+
+ // [A] [9] [8] [6] [7] ___|
+ // [5] [4] [3] <1> [2] ___|
+ public void testLayout10KeyAuto5R2() {
+ MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R2);
+ assertEquals("10 key auto 5 R2 columns", 5, params.mNumColumns);
+ assertEquals("10 key auto 5 R2 rows", 2, params.mNumRows);
+ assertEquals("10 key auto 5 R2 left", 3, params.mLeftKeys);
+ assertEquals("10 key auto 5 R2 right", 2, params.mRightKeys);
+ assertEquals("10 key auto 5 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("10 key auto 5 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("10 key auto 5 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("10 key auto 5 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("10 key auto 5 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("10 key auto 5 R2 [6]", 0, params.getColumnPos(5));
+ assertEquals("10 key auto 5 R2 [7]", 1, params.getColumnPos(6));
+ assertEquals("10 key auto 5 R2 [8]", -1, params.getColumnPos(7));
+ assertEquals("10 key auto 5 R2 [9]", -2, params.getColumnPos(8));
+ assertEquals("10 key auto 5 R2 [A]", -3, params.getColumnPos(9));
+ assertEquals("10 key auto 5 R2 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("10 key auto 5 R2 default", WIDTH * 3, params.getDefaultKeyCoordX());
+ }
+
+ // [B]
+ // [A] [8] [6] [7] [9]
+ // [5] [3] <1> [2] [4]
+ public void testLayout11KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(11, 5, XPOS_M0);
+ assertEquals("11 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("11 key auto 5 M0 rows", 3, params.mNumRows);
+ assertEquals("11 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("11 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("11 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("11 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("11 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("11 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("11 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("11 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("11 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("11 key auto 5 M0 [8]", -1, params.getColumnPos(7));
+ assertEquals("11 key auto 5 M0 [9]", 2, params.getColumnPos(8));
+ assertEquals("11 key auto 5 M0 [A]", -2, params.getColumnPos(9));
+ assertEquals("11 key auto 5 M0 [B]", 0, params.getColumnPos(10));
+ assertEquals("11 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("11 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [B] [C]
+ // [A] [8] [6] [7] [9]
+ // [5] [3] <1> [2] [4]
+ public void testLayout12KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(12, 5, XPOS_M0);
+ assertEquals("12 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("12 key auto 5 M0 rows", 3, params.mNumRows);
+ assertEquals("12 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("12 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("12 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("12 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("12 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("12 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("12 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("12 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("12 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("12 key auto 5 M0 [8]", -1, params.getColumnPos(7));
+ assertEquals("12 key auto 5 M0 [9]", 2, params.getColumnPos(8));
+ assertEquals("12 key auto 5 M0 [A]", -2, params.getColumnPos(9));
+ assertEquals("12 key auto 5 M0 [B]", 0, params.getColumnPos(10));
+ assertEquals("12 key auto 5 M0 [C]", 1, params.getColumnPos(11));
+ assertEquals("12 key auto 5 M0 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("12 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [D] [B] [C]
+ // [A] [8] [6] [7] [9]
+ // [5] [3] <1> [2] [4]
+ public void testLayout13KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(13, 5, XPOS_M0);
+ assertEquals("13 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("13 key auto 5 M0 rows", 3, params.mNumRows);
+ assertEquals("13 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("13 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("13 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("13 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("13 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("13 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("13 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("13 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("13 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("13 key auto 5 M0 [8]", -1, params.getColumnPos(7));
+ assertEquals("13 key auto 5 M0 [9]", 2, params.getColumnPos(8));
+ assertEquals("13 key auto 5 M0 [A]", -2, params.getColumnPos(9));
+ assertEquals("13 key auto 5 M0 [B]", 0, params.getColumnPos(10));
+ assertEquals("13 key auto 5 M0 [C]", 1, params.getColumnPos(11));
+ assertEquals("13 key auto 5 M0 [D]", -1, params.getColumnPos(12));
+ assertEquals("13 key auto 5 M0 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("13 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [D] [B] [C] [E]
+ // [A] [8] [6] [7] [9]
+ // [5] [3] <1> [2] [4]
+ public void testLayout14KeyAuto5M0() {
+ MoreKeysKeyboardParams params = createParams(14, 5, XPOS_M0);
+ assertEquals("13 key auto 5 M0 columns", 5, params.mNumColumns);
+ assertEquals("13 key auto 5 M0 rows", 3, params.mNumRows);
+ assertEquals("13 key auto 5 M0 left", 2, params.mLeftKeys);
+ assertEquals("13 key auto 5 M0 right", 3, params.mRightKeys);
+ assertEquals("13 key auto 5 M0 <1>", 0, params.getColumnPos(0));
+ assertEquals("13 key auto 5 M0 [2]", 1, params.getColumnPos(1));
+ assertEquals("13 key auto 5 M0 [3]", -1, params.getColumnPos(2));
+ assertEquals("13 key auto 5 M0 [4]", 2, params.getColumnPos(3));
+ assertEquals("13 key auto 5 M0 [5]", -2, params.getColumnPos(4));
+ assertEquals("13 key auto 5 M0 [6]", 0, params.getColumnPos(5));
+ assertEquals("13 key auto 5 M0 [7]", 1, params.getColumnPos(6));
+ assertEquals("13 key auto 5 M0 [8]", -1, params.getColumnPos(7));
+ assertEquals("13 key auto 5 M0 [9]", 2, params.getColumnPos(8));
+ assertEquals("13 key auto 5 M0 [A]", -2, params.getColumnPos(9));
+ assertEquals("13 key auto 5 M0 [B]", 0, params.getColumnPos(10));
+ assertEquals("13 key auto 5 M0 [C]", 1, params.getColumnPos(11));
+ assertEquals("13 key auto 5 M0 [D]", -1, params.getColumnPos(12));
+ assertEquals("13 key auto 5 M0 [E]", 2, params.getColumnPos(13));
+ assertEquals("13 key auto 5 M0 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("13 key auto 5 M0 default", WIDTH * 2, params.getDefaultKeyCoordX());
+ }
+
+ // [J] [I] [H] ___|
+ // [G] [F] [E] [D] [C] [B] [A] [9] ___|
+ // [8] [7] [6] [5] [4] [3] [2] <1> ___|
+ public void testLayout19KeyAuto8R1() {
+ MoreKeysKeyboardParams params = createParams(19, 8, XPOS_R1);
+ assertEquals("19 key auto 8 R1 columns", 8, params.mNumColumns);
+ assertEquals("19 key auto 8 R1 rows", 3, params.mNumRows);
+ assertEquals("19 key auto 8 R1 left", 7, params.mLeftKeys);
+ assertEquals("19 key auto 8 R1 right", 1, params.mRightKeys);
+ assertEquals("19 key auto 8 R1 <1>", 0, params.getColumnPos(0));
+ assertEquals("19 key auto 8 R1 [2]", -1, params.getColumnPos(1));
+ assertEquals("19 key auto 8 R1 [3]", -2, params.getColumnPos(2));
+ assertEquals("19 key auto 8 R1 [4]", -3, params.getColumnPos(3));
+ assertEquals("19 key auto 8 R1 [5]", -4, params.getColumnPos(4));
+ assertEquals("19 key auto 8 R1 [6]", -5, params.getColumnPos(5));
+ assertEquals("19 key auto 8 R1 [7]", -6, params.getColumnPos(6));
+ assertEquals("19 key auto 8 R1 [8]", -7, params.getColumnPos(7));
+ assertEquals("19 key auto 8 R1 [9]", 0, params.getColumnPos(8));
+ assertEquals("19 key auto 8 R1 [A]", -1, params.getColumnPos(9));
+ assertEquals("19 key auto 8 R1 [B]", -2, params.getColumnPos(10));
+ assertEquals("19 key auto 8 R1 [C]", -3, params.getColumnPos(11));
+ assertEquals("19 key auto 8 R1 [D]", -4, params.getColumnPos(12));
+ assertEquals("19 key auto 8 R1 [E]", -5, params.getColumnPos(13));
+ assertEquals("19 key auto 8 R1 [F]", -6, params.getColumnPos(14));
+ assertEquals("19 key auto 8 R1 [G]", -7, params.getColumnPos(15));
+ assertEquals("19 key auto 8 R1 [H]", 0, params.getColumnPos(16));
+ assertEquals("19 key auto 8 R1 [I]", -1, params.getColumnPos(17));
+ assertEquals("19 key auto 8 R1 [J]", -2, params.getColumnPos(18));
+ assertEquals("19 key auto 8 R1 adjust", 0, params.mTopRowAdjustment);
+ assertEquals("19 key auto 8 R1 default", WIDTH * 7, params.getDefaultKeyCoordX());
+ }
+
+ // [J] [H] [I] ___|
+ // [G] [F] [E] [D] [C] [B] [9] [A] ___|
+ // [8] [7] [6] [5] [4] [3] <1> [2] ___|
+ public void testLayout19KeyAuto8R2() {
+ MoreKeysKeyboardParams params = createParams(19, 8, XPOS_R2);
+ assertEquals("19 key auto 8 R2 columns", 8, params.mNumColumns);
+ assertEquals("19 key auto 8 R2 rows", 3, params.mNumRows);
+ assertEquals("19 key auto 8 R2 left", 6, params.mLeftKeys);
+ assertEquals("19 key auto 8 R2 right", 2, params.mRightKeys);
+ assertEquals("19 key auto 8 R2 <1>", 0, params.getColumnPos(0));
+ assertEquals("19 key auto 8 R2 [2]", 1, params.getColumnPos(1));
+ assertEquals("19 key auto 8 R2 [3]", -1, params.getColumnPos(2));
+ assertEquals("19 key auto 8 R2 [4]", -2, params.getColumnPos(3));
+ assertEquals("19 key auto 8 R2 [5]", -3, params.getColumnPos(4));
+ assertEquals("19 key auto 8 R2 [6]", -4, params.getColumnPos(5));
+ assertEquals("19 key auto 8 R2 [7]", -5, params.getColumnPos(6));
+ assertEquals("19 key auto 8 R2 [8]", -6, params.getColumnPos(7));
+ assertEquals("19 key auto 8 R2 [9]", 0, params.getColumnPos(8));
+ assertEquals("19 key auto 8 R2 [A]", 1, params.getColumnPos(9));
+ assertEquals("19 key auto 8 R2 [B]", -1, params.getColumnPos(10));
+ assertEquals("19 key auto 8 R2 [C]", -2, params.getColumnPos(11));
+ assertEquals("19 key auto 8 R2 [D]", -3, params.getColumnPos(12));
+ assertEquals("19 key auto 8 R2 [E]", -4, params.getColumnPos(13));
+ assertEquals("19 key auto 8 R2 [F]", -5, params.getColumnPos(14));
+ assertEquals("19 key auto 8 R2 [G]", -6, params.getColumnPos(15));
+ assertEquals("19 key auto 8 R2 [H]", 0, params.getColumnPos(16));
+ assertEquals("19 key auto 8 R2 [I]", 1, params.getColumnPos(17));
+ assertEquals("19 key auto 8 R2 [J]", -1, params.getColumnPos(18));
+ assertEquals("19 key auto 8 R2 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("19 key auto 8 R2 default", WIDTH * 6, params.getDefaultKeyCoordX());
+ }
+
+ // [J] [H] [I] ___|
+ // [G] [F] [E] [D] [B] [9] [A] [C] ___|
+ // [8] [7] [6] [5] [3] <1> [2] [4] ___|
+ public void testLayout19KeyAuto8R3() {
+ MoreKeysKeyboardParams params = createParams(19, 8, XPOS_R3);
+ assertEquals("19 key auto 8 R3 columns", 8, params.mNumColumns);
+ assertEquals("19 key auto 8 R3 rows", 3, params.mNumRows);
+ assertEquals("19 key auto 8 R3 left", 5, params.mLeftKeys);
+ assertEquals("19 key auto 8 R3 right", 3, params.mRightKeys);
+ assertEquals("19 key auto 8 R3 <1>", 0, params.getColumnPos(0));
+ assertEquals("19 key auto 8 R3 [2]", 1, params.getColumnPos(1));
+ assertEquals("19 key auto 8 R3 [3]", -1, params.getColumnPos(2));
+ assertEquals("19 key auto 8 R3 [4]", 2, params.getColumnPos(3));
+ assertEquals("19 key auto 8 R3 [5]", -2, params.getColumnPos(4));
+ assertEquals("19 key auto 8 R3 [6]", -3, params.getColumnPos(5));
+ assertEquals("19 key auto 8 R3 [7]", -4, params.getColumnPos(6));
+ assertEquals("19 key auto 8 R3 [8]", -5, params.getColumnPos(7));
+ assertEquals("19 key auto 8 R3 [9]", 0, params.getColumnPos(8));
+ assertEquals("19 key auto 8 R3 [A]", 1, params.getColumnPos(9));
+ assertEquals("19 key auto 8 R3 [B]", -1, params.getColumnPos(10));
+ assertEquals("19 key auto 8 R3 [C]", 2, params.getColumnPos(11));
+ assertEquals("19 key auto 8 R3 [D]", -2, params.getColumnPos(12));
+ assertEquals("19 key auto 8 R3 [E]", -3, params.getColumnPos(13));
+ assertEquals("19 key auto 8 R3 [F]", -4, params.getColumnPos(14));
+ assertEquals("19 key auto 8 R3 [G]", -5, params.getColumnPos(15));
+ assertEquals("19 key auto 8 R3 [H]", 0, params.getColumnPos(16));
+ assertEquals("19 key auto 8 R3 [I]", 1, params.getColumnPos(17));
+ assertEquals("19 key auto 8 R3 [J]", -1, params.getColumnPos(18));
+ assertEquals("19 key auto 8 R3 adjust", -1, params.mTopRowAdjustment);
+ assertEquals("19 key auto 8 R3 default", WIDTH * 5, params.getDefaultKeyCoordX());
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
index 6d9c3fdbb..7e51d955d 100644
--- a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
@@ -47,7 +47,8 @@ public class MoreKeysKeyboardBuilderFixedOrderTests extends AndroidTestCase {
final int coordXInParent) {
final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
params.setParameters(numKeys, columnNum, WIDTH, HEIGHT, coordXInParent, KEYBOARD_WIDTH,
- true /* isFixedOrderColumn */, 0 /* dividerWidth */);
+ true /* isMoreKeysFixedColumn */, true /* isMoreKeysFixedOrder */,
+ 0 /* dividerWidth */);
return params;
}
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderMaxOrderTests.java
index b213721bd..806790eff 100644
--- a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderMaxOrderTests.java
@@ -22,7 +22,7 @@ import android.test.suitebuilder.annotation.MediumTest;
import com.android.inputmethod.keyboard.MoreKeysKeyboard.MoreKeysKeyboardParams;
@MediumTest
-public class MoreKeysKeyboardBuilderTests extends AndroidTestCase {
+public class MoreKeysKeyboardBuilderMaxOrderTests extends AndroidTestCase {
private static final int WIDTH = 10;
private static final int HEIGHT = 10;
@@ -47,7 +47,8 @@ public class MoreKeysKeyboardBuilderTests extends AndroidTestCase {
final int coordXInParent) {
final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
params.setParameters(numKeys, maxColumns, WIDTH, HEIGHT, coordXInParent, KEYBOARD_WIDTH,
- false /* isFixedOrderColumn */, 0 /* dividerWidth */);
+ false /* isMoreKeysFixedColumn */, false /* isMoreKeysFixedOrder */,
+ 0 /* dividerWidth */);
return params;
}
diff --git a/tests/src/com/android/inputmethod/latin/DistracterFilterTest.java b/tests/src/com/android/inputmethod/latin/DistracterFilterTest.java
index e6fb28260..af22fb8b9 100644
--- a/tests/src/com/android/inputmethod/latin/DistracterFilterTest.java
+++ b/tests/src/com/android/inputmethod/latin/DistracterFilterTest.java
@@ -31,13 +31,17 @@ import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatchesA
*/
@LargeTest
public class DistracterFilterTest extends AndroidTestCase {
+ private DictionaryFacilitatorLruCache mDictionaryFacilitatorLruCache;
private DistracterFilterCheckingExactMatchesAndSuggestions mDistracterFilter;
@Override
protected void setUp() throws Exception {
super.setUp();
final Context context = getContext();
- mDistracterFilter = new DistracterFilterCheckingExactMatchesAndSuggestions(context);
+ mDictionaryFacilitatorLruCache = new DictionaryFacilitatorLruCache(context,
+ 2 /* maxSize */, "" /* dictionaryNamePrefix */);
+ mDistracterFilter = new DistracterFilterCheckingExactMatchesAndSuggestions(context,
+ mDictionaryFacilitatorLruCache);
RichInputMethodManager.init(context);
final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
final ArrayList<InputMethodSubtype> subtypes = new ArrayList<>();
@@ -50,6 +54,11 @@ public class DistracterFilterTest extends AndroidTestCase {
mDistracterFilter.updateEnabledSubtypes(subtypes);
}
+ @Override
+ protected void tearDown() {
+ mDictionaryFacilitatorLruCache.evictAll();
+ }
+
public void testIsDistractorToWordsInDictionaries() {
final PrevWordsInfo EMPTY_PREV_WORDS_INFO = PrevWordsInfo.EMPTY_PREV_WORDS_INFO;
diff --git a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
index c28d08cdb..869c550e0 100644
--- a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
+++ b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
@@ -148,5 +148,15 @@ public class SuggestedWordsTests extends AndroidTestCase {
// Make sure getTypedWordInfoOrNull() returns null.
assertNull(SuggestedWords.EMPTY.getTypedWordInfoOrNull());
+
+ final SuggestedWords emptySuggestedWords = new SuggestedWords(
+ new ArrayList<SuggestedWordInfo>(), null /* rawSuggestions */,
+ false /* typedWordValid */,
+ false /* willAutoCorrect */,
+ false /* isObsoleteSuggestions */,
+ SuggestedWords.INPUT_STYLE_NONE);
+ assertNull(emptySuggestedWords.getTypedWordInfoOrNull());
+
+ assertNull(SuggestedWords.EMPTY.getTypedWordInfoOrNull());
}
}
diff --git a/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java
index b6562921e..e9a97ff92 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java
@@ -52,7 +52,7 @@ public class PersonalizationDictionaryTests extends AndroidTestCase {
final ArrayList<String> dictTypes = new ArrayList<>();
dictTypes.add(Dictionary.TYPE_MAIN);
dictTypes.add(Dictionary.TYPE_PERSONALIZATION);
- final DictionaryFacilitator dictionaryFacilitator = new DictionaryFacilitator();
+ final DictionaryFacilitator dictionaryFacilitator = new DictionaryFacilitator(getContext());
dictionaryFacilitator.resetDictionariesForTesting(getContext(), LOCALE_EN_US, dictTypes,
new HashMap<String, File>(), new HashMap<String, Map<String, String>>());
return dictionaryFacilitator;