Android TV keyboard initial import am: 7e131e7ebd am: 6e8e741e5d am: e61d19e1b6
Change-Id: I0f08412713831d05ad51937f87b32e37aad13533
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..e33d97e
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,29 @@
+version_name = "1.00-aosp"
+version_code = "100"
+
+android_app {
+ name: "LeanbackIME",
+
+ sdk_version: "system_current",
+
+ srcs: [
+ "src/**/*.java",
+ ],
+
+ optimize: {
+ proguard_flags_files: ["proguard.cfg"],
+ enabled: false,
+ },
+
+ resource_dirs: ["res"],
+
+ aaptflags: [
+ "--auto-add-overlay",
+
+ "--version-name",
+ version_name,
+
+ "--version-code",
+ version_code,
+ ]
+}
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
new file mode 100644
index 0000000..c7267cd
--- /dev/null
+++ b/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.inputmethod.leanback" >
+
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
+ <uses-sdk
+ android:minSdkVersion="16"
+ android:targetSdkVersion="23" />
+
+ <application
+ android:label="@string/ime_name" >
+ <service
+ android:name="com.android.inputmethod.leanback.service.LeanbackImeService"
+ android:label="@string/ime_service_name"
+ android:permission="android.permission.BIND_INPUT_METHOD" >
+ <intent-filter>
+ <action android:name="android.view.InputMethod" />
+ </intent-filter>
+
+ <meta-data
+ android:name="android.view.im"
+ android:resource="@xml/method" />
+ </service>
+ </application>
+
+</manifest>
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..65899b3
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1 @@
+See https://source.android.com/setup/contribute
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..74e368a
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,2 @@
+dake@google.com
+eisenbach@google.com
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..49ab56b
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# Default keyboard for Android TV
diff --git a/proguard.cfg b/proguard.cfg
new file mode 100644
index 0000000..3920382
--- /dev/null
+++ b/proguard.cfg
@@ -0,0 +1,14 @@
+-optimizationpasses 5
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-dontpreverify
+-verbose
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class BinaryDictionary
+-keep public class Dictionary
+
+-dontwarn org.bouncycastle.jce.provider.BouncyCastleProvider
+-dontwarn org.bouncycastle.x509.X509V3CertificateGenerator
\ No newline at end of file
diff --git a/res/drawable-hdpi/ic_ime_accent_close.png b/res/drawable-hdpi/ic_ime_accent_close.png
new file mode 100644
index 0000000..e96a5ee
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_accent_close.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_alphabet.png b/res/drawable-hdpi/ic_ime_alphabet.png
new file mode 100644
index 0000000..06324bc
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_alphabet.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_delete.png b/res/drawable-hdpi/ic_ime_delete.png
new file mode 100644
index 0000000..7eb3680
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_delete.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_left_arrow.png b/res/drawable-hdpi/ic_ime_left_arrow.png
new file mode 100644
index 0000000..1f92de6
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_left_arrow.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_right_arrow.png b/res/drawable-hdpi/ic_ime_right_arrow.png
new file mode 100644
index 0000000..f3f84bf
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_right_arrow.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_shift_lock_on.png b/res/drawable-hdpi/ic_ime_shift_lock_on.png
new file mode 100644
index 0000000..fa8a4bd
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_shift_lock_on.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_shift_off.png b/res/drawable-hdpi/ic_ime_shift_off.png
new file mode 100644
index 0000000..8b55067
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_shift_off.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_shift_on.png b/res/drawable-hdpi/ic_ime_shift_on.png
new file mode 100644
index 0000000..23b31e2
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_shift_on.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_space.png b/res/drawable-hdpi/ic_ime_space.png
new file mode 100644
index 0000000..e899709
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_space.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_ime_symbols.png b/res/drawable-hdpi/ic_ime_symbols.png
new file mode 100644
index 0000000..4217907
--- /dev/null
+++ b/res/drawable-hdpi/ic_ime_symbols.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_voice_available.png b/res/drawable-hdpi/ic_voice_available.png
new file mode 100644
index 0000000..61bdd00
--- /dev/null
+++ b/res/drawable-hdpi/ic_voice_available.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_voice_focus.png b/res/drawable-hdpi/ic_voice_focus.png
new file mode 100644
index 0000000..8fce9a5
--- /dev/null
+++ b/res/drawable-hdpi/ic_voice_focus.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_voice_off.png b/res/drawable-hdpi/ic_voice_off.png
new file mode 100644
index 0000000..208f430
--- /dev/null
+++ b/res/drawable-hdpi/ic_voice_off.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_voice_recording.png b/res/drawable-hdpi/ic_voice_recording.png
new file mode 100644
index 0000000..a8da1b8
--- /dev/null
+++ b/res/drawable-hdpi/ic_voice_recording.png
Binary files differ
diff --git a/res/drawable-hdpi/key_selector.9.png b/res/drawable-hdpi/key_selector.9.png
new file mode 100644
index 0000000..6eb8b88
--- /dev/null
+++ b/res/drawable-hdpi/key_selector.9.png
Binary files differ
diff --git a/res/drawable-hdpi/touch_selector.9.png b/res/drawable-hdpi/touch_selector.9.png
new file mode 100644
index 0000000..ae4b270
--- /dev/null
+++ b/res/drawable-hdpi/touch_selector.9.png
Binary files differ
diff --git a/res/drawable-hdpi/vs_reactive_dark.png b/res/drawable-hdpi/vs_reactive_dark.png
new file mode 100644
index 0000000..d2cee0d
--- /dev/null
+++ b/res/drawable-hdpi/vs_reactive_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/vs_reactive_light.png b/res/drawable-hdpi/vs_reactive_light.png
new file mode 100644
index 0000000..3c37e71
--- /dev/null
+++ b/res/drawable-hdpi/vs_reactive_light.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_accent_close.png b/res/drawable-mdpi/ic_ime_accent_close.png
new file mode 100644
index 0000000..d72f653
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_accent_close.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_alphabet.png b/res/drawable-mdpi/ic_ime_alphabet.png
new file mode 100644
index 0000000..9325d48
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_alphabet.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_delete.png b/res/drawable-mdpi/ic_ime_delete.png
new file mode 100644
index 0000000..4ba17b1
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_delete.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_left_arrow.png b/res/drawable-mdpi/ic_ime_left_arrow.png
new file mode 100644
index 0000000..24de415
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_left_arrow.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_right_arrow.png b/res/drawable-mdpi/ic_ime_right_arrow.png
new file mode 100644
index 0000000..e2c9bb3
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_right_arrow.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_shift_lock_on.png b/res/drawable-mdpi/ic_ime_shift_lock_on.png
new file mode 100644
index 0000000..2574b28
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_shift_lock_on.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_shift_off.png b/res/drawable-mdpi/ic_ime_shift_off.png
new file mode 100644
index 0000000..7144a00
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_shift_off.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_shift_on.png b/res/drawable-mdpi/ic_ime_shift_on.png
new file mode 100644
index 0000000..1cb530b
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_shift_on.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_space.png b/res/drawable-mdpi/ic_ime_space.png
new file mode 100644
index 0000000..7fea09f
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_space.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_ime_symbols.png b/res/drawable-mdpi/ic_ime_symbols.png
new file mode 100644
index 0000000..90933f0
--- /dev/null
+++ b/res/drawable-mdpi/ic_ime_symbols.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_voice_available.png b/res/drawable-mdpi/ic_voice_available.png
new file mode 100644
index 0000000..a3cb908
--- /dev/null
+++ b/res/drawable-mdpi/ic_voice_available.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_voice_focus.png b/res/drawable-mdpi/ic_voice_focus.png
new file mode 100644
index 0000000..7cfca18
--- /dev/null
+++ b/res/drawable-mdpi/ic_voice_focus.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_voice_off.png b/res/drawable-mdpi/ic_voice_off.png
new file mode 100644
index 0000000..f4fd35b
--- /dev/null
+++ b/res/drawable-mdpi/ic_voice_off.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_voice_recording.png b/res/drawable-mdpi/ic_voice_recording.png
new file mode 100644
index 0000000..a8bde78
--- /dev/null
+++ b/res/drawable-mdpi/ic_voice_recording.png
Binary files differ
diff --git a/res/drawable-mdpi/key_selector.9.png b/res/drawable-mdpi/key_selector.9.png
new file mode 100644
index 0000000..bf9c4b2
--- /dev/null
+++ b/res/drawable-mdpi/key_selector.9.png
Binary files differ
diff --git a/res/drawable-mdpi/touch_selector.9.png b/res/drawable-mdpi/touch_selector.9.png
new file mode 100644
index 0000000..7a85041
--- /dev/null
+++ b/res/drawable-mdpi/touch_selector.9.png
Binary files differ
diff --git a/res/drawable-mdpi/vs_reactive_dark.png b/res/drawable-mdpi/vs_reactive_dark.png
new file mode 100644
index 0000000..cf9983e
--- /dev/null
+++ b/res/drawable-mdpi/vs_reactive_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/vs_reactive_light.png b/res/drawable-mdpi/vs_reactive_light.png
new file mode 100644
index 0000000..9c67426
--- /dev/null
+++ b/res/drawable-mdpi/vs_reactive_light.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_accent_close.png b/res/drawable-xhdpi/ic_ime_accent_close.png
new file mode 100644
index 0000000..392cfe6
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_accent_close.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_alphabet.png b/res/drawable-xhdpi/ic_ime_alphabet.png
new file mode 100644
index 0000000..717690b
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_alphabet.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_delete.png b/res/drawable-xhdpi/ic_ime_delete.png
new file mode 100644
index 0000000..d2ee1e7
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_delete.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_left_arrow.png b/res/drawable-xhdpi/ic_ime_left_arrow.png
new file mode 100644
index 0000000..2f23dd1
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_left_arrow.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_right_arrow.png b/res/drawable-xhdpi/ic_ime_right_arrow.png
new file mode 100644
index 0000000..d004b5b
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_right_arrow.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_shift_lock_on.png b/res/drawable-xhdpi/ic_ime_shift_lock_on.png
new file mode 100644
index 0000000..307093e
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_shift_lock_on.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_shift_off.png b/res/drawable-xhdpi/ic_ime_shift_off.png
new file mode 100644
index 0000000..d5cd919
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_shift_off.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_shift_on.png b/res/drawable-xhdpi/ic_ime_shift_on.png
new file mode 100644
index 0000000..105ad86
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_shift_on.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_space.png b/res/drawable-xhdpi/ic_ime_space.png
new file mode 100644
index 0000000..0ce6584
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_space.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_ime_symbols.png b/res/drawable-xhdpi/ic_ime_symbols.png
new file mode 100644
index 0000000..3b1e749
--- /dev/null
+++ b/res/drawable-xhdpi/ic_ime_symbols.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_voice_available.png b/res/drawable-xhdpi/ic_voice_available.png
new file mode 100644
index 0000000..60b3a0e
--- /dev/null
+++ b/res/drawable-xhdpi/ic_voice_available.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_voice_focus.png b/res/drawable-xhdpi/ic_voice_focus.png
new file mode 100644
index 0000000..03a7049
--- /dev/null
+++ b/res/drawable-xhdpi/ic_voice_focus.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_voice_off.png b/res/drawable-xhdpi/ic_voice_off.png
new file mode 100644
index 0000000..17ea908
--- /dev/null
+++ b/res/drawable-xhdpi/ic_voice_off.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_voice_recording.png b/res/drawable-xhdpi/ic_voice_recording.png
new file mode 100644
index 0000000..facca0c
--- /dev/null
+++ b/res/drawable-xhdpi/ic_voice_recording.png
Binary files differ
diff --git a/res/drawable-xhdpi/key_selector.9.png b/res/drawable-xhdpi/key_selector.9.png
new file mode 100644
index 0000000..d280717
--- /dev/null
+++ b/res/drawable-xhdpi/key_selector.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/touch_selector.9.png b/res/drawable-xhdpi/touch_selector.9.png
new file mode 100644
index 0000000..a392e29
--- /dev/null
+++ b/res/drawable-xhdpi/touch_selector.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/vs_reactive_dark.png b/res/drawable-xhdpi/vs_reactive_dark.png
new file mode 100644
index 0000000..19272af
--- /dev/null
+++ b/res/drawable-xhdpi/vs_reactive_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/vs_reactive_light.png b/res/drawable-xhdpi/vs_reactive_light.png
new file mode 100644
index 0000000..bfb1792
--- /dev/null
+++ b/res/drawable-xhdpi/vs_reactive_light.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_accent_close.png b/res/drawable-xxhdpi/ic_ime_accent_close.png
new file mode 100644
index 0000000..ef1c76d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_accent_close.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_alphabet.png b/res/drawable-xxhdpi/ic_ime_alphabet.png
new file mode 100644
index 0000000..d186fb4
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_alphabet.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_delete.png b/res/drawable-xxhdpi/ic_ime_delete.png
new file mode 100644
index 0000000..7fd42c1
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_delete.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_left_arrow.png b/res/drawable-xxhdpi/ic_ime_left_arrow.png
new file mode 100644
index 0000000..38b5b66
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_left_arrow.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_right_arrow.png b/res/drawable-xxhdpi/ic_ime_right_arrow.png
new file mode 100644
index 0000000..2ae24d2
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_right_arrow.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_shift_lock_on.png b/res/drawable-xxhdpi/ic_ime_shift_lock_on.png
new file mode 100644
index 0000000..9f1d155
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_shift_lock_on.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_shift_off.png b/res/drawable-xxhdpi/ic_ime_shift_off.png
new file mode 100644
index 0000000..50edf2b
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_shift_off.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_shift_on.png b/res/drawable-xxhdpi/ic_ime_shift_on.png
new file mode 100644
index 0000000..217a48d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_shift_on.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_space.png b/res/drawable-xxhdpi/ic_ime_space.png
new file mode 100644
index 0000000..e4e8ef3
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_space.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_ime_symbols.png b/res/drawable-xxhdpi/ic_ime_symbols.png
new file mode 100644
index 0000000..fc458b0
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_ime_symbols.png
Binary files differ
diff --git a/res/drawable-xxhdpi/key_selector.9.png b/res/drawable-xxhdpi/key_selector.9.png
new file mode 100644
index 0000000..eccc5cb
--- /dev/null
+++ b/res/drawable-xxhdpi/key_selector.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/touch_selector.9.png b/res/drawable-xxhdpi/touch_selector.9.png
new file mode 100644
index 0000000..ef4546a
--- /dev/null
+++ b/res/drawable-xxhdpi/touch_selector.9.png
Binary files differ
diff --git a/res/drawable/selector_caps_shift.xml b/res/drawable/selector_caps_shift.xml
new file mode 100644
index 0000000..78aa640
--- /dev/null
+++ b/res/drawable/selector_caps_shift.xml
@@ -0,0 +1,22 @@
+<!--
+ Copyright 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:drawable="@drawable/ic_ime_shift_on" android:state_selected="false"/>
+ <item android:drawable="@drawable/ic_ime_shift_lock_on"/>
+
+</selector>
\ No newline at end of file
diff --git a/res/drawable/vs_micbtn_off_selector.xml b/res/drawable/vs_micbtn_off_selector.xml
new file mode 100644
index 0000000..bb94ce2
--- /dev/null
+++ b/res/drawable/vs_micbtn_off_selector.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2012 Google Inc.
+ All Rights Reserved.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_focused="true"
+ android:drawable="@drawable/ic_voice_focus" />
+
+ <item android:drawable="@drawable/ic_voice_available" />
+</selector>
diff --git a/res/drawable/vs_micbtn_on_selector.xml b/res/drawable/vs_micbtn_on_selector.xml
new file mode 100644
index 0000000..9ffa836
--- /dev/null
+++ b/res/drawable/vs_micbtn_on_selector.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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_focused="true"
+ android:drawable="@drawable/ic_voice_focus" />
+
+ <item android:drawable="@drawable/ic_voice_available" />
+</selector>
diff --git a/res/drawable/vs_micbtn_rec_selector.xml b/res/drawable/vs_micbtn_rec_selector.xml
new file mode 100644
index 0000000..9a48c44
--- /dev/null
+++ b/res/drawable/vs_micbtn_rec_selector.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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_focused="true"
+ android:drawable="@drawable/ic_voice_recording" />
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/ic_voice_recording" />
+
+ <item android:drawable="@drawable/ic_voice_available" />
+</selector>
diff --git a/res/layout/candidate.xml b/res/layout/candidate.xml
new file mode 100644
index 0000000..ca5e484
--- /dev/null
+++ b/res/layout/candidate.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_marginLeft="@dimen/candidate_margin_horizontal"
+ android:layout_marginRight="@dimen/candidate_margin_horizontal"
+ android:clipChildren="false"
+ android:focusable="true"
+ android:paddingLeft="@dimen/candidate_padding_horizontal"
+ android:paddingRight="@dimen/candidate_padding_horizontal" >
+
+ <Button
+ android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_height"
+ android:background="@android:color/transparent"
+ android:clipChildren="false"
+ android:ellipsize="none"
+ android:fontFamily="sans-serif-condensed"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textAllCaps="false"
+ android:textColor="@color/candidate_font_color"
+ android:textSize="@dimen/candidate_font_size" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/res/layout/input_leanback.xml b/res/layout/input_leanback.xml
new file mode 100644
index 0000000..cabe840
--- /dev/null
+++ b/res/layout/input_leanback.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:leanbackime="http://schemas.android.com/apk/res/com.android.inputmethod.leanback"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clipChildren="false"
+ android:focusable="false"
+ android:gravity="bottom" >
+
+ <LinearLayout
+ android:id="@+id/keyboard"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:clipChildren="false"
+ android:orientation="horizontal" >
+
+ <com.android.inputmethod.leanback.LeanbackKeyboardView
+ android:id="@+id/main_keyboard"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clipChildren="false"
+ leanbackime:columnCount="11"
+ leanbackime:rowCount="5" />
+ </LinearLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignBottom="@id/keyboard"
+ android:layout_alignTop="@id/keyboard"
+ android:layout_centerHorizontal="true" >
+
+ <com.android.inputmethod.leanback.voice.RecognizerView
+ android:id="@+id/voice"
+ android:layout_width="@dimen/recognizer_size"
+ android:layout_height="@dimen/recognizer_size"
+ android:layout_gravity="center"
+ android:visibility="invisible" />
+ </FrameLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignBottom="@id/keyboard"
+ android:layout_alignParentRight="true"
+ android:layout_alignTop="@id/keyboard"
+ android:layout_toRightOf="@id/keyboard" >
+
+ <Button
+ android:id="@+id/enter"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/enter_key_height"
+ android:layout_gravity="center"
+ android:background="@null"
+ android:fontFamily="sans-serif-regular"
+ android:paddingLeft="@dimen/enter_key_padding_horizontal"
+ android:paddingRight="@dimen/enter_key_padding_horizontal"
+ android:text="@string/label_next_key"
+ android:textColor="@color/enter_key_font_color"
+ android:textSize="@dimen/enter_key_font_size" />
+ </FrameLayout>
+
+</RelativeLayout>
diff --git a/res/layout/recognizer_view.xml b/res/layout/recognizer_view.xml
new file mode 100644
index 0000000..acf4a53
--- /dev/null
+++ b/res/layout/recognizer_view.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2012 Google Inc. All Rights Reserved. -->
+<!-- Inline keyboard layout chrome, which includes the backspace and mode switcher buttons -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:recognizer="http://schemas.android.com/apk/res-auto"
+ android:layout_width="96dp"
+ android:layout_height="96dp"
+ android:gravity="center"
+ android:keepScreenOn="true"
+ android:orientation="vertical" >
+
+ <com.android.inputmethod.leanback.voice.BitmapSoundLevelView
+ android:id="@+id/microphone"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ recognizer:disabledBackgroundColor="@android:color/transparent"
+ recognizer:enabledBackgroundColor="@android:color/transparent"
+ recognizer:minLevelRadius="28dip"
+ recognizer:primaryLevels="?soundPrimaryLevel"
+ recognizer:trailLevels="?soundTrailLevel" />
+
+ <ImageView
+ android:id="@+id/recognizer_mic_button"
+ android:layout_width="@dimen/action_button_size"
+ android:layout_height="@dimen/action_button_size"
+ android:layout_gravity="center"
+ android:layout_marginLeft="16dp"
+ android:layout_marginTop="16dp"
+ android:scaleType="fitXY"
+ android:src="@drawable/ic_voice_available" >
+
+ <requestFocus />
+ </ImageView>
+
+</merge>
diff --git a/res/layout/root_leanback.xml b/res/layout/root_leanback.xml
new file mode 100644
index 0000000..587977b
--- /dev/null
+++ b/res/layout/root_leanback.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/root_ime"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|center_horizontal"
+ android:background="@color/keyboard_background"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:focusable="true"
+ android:gravity="bottom|center_horizontal"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/keyboard_bottom_spacing" >
+
+ <View
+ android:id="@+id/candidate_background"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignBottom="@+id/suggestions_container"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:background="@color/candidate_background" />
+
+ <HorizontalScrollView
+ android:id="@+id/suggestions_container"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/key_height"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginLeft="@dimen/candidate_scroll_view_horz_spacing"
+ android:layout_marginRight="@dimen/candidate_scroll_view_horz_spacing"
+ android:clipChildren="false"
+ android:fillViewport="false"
+ android:gravity="center"
+ android:scrollbars="none" >
+
+ <LinearLayout
+ android:id="@+id/suggestions"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clipChildren="false"
+ android:divider="@null"
+ android:gravity="center"
+ android:orientation="horizontal"
+ android:showDividers="middle" />
+ </HorizontalScrollView>
+
+ <LinearLayout
+ android:id="@+id/keyboard"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/suggestions_container"
+ android:layout_centerHorizontal="true"
+ android:clipChildren="false"
+ android:gravity="center"
+ android:paddingTop="@dimen/keyboard_top_spacing" >
+
+ <include layout="@layout/input_leanback" />
+ </LinearLayout>
+
+ <include layout="@layout/selector"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/res/layout/selector.xml b/res/layout/selector.xml
new file mode 100644
index 0000000..6ca2449
--- /dev/null
+++ b/res/layout/selector.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/selector"
+ android:layout_width="@dimen/selector_size"
+ android:layout_height="@dimen/selector_size"
+ android:clipChildren="false" >
+
+ <ImageView
+ android:id="@+id/key_selector"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:scaleType="centerInside"
+ android:background="@drawable/key_selector" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/raw/domain_en.dict b/res/raw/domain_en.dict
new file mode 100644
index 0000000..a687dcc
--- /dev/null
+++ b/res/raw/domain_en.dict
Binary files differ
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
new file mode 100644
index 0000000..1aec85e
--- /dev/null
+++ b/res/values-af/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g>-sleutelbord"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g>-sleutelbord"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Gaan"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Volgende"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Stuur"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Soek"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Klaar"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Sleutelbordopsies"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Bewegingsensitiwiteit"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Aan"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Af"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Spasie"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Modus verander"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Hoofletterslot"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Links"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Regs"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Prop \'n oorfoonstel in om te hoor hoe wagwoordsleutels hardop gesê word."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punt."</string>
+</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
new file mode 100644
index 0000000..f730d3b
--- /dev/null
+++ b/res/values-am/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"የ<xliff:g id="APP_NAME">Leanback</xliff:g> ቁልፍ ሰሌዳ"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"የ<xliff:g id="APP_NAME">Leanback</xliff:g> ቁልፍ ሰሌዳ"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"ሂድ"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"ቀጣይ"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"ላክ"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"ፍለጋ"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"ተከናውኗል"</string>
+ <string name="settings_title" msgid="8361325634803696047">"የቁልፍ ሰሌዳ አማራጮች"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"የእንቅስቃሴ ትብነት"</string>
+ <string name="btn_on" msgid="5962775761492765922">"በርቷል"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ጠፍቷል"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"ክፍተት"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"ሰርዝ"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"ሁነታ ቀይር"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ግራ"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ቀኝ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"የይለፍ ቃል ቁልፎች ሲነገሩ ለመስማት የጆሮ ማዳመጫ ይሰኩ።"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"ነጥብ።"</string>
+</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
new file mode 100644
index 0000000..e7aaf08
--- /dev/null
+++ b/res/values-ar/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"لوحة مفاتيح <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"لوحة مفاتيح <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"انتقال"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"التالي"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"إرسال"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"بحث"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"تم"</string>
+ <string name="settings_title" msgid="8361325634803696047">"خيارات لوحة المفاتيح"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"حساسية الحركة"</string>
+ <string name="btn_on" msgid="5962775761492765922">"تشغيل"</string>
+ <string name="btn_off" msgid="2029716012096104384">"إيقاف"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"مسافة"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"حذف"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"تغيير الوضع"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"لليسار"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"لليمين"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور عندما يتم نطقها."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"نقطة"</string>
+</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
new file mode 100644
index 0000000..ddb05a3
--- /dev/null
+++ b/res/values-bg/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Клавиатура за <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Клавиатура за <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Старт"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Напред"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Изпращане"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Търсене"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Готово"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Опции за клавиатурата"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Чувствителност на движението"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Включено"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Изключено"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Изтриване"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Промяна на режима"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Left"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Right"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Включете слушалки, за да чуете изговарянето на клавишите за паролата."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Точка."</string>
+</resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
new file mode 100644
index 0000000..75029d1
--- /dev/null
+++ b/res/values-bn-rBD/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> কীবোর্ড"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> কীবোর্ড"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"যান"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"পরবর্তী"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"পাঠান"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"অনুসন্ধান করুন"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"সম্পন্ন হয়েছে"</string>
+ <string name="settings_title" msgid="8361325634803696047">"কীবোর্ড বিকল্পগুলি"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"নড়াচড়ার সংবেদনশীলতা"</string>
+ <string name="btn_on" msgid="5962775761492765922">"চালু করুন"</string>
+ <string name="btn_off" msgid="2029716012096104384">"বন্ধ করুন"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"ব্যবধান"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete বোতাম"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mode change বোতাম"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift বোতাম"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"বাম"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ডান"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"উচ্চারিত পাসওয়ার্ডের কীগুলি শোনার জন্য একটি হেডসেট সংযুক্ত করুন৷"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot."</string>
+</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
new file mode 100644
index 0000000..d6b2672
--- /dev/null
+++ b/res/values-ca/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Teclat <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Teclat <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Vés-hi"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Següent"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Envia"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Cerca"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Fet"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opcions del teclat"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilitat del moviment"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Activa"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Desactiva"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Espai"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Suprimeix"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Canvi de mode"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Maj"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Bloq Maj"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Esquerra"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Dreta"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Connecta un auricular per escoltar les claus de la contrasenya en veu alta."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punt."</string>
+</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
new file mode 100644
index 0000000..57a7930
--- /dev/null
+++ b/res/values-cs/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Klávesnice <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Klávesnice <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Jít"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Další"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Odeslat"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Hledat"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Hotovo"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Možnosti klávesnice"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Citlivost pohybu"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Zapnout"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Vypnout"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Mezerník"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Smazat"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Změna režimu"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Vlevo"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Vpravo"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Chcete-li slyšet zadávání hesla, připojte sluchátka."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Tečka."</string>
+</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
new file mode 100644
index 0000000..68ab939
--- /dev/null
+++ b/res/values-da/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g>-tastatur"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g>-tastatur"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Start"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Næste"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Send"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Søg"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Færdig"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Valgmuligheder for tastatur"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Bevægelsesfølsomhed"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Til"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Fra"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Mellemrum"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Slet"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Ændring af tilstand"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Venstre"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Højre"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Tilslut et headset for at høre tasterne blive læst højt ved angivelse af adgangskode."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punktum."</string>
+</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
new file mode 100644
index 0000000..939fe46
--- /dev/null
+++ b/res/values-de/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g>-Tastatur"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g>-Tastatur"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Los"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Weiter"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Senden"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Suchen"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Fertig"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Tastaturoptionen"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Bewegungsempfindlichkeit"</string>
+ <string name="btn_on" msgid="5962775761492765922">"An"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Aus"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Leertaste"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Löschen"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Modusänderung"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Feststelltaste"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Nach links"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Nach rechts"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Schließen Sie ein Headset an, um das Passwort gesprochen zu hören."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punkt."</string>
+</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
new file mode 100644
index 0000000..704cbb9
--- /dev/null
+++ b/res/values-el/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Πληκτρολόγιο <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Πληκτρολόγιο <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Μετάβαση"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Επόμενο"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Αποστολή"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Αναζήτηση"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Τέλος"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Επιλογές πληκτρολογίου"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Ευαισθησία κίνησης"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Ενεργοποίηση"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Απενεργοποίηση"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Πλήκτρο διαστήματος"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Διαγραφή"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Αλλαγή τρόπου"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Αριστερά"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Δεξιά"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Συνδέστε ακουστικά για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Τελεία."</string>
+</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..f5070e3
--- /dev/null
+++ b/res/values-en-rAU/strings.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> Keyboard"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> Keyboard"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Go"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Next"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Send"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Search"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Finished"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Keyboard Options"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Movement sensitivity"</string>
+ <string name="btn_on" msgid="5962775761492765922">"On"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Off"</string>
+ <!-- no translation found for keyboardview_keycode_space (5107808792477329036) -->
+ <skip />
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mode change"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <!-- no translation found for keyboardview_keycode_caps (3870171746305993229) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_left (5982531325934405109) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_right (7152000779741202144) -->
+ <skip />
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Plug in a headset to hear password keys spoken."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot"</string>
+</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..ef28990
--- /dev/null
+++ b/res/values-en-rGB/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> keyboard"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> keyboard"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Go"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Next"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Send"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Search"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Finished"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Keyboard Options"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Movement sensitivity"</string>
+ <string name="btn_on" msgid="5962775761492765922">"On"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Off"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mode change"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Left"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Right"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Plug in a headset to hear password keys spoken."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot"</string>
+</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..ef28990
--- /dev/null
+++ b/res/values-en-rIN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> keyboard"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> keyboard"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Go"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Next"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Send"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Search"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Finished"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Keyboard Options"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Movement sensitivity"</string>
+ <string name="btn_on" msgid="5962775761492765922">"On"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Off"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mode change"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Left"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Right"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Plug in a headset to hear password keys spoken."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot"</string>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..7149986
--- /dev/null
+++ b/res/values-es-rUS/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Teclado de <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Teclado de <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Ir"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Siguiente"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Enviar"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Buscar"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Listo"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opciones del teclado"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilidad de movimiento"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Activar"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Desactivar"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Barra espaciadora"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Eliminar"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Cambio de modo"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Mayúscula"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Bloqueo de mayúscula"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Izquierda"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Derecha"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Conecta los auriculares para escuchar las contraseñas."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punto"</string>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
new file mode 100644
index 0000000..81737ba
--- /dev/null
+++ b/res/values-es/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Teclado de <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Teclado de <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Ir"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Siguiente"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Enviar"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Buscar"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Listo"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opciones del teclado"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilidad al movimiento"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Sí"</string>
+ <string name="btn_off" msgid="2029716012096104384">"No"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Espacio"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Eliminar"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Cambio de modo"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Mayús"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Bloq Mayús"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Flecha hacia la izquierda"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Flecha hacia la derecha"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Conecta un auricular para escuchar las contraseñas."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punto"</string>
+</resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..3eb2e3d
--- /dev/null
+++ b/res/values-et-rEE/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Rakend. <xliff:g id="APP_NAME">Leanback</xliff:g> klaviatuur"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Rakend. <xliff:g id="APP_NAME">Leanback</xliff:g> klaviatuur"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Mine"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Järgmine"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Saada"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Otsi"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Valmis"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Klaviatuuri valikud"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Liikumistundlikkus"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Sees"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Väljas"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Tühik"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Kustutamine"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Režiimi muutmine"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Tõstuklahv"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Suurklahvilukk"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Vasak"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Parem"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Paroolide kuulamiseks ühendage peakomplekt."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punkt."</string>
+</resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
new file mode 100644
index 0000000..f87cc13
--- /dev/null
+++ b/res/values-eu-rES/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> teklatua"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> teklatua"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Joan"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Hurrengoa"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Bidali"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Bilatu"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Eginda"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Teklatu-aukerak"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Mugimendu-sentsibilitatea"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Aktibatuta"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Desaktibatuta"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Zuriunea"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Ezabatu"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Modu-aldaketa"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Maius"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Blok Maius"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Ezkerrera"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Eskuinera"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Konektatu entzungailua pasahitzaren teklak ozen entzuteko."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Puntu."</string>
+</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
new file mode 100644
index 0000000..3d5a349
--- /dev/null
+++ b/res/values-fa/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"صفحهکلید <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"صفحهکلید <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"برو"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"بعدی"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"ارسال"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"جستجو"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"انجام شد"</string>
+ <string name="settings_title" msgid="8361325634803696047">"گزینههای صفحهکلید"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"حساسیت حرکت"</string>
+ <string name="btn_on" msgid="5962775761492765922">"فعال"</string>
+ <string name="btn_off" msgid="2029716012096104384">"خاموش"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"فاصله"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"حذف"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"تغییر حالت"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"چپ"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"راست"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"هدست را برای شنیدن کلیدهای گذرواژه که خوانده میشوند، وصل کنید."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"نقطه."</string>
+</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
new file mode 100644
index 0000000..53b2c28
--- /dev/null
+++ b/res/values-fi/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Näppäimistö – <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Näppäimistö – <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Siirry"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Seuraava"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Lähetä"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Haku"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Valmis"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Näppäimistöasetukset"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Liikeherkkyys"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Ota käyttöön"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Poista käytöstä"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Välilyönti"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Poista"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Tilan muutos"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Vasemmalle"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Oikealle"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Liitä kuulokkeet kuullaksesi, mitä näppäimiä painat kirjoittaessasi salasanaa."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Piste."</string>
+</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..823a4af
--- /dev/null
+++ b/res/values-fr-rCA/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Clavier <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Clavier <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Aller"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Suivant"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Envoyer"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Rechercher"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Terminé"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Options de clavier"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilité du mouvement"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Activer"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Désactiver"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Espace"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Supprimer"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Changement de mode"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Majuscule"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Verrouillage des majuscules"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Gauche"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Droite"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Branchez des écouteurs pour entendre l\'énoncé des touches lors de l\'entrée du mot de passe."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Point."</string>
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
new file mode 100644
index 0000000..9d32b37
--- /dev/null
+++ b/res/values-fr/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Clavier <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Clavier <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"OK"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Suivant"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Envoyer"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Rechercher"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"OK"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Options de clavier"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilité du déplacement"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Activer"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Désactiver"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Espace"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Supprimer"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Changement de mode"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Maj"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Verrouillage des majuscules"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Gauche"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Droite"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Branchez un casque pour entendre l\'énoncé des touches lors de la saisie du mot de passe."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Point."</string>
+</resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
new file mode 100644
index 0000000..3fe85bf
--- /dev/null
+++ b/res/values-gl-rES/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Teclado de <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Teclado de <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Ir"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Seguinte"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Enviar"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Buscar"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Feito"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opcións do teclado"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilidade do movemento"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Activar"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Desactivar"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Espazo"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Suprimir"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Cambio de modo"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Maiús"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Bloq maiús"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Esquerda"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Dereita"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Conecta uns auriculares para escoitar as teclas do contrasinal pronunciadas."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punto"</string>
+</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
new file mode 100644
index 0000000..a6e662a
--- /dev/null
+++ b/res/values-hi/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> कीबोर्ड"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> कीबोर्ड"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"जाएं"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"अगला"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"भेजें"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"खोजें"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"पूर्ण"</string>
+ <string name="settings_title" msgid="8361325634803696047">"कीबोर्ड विकल्प"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"गतिविधि की संवेदनशीलता"</string>
+ <string name="btn_on" msgid="5962775761492765922">"चालू"</string>
+ <string name="btn_off" msgid="2029716012096104384">"बंद"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mode change"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Left"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Right"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"बोली गईं पासवर्ड कुंजियां सुनने के लिए हैडसेट प्लग इन करें."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot."</string>
+</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
new file mode 100644
index 0000000..bb3c7a6
--- /dev/null
+++ b/res/values-hr/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> tipkovnica"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> tipkovnica"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Idi"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Dalje"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Pošalji"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Pretraži"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Gotovo"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opcije tipkovnice"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Osjetljivost pokreta"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Uključi"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Isključi"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Razmaknica"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Izbriši"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Promjena načina"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Velika slova"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Lijevo"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Desno"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Priključite slušalice kako biste čuli izgovaranje tipki zaporke."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Točka."</string>
+</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
new file mode 100644
index 0000000..9bd6e0e
--- /dev/null
+++ b/res/values-hu/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g>-billentyűzet"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g>-billentyűzet"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Mehet"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Tovább"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Küldés"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Keresés"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Kész"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Billentyűzetbeállítások"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Mozgásérzékenység"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Bekapcsolva"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Kikapcsolva"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Szóköz"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Törlés"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mód váltása"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Bal"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Jobb"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Csatlakoztasson egy fülhallgatót, ha hallani szeretné a jelszó betűit felolvasva."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Pont."</string>
+</resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..5506ca5
--- /dev/null
+++ b/res/values-hy-rAM/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> ստեղնաշար"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> ստեղնաշար"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Առաջ"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Հաջորդը"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Ուղարկել"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Որոնում"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Պատրաստ է"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Ստեղնաշարի ընտրանքներ"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Շարժման զգայունությունը"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Միացնել"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Անջատել"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Բացատ"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Ջնջել"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Ռեժիմի փոփոխում"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Ձախ"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Աջ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Միացրեք ականջակալները` արտասանվող գաղտնաբառը լսելու համար:"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Կետ:"</string>
+</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
new file mode 100644
index 0000000..2c97330
--- /dev/null
+++ b/res/values-in/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Keyboard <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Keyboard <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Buka"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Berikutnya"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Kirim"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Penelusuran"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Selesai"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opsi Keyboard"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensitivitas gerakan"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Aktif"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Nonaktif"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Spasi"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Pengubahan mode"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Kiri"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Kanan"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Pasang headset untuk mendengar tombol sandi yang diucapkan."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Titik."</string>
+</resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
new file mode 100644
index 0000000..6b5e0fb
--- /dev/null
+++ b/res/values-is-rIS/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> lyklaborð"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> lyklaborð"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Áfram"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Næsta"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Senda"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Leita"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Lokið"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Valkostir lyklaborðs"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Hreyfinæmi"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Kveikt"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Slökkt"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Bil"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Eyða"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Breyta stillingu"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Hástafalás"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Vinstri"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Hægri"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Tengdu heyrnartól til að heyra stafi aðgangsorðsins lesna upphátt."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punktur."</string>
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
new file mode 100644
index 0000000..671db4c
--- /dev/null
+++ b/res/values-it/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Tastiera <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Tastiera <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Vai"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Avanti"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Invia"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Cerca"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Fine"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opzioni tastiera"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilità movimento"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Attiva"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Disattiva"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Spazio"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Elimina"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Cambio modalità"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Maiusc"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Bloc Maiusc"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Sinistra"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Destra"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punto."</string>
+</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
new file mode 100644
index 0000000..f426214
--- /dev/null
+++ b/res/values-iw/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"מקלדת <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"מקלדת <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"המשך"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"הבא"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"שלח"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"חפש"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"בוצע"</string>
+ <string name="settings_title" msgid="8361325634803696047">"אפשרויות מקלדת"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"רגישות תנועה"</string>
+ <string name="btn_on" msgid="5962775761492765922">"פועל"</string>
+ <string name="btn_off" msgid="2029716012096104384">"כבוי"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"רווח"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"מחיקה"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"שינוי מצב"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"נעילת מקש CAPS"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"שמאלה"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ימינה"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"חבר אוזניות כדי לשמוע הקראה של מפתחות סיסמה."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"נקודה."</string>
+</resources>
diff --git a/res/values-ja/bools.xml b/res/values-ja/bools.xml
new file mode 100644
index 0000000..0d082bb
--- /dev/null
+++ b/res/values-ja/bools.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+<resources>
+ <!-- Whether this input method should be used as the default for a locale. Override it
+ for supported languages. -->
+ <bool name="im_is_default">false</bool>
+</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
new file mode 100644
index 0000000..412337b
--- /dev/null
+++ b/res/values-ja/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g>キーボード"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g>キーボード"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"検索"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"次へ"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"送信"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"検索"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"完了"</string>
+ <string name="settings_title" msgid="8361325634803696047">"キーボードオプション"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"動作感度"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ON"</string>
+ <string name="btn_off" msgid="2029716012096104384">"OFF"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"削除"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"モードを変更"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"CapsLock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"←"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"→"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"パスワードのキーが音声出力されるのでヘッドセットを接続してください。"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"ドット。"</string>
+</resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..23b4c75
--- /dev/null
+++ b/res/values-ka-rGE/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g>-ის კლავიატურა"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g>-ის კლავიატურა"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"გადასვლა"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"შემდეგი"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"გაგზავნა"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"ძიება"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"დასრულება"</string>
+ <string name="settings_title" msgid="8361325634803696047">"კლავიატურის პარამეტრები"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"მოძრაობის მგრძობიარობა"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ჩართული"</string>
+ <string name="btn_off" msgid="2029716012096104384">"გამორთული"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"შორისი"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"წაშლა"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"რეჟიმის შეცვლა"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"მარცხენა"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"მარჯვენა"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"შეაერთეთ ყურსაცვამი, რათა მოისმინოთ აკრეფილი პაროლის კლავიშების სახელები."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"წერტილი."</string>
+</resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
new file mode 100644
index 0000000..5aea1b8
--- /dev/null
+++ b/res/values-kk-rKZ/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> пернетақтасы"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> пернетақтасы"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Өту"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Келесі"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Жіберу"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Іздеу"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Дайын"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Пернетақта опциялары"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Қозғалысқа сезімталдық"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Қосулы"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Өшірулі"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Бос орын"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Жою"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Режимді өзгерту"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Солға"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Оңға"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Құпия сөз пернелерін есту үшін құлақаспап жинағын қосыңыз."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Нүкте."</string>
+</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..253bda2
--- /dev/null
+++ b/res/values-km-rKH/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"ក្ដារចុច <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"ក្ដារចុច <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"ទៅ"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"បន្ទាប់"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"ផ្ញើ"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"ស្វែងរក"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"ធ្វើរួច"</string>
+ <string name="settings_title" msgid="8361325634803696047">"ជម្រើសក្ដារចុច"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"ភាពប្រែប្រួលដោយចលនា"</string>
+ <string name="btn_on" msgid="5962775761492765922">"បើក"</string>
+ <string name="btn_off" msgid="2029716012096104384">"បិទ"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"ដកឃ្លា"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"លុប"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"ផ្លាស់ប្ដូររបៀប"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ឆ្វេង"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ស្ដាំ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"ដោតកាសដើម្បីស្ដាប់ពាក្យសម្ងាត់បាននិយាយ។"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"ចុច."</string>
+</resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
new file mode 100644
index 0000000..7e1818d
--- /dev/null
+++ b/res/values-kn-rIN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> ಕೀಬೋರ್ಡ್"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> ಕೀಬೋರ್ಡ್"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"ಹೋಗು"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"ಮುಂದೆ"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"ಕಳುಹಿಸು"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"ಹುಡುಕಾಟ"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"ಮುಗಿದಿದೆ"</string>
+ <string name="settings_title" msgid="8361325634803696047">"ಕೀಬೋರ್ಡ್ ಆಯ್ಕೆಗಳು"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"ಚಲನೆ ಸೂಕ್ಷ್ಮತೆ"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ಆನ್"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ಆಫ್"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"ಸ್ಪೇಸ್"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"ಅಳಿಸು"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"ಮೋಡ್ ಬದಲಾವಣೆ"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ತೊರೆಯಲಾಗಿದೆ"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ಸರಿಯಾಗಿದೆ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"ಪಾಸ್ವರ್ಡ್ ಕೀಗಳನ್ನು ಆಲಿಸಲು ಹೆಡ್ಸೆಟ್ ಪ್ಲಗ್ ಇನ್ ಮಾಡಿ."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"ಡಾಟ್."</string>
+</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
new file mode 100644
index 0000000..66eab17
--- /dev/null
+++ b/res/values-ko/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> 키보드"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> 키보드"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"이동"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"다음"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"보내기"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"검색"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"완료"</string>
+ <string name="settings_title" msgid="8361325634803696047">"키보드 옵션"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"움직임 민감도"</string>
+ <string name="btn_on" msgid="5962775761492765922">"사용"</string>
+ <string name="btn_off" msgid="2029716012096104384">"사용 안함"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"스페이스바"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"삭제"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"모드 변경"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"왼쪽"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"오른쪽"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"비밀번호 키를 음성으로 들으려면 헤드셋을 연결하세요."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"점"</string>
+</resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
new file mode 100644
index 0000000..5642834
--- /dev/null
+++ b/res/values-ky-rKG/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> Баскычтоп"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> Баскычтоп"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Өтүү"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Кийинки"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Жөнөтүү"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Издөө"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Бүттү"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Баскычтоп параметрлери"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Кыймылды сезгичтик"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Күйүк"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Өчүк"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Боштук"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Жок кылуу"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Режимди өзгөртүү"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Солго"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Оңго"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Айтылган сырсөз ачкычтарын угуу үчүн, гарнитураны туташтырыңыз."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Чекит."</string>
+</resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..4247506
--- /dev/null
+++ b/res/values-lo-rLA/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"ແປ້ນພິມ <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"ແປ້ນພິມ <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"ໄປ"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"ຕໍ່ໄປ"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"ສົ່ງ"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"ຊອກຫາ"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"ແລ້ວໆ"</string>
+ <string name="settings_title" msgid="8361325634803696047">"ໂຕເລືອກແປ້ນພິມ"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"ຄວາມລະອຽດການເຄື່ອນໄຫວ"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ເປີດ"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ປິດ"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"ຍະຫວ່າງ"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"ລຶບ"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"ປ່ຽນຮູບແບບ"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ຊ້າຍ"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ຂວາ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"ສຽບຫູຟັງເພື່ອຟັງລະຫັດຜ່ານ."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"ຈໍ້າເມັດ."</string>
+</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
new file mode 100644
index 0000000..29b43d2
--- /dev/null
+++ b/res/values-lt/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"„<xliff:g id="APP_NAME">Leanback</xliff:g>“ klaviatūra"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"„<xliff:g id="APP_NAME">Leanback</xliff:g>“ klaviatūra"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Eiti"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Kitas"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Siųsti"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Ieškoti"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Atlikta"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Klaviatūros parinktys"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Judesio jautrumas"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Įjungti"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Išjungti"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Tarpo klavišas"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mode change"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Didžiųjų raidžių klavišas"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Kairėn"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Dešinėn"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Prijunkite ausines, kad galėtumėte girdėti sakomus slaptažodžio klavišus."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Taškas."</string>
+</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
new file mode 100644
index 0000000..4921b72
--- /dev/null
+++ b/res/values-lv/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> tastatūra"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> tastatūra"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Sākt"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Tālāk"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Sūtīt"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Meklēt"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Gatavs"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Tastatūras iespējas"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Kustības sensitivitāte"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Ieslēgts"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Izslēgts"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Atstarpēšanas taustiņš"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Dzēšanas taustiņš"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Režīma maiņas taustiņš"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Pārslēgšanas taustiņš"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Burtslēga taustiņš"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Pa kreisi"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Pa labi"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Pievienojiet austiņas, lai dzirdētu paroles taustiņu nosaukumus."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punkta taustiņš"</string>
+</resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
new file mode 100644
index 0000000..d3bc81f
--- /dev/null
+++ b/res/values-mk-rMK/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> тастатура"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> тастатура"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Оди"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Следно"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Прати"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Пребарување"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Готово"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Опции за тастатура"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Чувствителност на движење"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Вклучи"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Исклучи"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Празно место"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Бришење"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Копче „Промени режим“"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Копче „Shift“"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Лево"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Десно"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Приклучи слушалки да ги слушнеш изговорените лозинки."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Точка."</string>
+</resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
new file mode 100644
index 0000000..72b7668
--- /dev/null
+++ b/res/values-ml-rIN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> കീബോർഡ്"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> കീബോർഡ്"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"പോകുക"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"അടുത്തത്"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"അയയ്ക്കുക"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"തിരയുക"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"പൂർത്തിയാക്കി"</string>
+ <string name="settings_title" msgid="8361325634803696047">"കീബോർഡ് ഓപ്ഷനുകൾ"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"ചലന സംവേദനക്ഷമത"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ഓണാക്കുക"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ഓഫാക്കുക"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"സ്പെയ്സ്"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"ഇല്ലാതാക്കുക"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"മോഡ് മാറ്റം"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"ക്യാപ്സ് ലോക്ക്"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ഇടതുഭാഗത്തേക്ക്"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"വലതുഭാഗത്തേക്ക്"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"പറയുന്ന പാസ്വേഡ് കീകൾ കേൾക്കുന്നതിന് ഒരു ഹെഡ്സെറ്റ് പ്ലഗ്ഗുചെയ്യുക."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"ഡോട്ട്."</string>
+</resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..1117c70
--- /dev/null
+++ b/res/values-mn-rMN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> Гар"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> Гар"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Цааш"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Дараах"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Илгээх"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Хайх"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Дууссан"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Гарын сонголтууд"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Хөдөлгөөн мэдрэлт"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Идэвхтэй"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Идэвхгүй"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Хоосон зай"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Устгах"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Горим өөрчлөх"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Шифт"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Зүүн"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Баруун"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Нууц үгний дуудлагыг сонсох бол чихэвчийг залгана уу."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Цэг."</string>
+</resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
new file mode 100644
index 0000000..26cb220
--- /dev/null
+++ b/res/values-mr-rIN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> कीबोर्ड"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> कीबोर्ड"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"जा"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"पुढील"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"पाठवा"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"शोधा"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"पूर्ण झाले"</string>
+ <string name="settings_title" msgid="8361325634803696047">"कीबोर्ड पर्याय"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"हालचाल संवेदनशीलता"</string>
+ <string name="btn_on" msgid="5962775761492765922">"चालू"</string>
+ <string name="btn_off" msgid="2029716012096104384">"बंद"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"हटवा"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"मोड बदल"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"डावे"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"उजवे"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"बोलणाऱ्या संकेतशब्द की ऐकण्यासाठी हेडसेट लावा."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"बिंदू."</string>
+</resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..bcfc566
--- /dev/null
+++ b/res/values-ms-rMY/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Papan Kekunci <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Papan Kekunci <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Pergi"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Seterusnya"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Hantar"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Carian"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Selesai"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Pilihan Papan Kekunci"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Kepekaan pergerakan"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Hidup"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Mati"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Ruang"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Padam"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Pertukaran mod"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Kiri"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Kanan"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Pasangkan set kepala untuk mendengar kekunci kata laluan disebutkan."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Titik."</string>
+</resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
new file mode 100644
index 0000000..9774e40
--- /dev/null
+++ b/res/values-my-rMM/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> ကီးဘုတ်"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> ကီးဘုတ်"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"သွားပါ"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"ရှေ့သို့"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"ပို့ရန်"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"ရှာဖွေရန်"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"လုပ်ပြီး"</string>
+ <string name="settings_title" msgid="8361325634803696047">"ကီးဘုတ် ရွေးစရာများ"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"လှုပ်ရှားမှု အာရုံခံနိုင်စွမ်း"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ဖွင့်ရန်"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ပိတ်ထား"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"စပေ့စ်ကီး"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"ဖျက်ရန်"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"မုဒ် ခလုတ်"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"စာလုံးကြီး သော့ပိတ်"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ဘယ်"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ညာ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"စကားဝှက်ကို နှုတ်ထွက် ပြောဆိုမှုကို ကြားနိုင်ရန် ဟက်ဆက်ကို ပလပ်ထိုး နားထောင်ပါ။"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot."</string>
+</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
new file mode 100644
index 0000000..1c21187
--- /dev/null
+++ b/res/values-nb/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Tastatur for <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Tastatur for <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Utfør"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Neste"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Send"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Søk"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Ferdig"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Tastaturalternativer"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Bevegelsesfølsomhet"</string>
+ <string name="btn_on" msgid="5962775761492765922">"På"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Av"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Mellomrom"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Slett"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Modusendring"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Skift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Venstre"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Høyre"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Koble til hodetelefoner for å høre opplesing av bokstavene i passordet."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punktum."</string>
+</resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..81b6ff7
--- /dev/null
+++ b/res/values-ne-rNP/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> कीबोर्ड"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> कीबोर्ड"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"जानु"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"अर्को"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"पठाउनुहोस्"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"खोजी गर्नुहोस्"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"भयो"</string>
+ <string name="settings_title" msgid="8361325634803696047">"कीबोर्ड विकल्पहरू"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"गतिविधि संवेदनशीलता"</string>
+ <string name="btn_on" msgid="5962775761492765922">"खुल्ला गर्नुहोस्"</string>
+ <string name="btn_off" msgid="2029716012096104384">"बन्द गर्नुहोस्"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"स्पेस"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"मेटाउनुहोस्"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"मोड परिवर्तन गर्नुहोस्"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"सिफ्ट"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"क्याप्स लक"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"बायाँ"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"दायाँ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"बोलिएको पासवर्ड कुञ्जीहरू सुन्नको लागि हेडसेट प्लग इन गर्नुहोस्।"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot."</string>
+</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
new file mode 100644
index 0000000..7d284f0
--- /dev/null
+++ b/res/values-nl/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Toetsenbord voor <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Toetsenbord voor <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Gaan"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Volgende"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Verzenden"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Zoeken"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Gereed"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Toetsenbordopties"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Gevoeligheid beweging"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Aan"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Uit"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Spatiebalk"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Verwijderen"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Modus wijzigen"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Links"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Rechts"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Sluit een headset aan om wachtwoordtoetsen te laten voorlezen."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Stip."</string>
+</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
new file mode 100644
index 0000000..5d2b3ba
--- /dev/null
+++ b/res/values-pl/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Klawiatura <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Klawiatura <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"OK"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Dalej"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Wyślij"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Szukaj"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Gotowe"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opcje klawiatury"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Czułość ruchu"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Wł."</string>
+ <string name="btn_off" msgid="2029716012096104384">"Wył."</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Spacja"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Delete"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Zmiana trybu"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"W lewo"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"W prawo"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Podłącz zestaw słuchawkowy, by wysłuchać znaków hasła wypowiadanych na głos."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Kropka"</string>
+</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..4b12c7a
--- /dev/null
+++ b/res/values-pt-rPT/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Teclado <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Teclado <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"OK"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Seguinte"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Enviar"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Pesquisar"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Concluído"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opções do teclado"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilidade do movimento"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Ativado"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Desativado"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Espaço"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Eliminar"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Alteração do modo"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Esquerdo"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Direito"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Ligue os auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Ponto."</string>
+</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
new file mode 100644
index 0000000..0b89d25
--- /dev/null
+++ b/res/values-pt/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Teclado do <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Teclado do <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Ir"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Próximo"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Enviar"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Pesquisar"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Concluído"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opções de teclado"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilidade de movimento"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Ativar"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Desativar"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Espaço"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Excluir"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Alteração do modo"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Esquerdo"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Direito"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Conecte um fone de ouvido para ouvir as teclas da senha."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Ponto."</string>
+</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
new file mode 100644
index 0000000..d71f6a2
--- /dev/null
+++ b/res/values-ro/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Tastatură <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Tastatură <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Accesați"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Înainte"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Trimiteți"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Căutați"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Terminat"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Opțiuni pentru tastatură"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Sensibilitatea la mișcare"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Activați"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Dezactivați"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Spațiu"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Ștergeți"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Schimbare mod"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Scriere cu majuscule"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Stânga"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Dreapta"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Conectați un set căști-microfon pentru a auzi tastele apăsate când introduceți parola."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punct."</string>
+</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
new file mode 100644
index 0000000..1663b1d
--- /dev/null
+++ b/res/values-ru/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Клавиатура <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Клавиатура <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"ОК"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Далее"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Отправить"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Поиск"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Готово"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Настройки клавиатуры"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Обработка движений"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ВКЛ"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ВЫКЛ"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Пробел."</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Удалить"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Смена режима"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Стрелка влево"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Стрелка вправо"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Подключите гарнитуру, чтобы услышать пароль."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Точка"</string>
+</resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..cea8300
--- /dev/null
+++ b/res/values-si-rLK/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> යතුරු පුවරුව"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> යතුරු පුවරුව"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"යන්න"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"මීළඟ"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"යවන්න"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"සොයන්න"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"අවසන්"</string>
+ <string name="settings_title" msgid="8361325634803696047">"යතුරුපුවරු විකල්ප"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"සංචලන සංවේදීතාවය"</string>
+ <string name="btn_on" msgid="5962775761492765922">"සක්රිය කරන්න"</string>
+ <string name="btn_off" msgid="2029716012096104384">"අක්රිය කරන්න"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"මකන්න"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"ආකාරය වෙනස් කරන්න"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"ෂිෆ්ට්"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"කැප්ස් ලොක්"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"වම"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"දකුණ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"මුරපද යතුරු කියවනු ඇසීමට හෙඩ්සෙටයක් සම්බන්ධ කරන්න."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"නැවතුම."</string>
+</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
new file mode 100644
index 0000000..7b1e7b7
--- /dev/null
+++ b/res/values-sk/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Klávesnica <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Klávesnica <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Spustiť"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Ďalej"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Odoslať"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Hľadať"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Hotovo"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Možnosti klávesnice"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Citlivosť pohybu"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Zapnúť"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Vypnúť"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Medzerník"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Odstrániť"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Zmena režimu"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Doľava"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Doprava"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Ak si chcete vypočuť vyslovené klávesy hesla, pripojte náhlavnú súpravu."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Bodka."</string>
+</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
new file mode 100644
index 0000000..5c1b4d5
--- /dev/null
+++ b/res/values-sl/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Tipkovnica <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Tipkovnica <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Pojdi"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Naprej"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Pošlji"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Iskanje"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Končano"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Možnosti tipkovnice"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Občutljivost premikanja"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Vklop"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Izklop"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Preslednica"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Izbriši"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Sprememba načina"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Levo"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Desno"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Priključite slušalke, da boste slišali izgovorjene tipke gesla."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Pika."</string>
+</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
new file mode 100644
index 0000000..4e0fb34
--- /dev/null
+++ b/res/values-sr/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> тастатура"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> тастатура"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Иди"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Даље"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Пошаљи"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Претрага"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Готово"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Опције тастатуре"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Осетљивост покрета"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Укључи"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Искључи"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Размак"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Избришите"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Промена режима"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Лево"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Десно"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Прикључите слушалице да бисте чули изговорене тастере за лозинку."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Тачка."</string>
+</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
new file mode 100644
index 0000000..84b8c74
--- /dev/null
+++ b/res/values-sv/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Tangentbord för <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Tangentbord för <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"OK"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Nästa"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Skicka"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Sök"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Klar"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Tangentbordsalternativ"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Rörelsekänslighet"</string>
+ <string name="btn_on" msgid="5962775761492765922">"På"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Av"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Blanksteg"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Ta bort"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Funktionsändring"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Skift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Vänster"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Höger"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Anslut hörlurar om du vill höra lösenordet tecken för tecken."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Punkt."</string>
+</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
new file mode 100644
index 0000000..7fb5a3f
--- /dev/null
+++ b/res/values-sw/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Kibodi ya <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Kibodi ya <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Nenda"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Inayofuata"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Tuma"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Tafuta"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Imekamilisha"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Chaguo za Kibodi"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Kiwango cha hisi cha matembezi"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Washwa"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Zima"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Nafasi"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Futa"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Hali ya mabadiliko"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Kushoto"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Kulia"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Chomeka kifaa cha sauti ili kusikiliza herufi za nenosiri zikitamkwa."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Nukta."</string>
+</resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
new file mode 100644
index 0000000..b3de77e
--- /dev/null
+++ b/res/values-ta-rIN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> விசைப்பலகை"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> விசைப்பலகை"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"செல்"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"அடுத்து"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"அனுப்பு"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"தேடு"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"முடிந்தது"</string>
+ <string name="settings_title" msgid="8361325634803696047">"விசைப்பலகை விருப்பங்கள்"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"அசைவை உணரும் திறன்"</string>
+ <string name="btn_on" msgid="5962775761492765922">"இயக்கு"</string>
+ <string name="btn_off" msgid="2029716012096104384">"முடக்கு"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"இடைவெளி"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"நீக்கு"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"முறையை மாற்று"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"ஷிஃப்டு"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"கேப்ஸ் லாக்"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"இடது"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"வலது"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"கூறப்படும் கடவுச்சொல் விசைகளைக் கேட்பதற்கு ஹெட்செட்டைச் செருகவும்."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"புள்ளி."</string>
+</resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
new file mode 100644
index 0000000..f8d3d45
--- /dev/null
+++ b/res/values-te-rIN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> కీబోర్డ్"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> కీబోర్డ్"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"వెళ్లు"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"తదుపరి"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"పంపు"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"శోధించు"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"పూర్తయింది"</string>
+ <string name="settings_title" msgid="8361325634803696047">"కీబోర్డ్ ఎంపికలు"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"చలన సున్నితత్వం"</string>
+ <string name="btn_on" msgid="5962775761492765922">"ఆన్ చేయి"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ఆఫ్ చేయి"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"తొలగించు"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"మోడ్ని మార్చు"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ఎడమ"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"కుడి"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"చదివి వినిపించే పాస్వర్డ్ కీలను వినడానికి హెడ్సెట్ను ప్లగిన్ చేయండి."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"చుక్క."</string>
+</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
new file mode 100644
index 0000000..a1f3d54
--- /dev/null
+++ b/res/values-th/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"แป้นพิมพ์ <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"แป้นพิมพ์ <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"ไป"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"ถัดไป"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"ส่ง"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"ค้นหา"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"เสร็จสิ้น"</string>
+ <string name="settings_title" msgid="8361325634803696047">"ตัวเลือกแป้นพิมพ์"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"ความไวในการเคลื่อนที่"</string>
+ <string name="btn_on" msgid="5962775761492765922">"เปิด"</string>
+ <string name="btn_off" msgid="2029716012096104384">"ปิด"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"วรรค"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"ลบ"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"เปลี่ยนโหมด"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"ซ้าย"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"ขวา"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"เสียบชุดหูฟังเพื่อฟังเสียงรหัสผ่าน"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"เครื่องหมายจุด"</string>
+</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
new file mode 100644
index 0000000..3629649
--- /dev/null
+++ b/res/values-tl/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> Keyboard"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> Keyboard"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Magpatuloy"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Susunod"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Ipadala"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Maghanap"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Tapos na"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Mga Opsyon ng Keyboard"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Pagkasensitibo sa galaw"</string>
+ <string name="btn_on" msgid="5962775761492765922">"I-on"</string>
+ <string name="btn_off" msgid="2029716012096104384">"I-off"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Space"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Tanggalin"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Pagbabago ng Mode"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Kaliwa"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Kanan"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Mag-plug in ng isang headset upang marinig ang mga binabanggit na password key."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dot."</string>
+</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
new file mode 100644
index 0000000..aedb238
--- /dev/null
+++ b/res/values-tr/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> Klavyesi"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> Klavyesi"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Git"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"İleri"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Gönder"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Ara"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Bitti"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Klavye Seçenekleri"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Hareket duyarlılığı"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Aç"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Kapat"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Boşluk"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Sil"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Mod değiştir"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"ÜstKrktr"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Sol"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Sağ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Şifre tuşlarının sesli okunmasını dinlemek için mikrofonlu kulaklık takın."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Nokta."</string>
+</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
new file mode 100644
index 0000000..4c7cbae
--- /dev/null
+++ b/res/values-uk/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Клавіатура додатка <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Клавіатура додатка <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Виконати"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Далі"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Надіслати"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Пошук"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Готово"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Параметри клавіатури"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Чутливість руху"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Увімкнути"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Вимкнути"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Пробіл"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Видалити"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Зміна режиму"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Клавіша Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Ліворуч"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Праворуч"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Підключіть гарнітуру, щоб почути символи пароля."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Крапка."</string>
+</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
new file mode 100644
index 0000000..f1ec9cb
--- /dev/null
+++ b/res/values-vi/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Bàn phím <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Bàn phím <xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Tìm"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Tiếp theo"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Gửi"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Tìm kiếm"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Xong"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Tùy chọn bàn phím"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Độ nhạy của chuyển động"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Bật"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Tắt"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Dấu cách"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Xóa"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Thay đổi chế độ"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Bên trái"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Bên phải"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Cắm tai nghe để nghe các phím mật khẩu được đọc."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Dấu chấm."</string>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..60acbd2
--- /dev/null
+++ b/res/values-zh-rCN/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g>键盘"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g>键盘"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"前往"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"下个"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"发送"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"搜索"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"完成"</string>
+ <string name="settings_title" msgid="8361325634803696047">"键盘选项"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"移动灵敏度"</string>
+ <string name="btn_on" msgid="5962775761492765922">"开启"</string>
+ <string name="btn_off" msgid="2029716012096104384">"关闭"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"空格键"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"删除"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"模式更改"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift 键"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"大写锁定"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"向左键"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"向右键"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"需要插入耳机才能听到密码的按键声。"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"点。"</string>
+</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..0082566
--- /dev/null
+++ b/res/values-zh-rHK/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> 鍵盤"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> 鍵盤"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"前往"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"下一頁"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"傳送"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"搜尋"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"完成"</string>
+ <string name="settings_title" msgid="8361325634803696047">"鍵盤選項"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"移動敏感度"</string>
+ <string name="btn_on" msgid="5962775761492765922">"開啟"</string>
+ <string name="btn_off" msgid="2029716012096104384">"關閉"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"空格鍵"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"刪除"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"模式變更"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift 鍵"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock 鍵"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"向左鍵"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"向右鍵"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"插上耳機即可聽到系統讀出密碼鍵。"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"點。"</string>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..c29fe72
--- /dev/null
+++ b/res/values-zh-rTW/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"<xliff:g id="APP_NAME">Leanback</xliff:g> 鍵盤"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"<xliff:g id="APP_NAME">Leanback</xliff:g> 鍵盤"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"執行"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"下一個"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"傳送"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"搜尋"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"完成"</string>
+ <string name="settings_title" msgid="8361325634803696047">"鍵盤選項"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"移動敏感度"</string>
+ <string name="btn_on" msgid="5962775761492765922">"開啟"</string>
+ <string name="btn_off" msgid="2029716012096104384">"關閉"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"空格鍵"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"刪除"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"模式變更"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"Shift 鍵"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"Caps Lock 鍵"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"向左鍵"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"向右鍵"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"連接耳機方能聽到密碼按鍵語音。"</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"點。"</string>
+</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
new file mode 100644
index 0000000..a678b71
--- /dev/null
+++ b/res/values-zu/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="ime_name" msgid="5170587665791476108">"Ikhibhodi ye-<xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="ime_service_name" msgid="3865311183421593944">"Ikhibhodi ye-<xliff:g id="APP_NAME">Leanback</xliff:g>"</string>
+ <string name="label_go_key" msgid="7845894543312353655">"Hamba"</string>
+ <string name="label_next_key" msgid="8149787729891612242">"Okulandelayo"</string>
+ <string name="label_send_key" msgid="1803138506603147503">"Thumela"</string>
+ <string name="label_search_key" msgid="8540828292920277213">"Sesha"</string>
+ <string name="label_done_key" msgid="4570417022685876778">"Kwenziwe"</string>
+ <string name="settings_title" msgid="8361325634803696047">"Izinketho zekhibhodi"</string>
+ <string name="title_movement_sensitivity" msgid="4289584473719351587">"Ukuzwela kokuhamba"</string>
+ <string name="btn_on" msgid="5962775761492765922">"Vuliwe"</string>
+ <string name="btn_off" msgid="2029716012096104384">"Valiwe"</string>
+ <string name="keyboardview_keycode_space" msgid="5107808792477329036">"Isikhala"</string>
+ <string name="keyboardview_keycode_delete" msgid="8234736233323594641">"Susa"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="1942413151586211565">"Ukushintsha kwemodi"</string>
+ <string name="keyboardview_keycode_shift" msgid="1088869515399768583">"U-Shift"</string>
+ <string name="keyboardview_keycode_caps" msgid="3870171746305993229">"U-Caps Lock"</string>
+ <string name="keyboardview_keycode_left" msgid="5982531325934405109">"Kwesobunxele"</string>
+ <string name="keyboardview_keycode_right" msgid="7152000779741202144">"Kwesokudla"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="2529485509348781553">"Xhuma kokwasekhanda ukuze uzwe kukhulunywa okhiye bephasiwedi."</string>
+ <string name="keyboard_password_character_no_headset" msgid="7230328211341305612">"Icashazi."</string>
+</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
new file mode 100644
index 0000000..0553689
--- /dev/null
+++ b/res/values/attrs.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+<resources>
+
+ <declare-styleable name="LeanbackKeyboardView">
+ <attr name="rowCount" format="integer" />
+ <attr name="columnCount" format="integer" />
+ </declare-styleable>
+
+ <!-- voice recognition indicator -->
+ <attr name="enabledBackgroundColor" format="color|reference" />
+ <attr name="disabledBackgroundColor" format="color|reference" />
+ <attr name="primaryLevels" format="reference" />
+ <attr name="trailLevels" format="reference" />
+ <attr name="minLevelRadius" format="dimension|reference" />
+ <attr name="levelsCenterX" format="dimension|reference" />
+ <attr name="levelsCenterY" format="dimension|reference" />
+ <attr name="headerAlpha" format="dimension" />
+ <attr name="soundTrailLevel" format="reference" />
+ <attr name="soundPrimaryLevel" format="reference" />
+
+ <declare-styleable name="BitmapSoundLevelView">
+ <attr name="enabledBackgroundColor" />
+ <attr name="disabledBackgroundColor" />
+ <attr name="primaryLevels" />
+ <attr name="trailLevels" />
+ <attr name="minLevelRadius" />
+ <attr name="levelsCenterX" />
+ <attr name="levelsCenterY" />
+ </declare-styleable>
+
+</resources>
\ No newline at end of file
diff --git a/res/values/bools.xml b/res/values/bools.xml
new file mode 100644
index 0000000..a882710
--- /dev/null
+++ b/res/values/bools.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, 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.
+*/
+-->
+<resources>
+ <!-- Whether this input method should be used as the default for a locale. Override it
+ for supported languages. -->
+ <bool name="im_is_default">true</bool>
+</resources>
diff --git a/res/values/color.xml b/res/values/color.xml
new file mode 100644
index 0000000..836bc5d
--- /dev/null
+++ b/res/values/color.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources>
+
+ <!-- voice recognition indicator -->
+ <color name="search_mic_levels_guideline">#FFCCCCCC</color>
+ <color name="search_mic_background">#FFFFFFFF</color>
+
+ <color name="keyboard_background">#FF384248</color>
+ <color name="key_text_default">#FFEEEEEE</color>
+ <color name="ime_selector_focus_color">#66EEEEEE</color>
+ <color name="ime_selector_color">#26EEEEEE</color>
+
+ <color name="candidate_background">#FF263238</color>
+ <color name="candidate_font_color">#FF30C6B4</color>
+
+ <color name="enter_key_font_color">#FF30C6B4</color>
+</resources>
\ No newline at end of file
diff --git a/res/values/config.xml b/res/values/config.xml
new file mode 100644
index 0000000..991f086
--- /dev/null
+++ b/res/values/config.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources>
+ <!-- scale of clicked selector -->
+ <item name="clicked_scale" type="fraction">88%</item>
+ <!-- amount to overestimate selector scaling by -->
+ <item name="focused_scale" type="fraction">120%</item>
+ <!-- alpha value for active keyboards and dictation/voice mode -->
+ <item name="alpha_in" type="fraction">100%</item>
+ <!-- alpha value for inactive keyboards and dictation/voice mode -->
+ <item name="alpha_out" type="fraction">0%</item>
+</resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
new file mode 100644
index 0000000..a3f393b
--- /dev/null
+++ b/res/values/dimens.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources>
+
+ <!-- height of keyboard keys -->
+ <dimen name="key_height">28dp</dimen>
+ <!-- width of keyboard keys -->
+ <dimen name="key_width">28dp</dimen>
+ <!-- width of space key (7x regular key + 6*horz_margin) -->
+ <dimen name="space_key_width">268dp</dimen>
+ <!-- horizontal gap of the keyboard -->
+ <dimen name="keyboard_horizontal_gap">12dp</dimen>
+ <!-- vertical gap of the keyboard -->
+ <dimen name="keyboard_vertical_gap">8dp</dimen>
+ <!-- size of the recognizer view -->
+ <dimen name="recognizer_size">96dp</dimen>
+ <!-- size of key selector -->
+ <dimen name="selector_size">24dp</dimen>
+ <!-- top gap when the suggestion is enabled -->
+ <dimen name="keyboard_top_spacing">6dp</dimen>
+ <!-- gap below keyboard -->
+ <dimen name="keyboard_bottom_spacing">28dp</dimen>
+ <!-- action button size -->
+ <dimen name="action_button_size">64dp</dimen>
+
+ <dimen name="enter_key_height">32dp</dimen>
+ <dimen name="enter_key_font_size">18sp</dimen>
+ <dimen name="enter_key_padding_horizontal">16dp</dimen>
+ <dimen name="mode_change_key_font_size">7sp</dimen>
+ <!-- candidate layout -->
+ <dimen name="candidate_font_size">18sp</dimen>
+ <dimen name="candidate_padding_horizontal">16dp</dimen>
+ <dimen name="candidate_margin_horizontal">4dp</dimen>
+ <dimen name="candidate_height">28dp</dimen>
+ <dimen name="candidate_scroll_view_horz_spacing">56dip</dimen>
+
+ <!-- keyboard key font size -->
+ <dimen name="key_font_size">18sp</dimen>
+ <!-- font size of mode changing function keys -->
+ <dimen name="function_key_mode_change_font_size">16sp</dimen>
+ <!-- min movement distance to change cursor size -->
+ <dimen name="resize_move_distance">12dp</dimen>
+
+</resources>
\ No newline at end of file
diff --git a/res/values/integers.xml b/res/values/integers.xml
new file mode 100644
index 0000000..5c2dc15
--- /dev/null
+++ b/res/values/integers.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources>
+ <!-- duration of animation for a key click -->
+ <integer name="clicked_anim_duration">100</integer>
+ <!-- delay before reversing clicked key animation -->
+ <integer name="unfocused_anim_delay">30</integer>
+ <!-- duration of dication/voice ui coming up and going away -->
+ <integer name="voice_anim_duration">300</integer>
+ <!-- alpha value for inactive keys when mini kb is up -->
+ <integer name="inactive_mini_kb_alpha">40</integer>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
new file mode 100644
index 0000000..b69cf4a
--- /dev/null
+++ b/res/values/strings.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Name of this ime [CHAR LIMIT=20] -->
+ <string name="ime_name"><xliff:g id="app_name">Leanback</xliff:g> Keyboard</string>
+ <!-- Name of this ime's input service [CHAR LIMIT=20] -->
+ <string name="ime_service_name"><xliff:g id="app_name">Leanback</xliff:g> Keyboard</string>
+
+ <!-- Symbols that are commonly considered word separators in this language [DO NOT TRANSLATE] -->
+ <string name="word_separators">\u0020.,;:!?\n()[]*&@{}/<>_+=|"</string>
+
+ <!-- Labels for the action key in different mode-->
+ <!-- Label go for IME action key [CHAR LIMIT=20] -->
+ <string name="label_go_key">Go</string>
+ <!-- Label next for IME action key [CHAR LIMIT=20] -->
+ <string name="label_next_key">Next</string>
+ <!-- Label send for IME action key [CHAR LIMIT=20] -->
+ <string name="label_send_key">Send</string>
+ <!-- Label search for IME action key [CHAR LIMIT=20] -->
+ <string name="label_search_key">Search</string>
+ <!-- Label done for IME action key [CHAR LIMIT=20] -->
+ <string name="label_done_key">Done</string>
+
+ <!-- DO NOT TRANSLATE autocomplete email address of commong domains -->
+ <string-array name="common_domains" translatable="false">
+ <item>"@gmail.com"</item>
+ <item>"@yahoo.com"</item>
+ <item>"@hotmail.com"</item>
+ </string-array>
+
+ <!-- Label for LeanbackIme Settings [CHAR LIMIT=50] -->
+ <string name="settings_title">Keyboard Options</string>
+ <!-- Name of a setting that controls LeanbackIme's movement sensitivity [CHAR LIMIT=50] -->
+ <string name="title_movement_sensitivity">Movement sensitivity</string>
+ <!-- Values for movement sensitivity settings [DO NOT TRANSLATE] -->
+ <string-array name="movement_sensitivity_values" translatable="false" >
+ <item>0.6</item>
+ <item>0.8</item>
+ <item>1.0</item>
+ <item>1.2</item>
+ <item>1.4</item>
+ </string-array>
+ <!-- Description / label for a button that turns a setting on [CHAR LIMIT=50]-->
+ <string name="btn_on">On</string>
+ <!-- Description / label for a button that turns a setting off [CHAR LIMIT=50]-->
+ <string name="btn_off">Off</string>
+ <!-- Description for English (United States) keyboard subtype [DO NOT TRANSLATE] -->
+ <string name="subtype_generic" translatable="false">%s</string>
+
+ <!-- KeyboardView - accessibility support -->
+ <!-- Description of the Space button in a KeyboardView. [CHAR LIMIT=NONE] -->
+ <string name="keyboardview_keycode_space">Space</string>
+ <!-- Description of the Delete button in a KeyboardView. [CHAR LIMIT=NONE] -->
+ <string name="keyboardview_keycode_delete">Delete</string>
+ <!-- Description of the Mode change button in a KeyboardView. [CHAR LIMIT=NONE] -->
+ <string name="keyboardview_keycode_mode_change">Mode change</string>
+ <!-- Description of the Shift button in a KeyboardView. [CHAR LIMIT=NONE] -->
+ <string name="keyboardview_keycode_shift">Shift</string>
+ <!-- Description of the Caps lock in a KeyboardView. [CHAR LIMIT=NONE] -->
+ <string name="keyboardview_keycode_caps">Caps Lock</string>
+ <!-- Description of the left cursor button in a KeyboardView. [CHAR LIMIT=NONE] -->
+ <string name="keyboardview_keycode_left">Left</string>
+ <!-- Description of the right cursor button in a KeyboardView. [CHAR LIMIT=NONE] -->
+ <string name="keyboardview_keycode_right">Right</string>
+
+ <!-- Announce that a headset is required to hear keyboard keys while typing a password. [CHAR LIMIT=NONE] -->
+ <string name="keyboard_headset_required_to_hear_password">Plug in a headset to hear password keys spoken.</string>
+ <!-- The value of a keyboard key announced when accessibility is enabled and no headsed is used. [CHAR LIMIT=NONE] -->
+ <string name="keyboard_password_character_no_headset">Dot.</string>
+</resources>
diff --git a/res/xml/accent_a.xml b/res/xml/accent_a.xml
new file mode 100644
index 0000000..90534e1
--- /dev/null
+++ b/res/xml/accent_a.xml
@@ -0,0 +1,58 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyLabel="a" />
+ <Key
+ android:codes="224"
+ android:keyLabel="à" />
+ <Key
+ android:codes="225"
+ android:keyLabel="á" />
+ <Key
+ android:codes="226"
+ android:keyLabel="â" />
+ <Key
+ android:codes="227"
+ android:keyLabel="ã" />
+ <Key
+ android:codes="228"
+ android:keyLabel="ä" />
+ <Key
+ android:codes="229"
+ android:keyLabel="å" />
+ <Key
+ android:codes="230"
+ android:keyLabel="æ" />
+ <Key
+ android:codes="257"
+ android:keyLabel="ā" />
+ <Key
+ android:codes="259"
+ android:keyLabel="ă" />
+ <Key
+ android:codes="261"
+ android:keyLabel="ą" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_c.xml b/res/xml/accent_c.xml
new file mode 100644
index 0000000..34309be
--- /dev/null
+++ b/res/xml/accent_c.xml
@@ -0,0 +1,37 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="99"
+ android:keyLabel="c" />
+ <Key
+ android:codes="231"
+ android:keyLabel="Ç" />
+ <Key
+ android:codes="263"
+ android:keyLabel="ć" />
+ <Key
+ android:codes="269"
+ android:keyLabel="č" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_d.xml b/res/xml/accent_d.xml
new file mode 100644
index 0000000..7835c10
--- /dev/null
+++ b/res/xml/accent_d.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="100"
+ android:keyLabel="d" />
+ <Key
+ android:codes="273"
+ android:keyLabel="đ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_e.xml b/res/xml/accent_e.xml
new file mode 100644
index 0000000..5aa6549
--- /dev/null
+++ b/res/xml/accent_e.xml
@@ -0,0 +1,49 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="101"
+ android:keyLabel="e" />
+ <Key
+ android:codes="232"
+ android:keyLabel="è" />
+ <Key
+ android:codes="233"
+ android:keyLabel="é" />
+ <Key
+ android:codes="234"
+ android:keyLabel="ê" />
+ <Key
+ android:codes="235"
+ android:keyLabel="ë" />
+ <Key
+ android:codes="275"
+ android:keyLabel="ē" />
+ <Key
+ android:codes="279"
+ android:keyLabel="ė" />
+ <Key
+ android:codes="281"
+ android:keyLabel="ę" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_g.xml b/res/xml/accent_g.xml
new file mode 100644
index 0000000..db7535d
--- /dev/null
+++ b/res/xml/accent_g.xml
@@ -0,0 +1,34 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="103"
+ android:keyLabel="g" />
+ <Key
+ android:codes="287"
+ android:keyLabel="ğ" />
+ <Key
+ android:codes="291"
+ android:keyLabel="ģ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_i.xml b/res/xml/accent_i.xml
new file mode 100644
index 0000000..a164b52
--- /dev/null
+++ b/res/xml/accent_i.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="105"
+ android:keyLabel="i" />
+ <Key
+ android:codes="236"
+ android:keyLabel="ì" />
+ <Key
+ android:codes="237"
+ android:keyLabel="í" />
+ <Key
+ android:codes="238"
+ android:keyLabel="î" />
+ <Key
+ android:codes="239"
+ android:keyLabel="ï" />
+ <Key
+ android:codes="299"
+ android:keyLabel="ī" />
+ <Key
+ android:codes="303"
+ android:keyLabel="į" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_k.xml b/res/xml/accent_k.xml
new file mode 100644
index 0000000..72c1151
--- /dev/null
+++ b/res/xml/accent_k.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="107"
+ android:keyLabel="k" />
+ <Key
+ android:codes="311"
+ android:keyLabel="ķ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_l.xml b/res/xml/accent_l.xml
new file mode 100644
index 0000000..5386f5f
--- /dev/null
+++ b/res/xml/accent_l.xml
@@ -0,0 +1,34 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="108"
+ android:keyLabel="l" />
+ <Key
+ android:codes="316"
+ android:keyLabel="ļ" />
+ <Key
+ android:codes="322"
+ android:keyLabel="ł" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_n.xml b/res/xml/accent_n.xml
new file mode 100644
index 0000000..b09d6ef
--- /dev/null
+++ b/res/xml/accent_n.xml
@@ -0,0 +1,37 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="110"
+ android:keyLabel="n" />
+ <Key
+ android:codes="241"
+ android:keyLabel="ñ" />
+ <Key
+ android:codes="324"
+ android:keyLabel="ń" />
+ <Key
+ android:codes="326"
+ android:keyLabel="ņ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_o.xml b/res/xml/accent_o.xml
new file mode 100644
index 0000000..5f84f54
--- /dev/null
+++ b/res/xml/accent_o.xml
@@ -0,0 +1,55 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="111"
+ android:keyLabel="o" />
+ <Key
+ android:codes="242"
+ android:keyLabel="ò" />
+ <Key
+ android:codes="243"
+ android:keyLabel="ó" />
+ <Key
+ android:codes="244"
+ android:keyLabel="ô" />
+ <Key
+ android:codes="245"
+ android:keyLabel="õ" />
+ <Key
+ android:codes="246"
+ android:keyLabel="ö" />
+ <Key
+ android:codes="248"
+ android:keyLabel="ø" />
+ <Key
+ android:codes="333"
+ android:keyLabel="ō" />
+ <Key
+ android:codes="339"
+ android:keyLabel="œ" />
+ <Key
+ android:codes="417"
+ android:keyLabel="ơ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_s.xml b/res/xml/accent_s.xml
new file mode 100644
index 0000000..3518afe
--- /dev/null
+++ b/res/xml/accent_s.xml
@@ -0,0 +1,40 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="115"
+ android:keyLabel="s" />
+ <Key
+ android:codes="223"
+ android:keyLabel="ß" />
+ <Key
+ android:codes="347"
+ android:keyLabel="ś" />
+ <Key
+ android:codes="351"
+ android:keyLabel="ş" />
+ <Key
+ android:codes="353"
+ android:keyLabel="š" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_t.xml b/res/xml/accent_t.xml
new file mode 100644
index 0000000..bba1898
--- /dev/null
+++ b/res/xml/accent_t.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="116"
+ android:keyLabel="t" />
+ <Key
+ android:codes="355"
+ android:keyLabel="ț" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_u.xml b/res/xml/accent_u.xml
new file mode 100644
index 0000000..93a50d7
--- /dev/null
+++ b/res/xml/accent_u.xml
@@ -0,0 +1,49 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="117"
+ android:keyLabel="u" />
+ <Key
+ android:codes="249"
+ android:keyLabel="ù" />
+ <Key
+ android:codes="250"
+ android:keyLabel="ú" />
+ <Key
+ android:codes="251"
+ android:keyLabel="û" />
+ <Key
+ android:codes="252"
+ android:keyLabel="ü" />
+ <Key
+ android:codes="363"
+ android:keyLabel="ū" />
+ <Key
+ android:codes="371"
+ android:keyLabel="ų" />
+ <Key
+ android:codes="432"
+ android:keyLabel="ư" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_y.xml b/res/xml/accent_y.xml
new file mode 100644
index 0000000..ce9dc3f
--- /dev/null
+++ b/res/xml/accent_y.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="121"
+ android:keyLabel="y" />
+ <Key
+ android:codes="255"
+ android:keyLabel="ÿ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/accent_z.xml b/res/xml/accent_z.xml
new file mode 100644
index 0000000..6c43d21
--- /dev/null
+++ b/res/xml/accent_z.xml
@@ -0,0 +1,37 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyLabel="z" />
+ <Key
+ android:codes="378"
+ android:keyLabel="ź" />
+ <Key
+ android:codes="380"
+ android:keyLabel="ż" />
+ <Key
+ android:codes="382"
+ android:keyLabel="ž" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/azerty.xml b/res/xml/azerty.xml
new file mode 100644
index 0000000..2bad112
--- /dev/null
+++ b/res/xml/azerty.xml
@@ -0,0 +1,233 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="122"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="119"
+ android:keyEdgeFlags="left"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="39"
+ android:keyLabel="\'" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/method.xml b/res/xml/method.xml
new file mode 100644
index 0000000..0c41826
--- /dev/null
+++ b/res/xml/method.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 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.
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Search Manager. -->
+
+<input-method xmlns:android="http://schemas.android.com/apk/res/android"
+ android:isDefault="@bool/im_is_default">
+ <subtype android:label="@string/subtype_generic"
+ android:imeSubtypeLocale="en_US"
+ android:imeSubtypeMode="keyboard"
+ />
+</input-method>
diff --git a/res/xml/number.xml b/res/xml/number.xml
new file mode 100644
index 0000000..83defd7
--- /dev/null
+++ b/res/xml/number.xml
@@ -0,0 +1,89 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3" />
+ <Key
+ android:codes="95"
+ android:keyEdgeFlags="right"
+ android:keyLabel="_" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="52"
+ android:keyEdgeFlags="left"
+ android:keyLabel="4" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6" />
+ <Key
+ android:codes="46"
+ android:keyEdgeFlags="right"
+ android:keyLabel="." />
+ </Row>
+ <Row>
+ <Key
+ android:codes="55"
+ android:keyEdgeFlags="left"
+ android:keyLabel="7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="42"
+ android:keyEdgeFlags="left"
+ android:keyLabel="*" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0" />
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+
+</Keyboard>
diff --git a/res/xml/qwerty_az.xml b/res/xml/qwerty_az.xml
new file mode 100644
index 0000000..9f5af14
--- /dev/null
+++ b/res/xml/qwerty_az.xml
@@ -0,0 +1,233 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_ca.xml b/res/xml/qwerty_ca.xml
new file mode 100644
index 0000000..a177af6
--- /dev/null
+++ b/res/xml/qwerty_ca.xml
@@ -0,0 +1,234 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="231"
+ android:keyLabel="ç"
+ android:popupKeyboard="@xml/shift_cc" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_da.xml b/res/xml/qwerty_da.xml
new file mode 100644
index 0000000..9e793ac
--- /dev/null
+++ b/res/xml/qwerty_da.xml
@@ -0,0 +1,236 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="229"
+ android:keyEdgeFlags="right"
+ android:keyLabel="å"
+ android:popupKeyboard="@xml/shift_ao" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="230"
+ android:keyLabel="æ"
+ android:popupKeyboard="@xml/shift_ae" />
+ <Key
+ android:codes="248"
+ android:keyEdgeFlags="right"
+ android:keyLabel="ø"
+ android:popupKeyboard="@xml/shift_ox" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_en_gb.xml b/res/xml/qwerty_en_gb.xml
new file mode 100644
index 0000000..deac584
--- /dev/null
+++ b/res/xml/qwerty_en_gb.xml
@@ -0,0 +1,233 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_en_gb" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_en_in.xml b/res/xml/qwerty_en_in.xml
new file mode 100644
index 0000000..f6ecf9f
--- /dev/null
+++ b/res/xml/qwerty_en_in.xml
@@ -0,0 +1,233 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_en_in" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_es_eu.xml b/res/xml/qwerty_es_eu.xml
new file mode 100644
index 0000000..60551b0
--- /dev/null
+++ b/res/xml/qwerty_es_eu.xml
@@ -0,0 +1,234 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="241"
+ android:keyLabel="ñ"
+ android:popupKeyboard="@xml/shift_nn_es" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/shift_n_es" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_es_us.xml b/res/xml/qwerty_es_us.xml
new file mode 100644
index 0000000..8749292
--- /dev/null
+++ b/res/xml/qwerty_es_us.xml
@@ -0,0 +1,234 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="241"
+ android:keyLabel="ñ"
+ android:popupKeyboard="@xml/shift_nn_es" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/shift_n_es" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_et.xml b/res/xml/qwerty_et.xml
new file mode 100644
index 0000000..d26c191
--- /dev/null
+++ b/res/xml/qwerty_et.xml
@@ -0,0 +1,236 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="252"
+ android:keyEdgeFlags="right"
+ android:keyLabel="ü"
+ android:popupKeyboard="@xml/shift_uu" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="246"
+ android:keyLabel="ö"
+ android:popupKeyboard="@xml/shift_oo" />
+ <Key
+ android:codes="228"
+ android:keyEdgeFlags="right"
+ android:keyLabel="ä"
+ android:popupKeyboard="@xml/shift_aa" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_eu.xml b/res/xml/qwerty_eu.xml
new file mode 100644
index 0000000..9f5af14
--- /dev/null
+++ b/res/xml/qwerty_eu.xml
@@ -0,0 +1,233 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_fi.xml b/res/xml/qwerty_fi.xml
new file mode 100644
index 0000000..b2f29de
--- /dev/null
+++ b/res/xml/qwerty_fi.xml
@@ -0,0 +1,236 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="229"
+ android:keyEdgeFlags="right"
+ android:keyLabel="å"
+ android:popupKeyboard="@xml/shift_ao" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="246"
+ android:keyLabel="ö"
+ android:popupKeyboard="@xml/shift_oo" />
+ <Key
+ android:codes="228"
+ android:keyEdgeFlags="right"
+ android:keyLabel="ä"
+ android:popupKeyboard="@xml/shift_aa" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_nb.xml b/res/xml/qwerty_nb.xml
new file mode 100644
index 0000000..1a67732
--- /dev/null
+++ b/res/xml/qwerty_nb.xml
@@ -0,0 +1,236 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="229"
+ android:keyEdgeFlags="right"
+ android:keyLabel="å"
+ android:popupKeyboard="@xml/shift_ao" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="248"
+ android:keyLabel="ø"
+ android:popupKeyboard="@xml/shift_ox" />
+ <Key
+ android:codes="230"
+ android:keyEdgeFlags="right"
+ android:keyLabel="æ"
+ android:popupKeyboard="@xml/shift_ae" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_sv.xml b/res/xml/qwerty_sv.xml
new file mode 100644
index 0000000..b2f29de
--- /dev/null
+++ b/res/xml/qwerty_sv.xml
@@ -0,0 +1,236 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="229"
+ android:keyEdgeFlags="right"
+ android:keyLabel="å"
+ android:popupKeyboard="@xml/shift_ao" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="246"
+ android:keyLabel="ö"
+ android:popupKeyboard="@xml/shift_oo" />
+ <Key
+ android:codes="228"
+ android:keyEdgeFlags="right"
+ android:keyLabel="ä"
+ android:popupKeyboard="@xml/shift_aa" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwerty_us.xml b/res/xml/qwerty_us.xml
new file mode 100644
index 0000000..c51dfdb
--- /dev/null
+++ b/res/xml/qwerty_us.xml
@@ -0,0 +1,233 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="121"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/accent_y" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="122"
+ android:keyEdgeFlags="left"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwertz.xml b/res/xml/qwertz.xml
new file mode 100644
index 0000000..b5e5e55
--- /dev/null
+++ b/res/xml/qwertz.xml
@@ -0,0 +1,233 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="122"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="64"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\@" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="121"
+ android:keyEdgeFlags="left"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/qwertz_ch.xml b/res/xml/qwertz_ch.xml
new file mode 100644
index 0000000..759fc5d
--- /dev/null
+++ b/res/xml/qwertz_ch.xml
@@ -0,0 +1,236 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row android:rowEdgeFlags="top">
+ <Key
+ android:codes="49"
+ android:keyEdgeFlags="left"
+ android:keyLabel="1"
+ android:popupKeyboard="@xml/shift_1" />
+ <Key
+ android:codes="50"
+ android:keyLabel="2"
+ android:popupKeyboard="@xml/shift_2" />
+ <Key
+ android:codes="51"
+ android:keyLabel="3"
+ android:popupKeyboard="@xml/shift_3" />
+ <Key
+ android:codes="52"
+ android:keyLabel="4"
+ android:popupKeyboard="@xml/shift_4_eu" />
+ <Key
+ android:codes="53"
+ android:keyLabel="5"
+ android:popupKeyboard="@xml/shift_5" />
+ <Key
+ android:codes="54"
+ android:keyLabel="6"
+ android:popupKeyboard="@xml/shift_6" />
+ <Key
+ android:codes="55"
+ android:keyLabel="7"
+ android:popupKeyboard="@xml/shift_7" />
+ <Key
+ android:codes="56"
+ android:keyLabel="8"
+ android:popupKeyboard="@xml/shift_8" />
+ <Key
+ android:codes="57"
+ android:keyLabel="9"
+ android:popupKeyboard="@xml/shift_9" />
+ <Key
+ android:codes="48"
+ android:keyLabel="0"
+ android:popupKeyboard="@xml/shift_0" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyEdgeFlags="left"
+ android:keyLabel="q"
+ android:popupKeyboard="@xml/shift_q" />
+ <Key
+ android:codes="119"
+ android:keyLabel="w"
+ android:popupKeyboard="@xml/shift_w" />
+ <Key
+ android:codes="101"
+ android:keyLabel="e"
+ android:popupKeyboard="@xml/accent_e" />
+ <Key
+ android:codes="114"
+ android:keyLabel="r"
+ android:popupKeyboard="@xml/shift_r" />
+ <Key
+ android:codes="116"
+ android:keyLabel="t"
+ android:popupKeyboard="@xml/accent_t" />
+ <Key
+ android:codes="122"
+ android:keyLabel="z"
+ android:popupKeyboard="@xml/accent_z" />
+ <Key
+ android:codes="117"
+ android:keyLabel="u"
+ android:popupKeyboard="@xml/accent_u" />
+ <Key
+ android:codes="105"
+ android:keyLabel="i"
+ android:popupKeyboard="@xml/accent_i" />
+ <Key
+ android:codes="111"
+ android:keyLabel="o"
+ android:popupKeyboard="@xml/accent_o" />
+ <Key
+ android:codes="112"
+ android:keyLabel="p"
+ android:popupKeyboard="@xml/shift_p" />
+ <Key
+ android:codes="252"
+ android:keyEdgeFlags="right"
+ android:keyLabel="ü"
+ android:popupKeyboard="@xml/shift_uu" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="97"
+ android:keyEdgeFlags="left"
+ android:keyLabel="a"
+ android:popupKeyboard="@xml/accent_a" />
+ <Key
+ android:codes="115"
+ android:keyLabel="s"
+ android:popupKeyboard="@xml/accent_s" />
+ <Key
+ android:codes="100"
+ android:keyLabel="d"
+ android:popupKeyboard="@xml/accent_d" />
+ <Key
+ android:codes="102"
+ android:keyLabel="f"
+ android:popupKeyboard="@xml/shift_f" />
+ <Key
+ android:codes="103"
+ android:keyLabel="g"
+ android:popupKeyboard="@xml/accent_g" />
+ <Key
+ android:codes="104"
+ android:keyLabel="h"
+ android:popupKeyboard="@xml/shift_h" />
+ <Key
+ android:codes="106"
+ android:keyLabel="j"
+ android:popupKeyboard="@xml/shift_j" />
+ <Key
+ android:codes="107"
+ android:keyLabel="k"
+ android:popupKeyboard="@xml/accent_k" />
+ <Key
+ android:codes="108"
+ android:keyLabel="l"
+ android:popupKeyboard="@xml/accent_l" />
+ <Key
+ android:codes="246"
+ android:keyLabel="ö"
+ android:popupKeyboard="@xml/shift_oo" />
+ <Key
+ android:codes="228"
+ android:keyEdgeFlags="right"
+ android:keyLabel="ä"
+ android:popupKeyboard="@xml/shift_aa" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="121"
+ android:keyEdgeFlags="left"
+ android:keyLabel="y"
+ android:popupKeyboard="@xml/shift_y" />
+ <Key
+ android:codes="120"
+ android:keyLabel="x"
+ android:popupKeyboard="@xml/shift_x" />
+ <Key
+ android:codes="99"
+ android:keyLabel="c"
+ android:popupKeyboard="@xml/accent_c" />
+ <Key
+ android:codes="118"
+ android:keyLabel="v"
+ android:popupKeyboard="@xml/shift_v" />
+ <Key
+ android:codes="98"
+ android:keyLabel="b"
+ android:popupKeyboard="@xml/shift_b" />
+ <Key
+ android:codes="110"
+ android:keyLabel="n"
+ android:popupKeyboard="@xml/accent_n" />
+ <Key
+ android:codes="109"
+ android:keyLabel="m"
+ android:popupKeyboard="@xml/shift_m" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_symbols" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_0.xml b/res/xml/shift_0.xml
new file mode 100644
index 0000000..bcff0eb
--- /dev/null
+++ b/res/xml/shift_0.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="41"
+ android:keyLabel=")" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_1.xml b/res/xml/shift_1.xml
new file mode 100644
index 0000000..f324a40
--- /dev/null
+++ b/res/xml/shift_1.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="33"
+ android:keyLabel="!" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_2.xml b/res/xml/shift_2.xml
new file mode 100644
index 0000000..ed5e19e
--- /dev/null
+++ b/res/xml/shift_2.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="64"
+ android:keyLabel="\@" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_3.xml b/res/xml/shift_3.xml
new file mode 100644
index 0000000..ebc8a0e
--- /dev/null
+++ b/res/xml/shift_3.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_4.xml b/res/xml/shift_4.xml
new file mode 100644
index 0000000..90c0ddb
--- /dev/null
+++ b/res/xml/shift_4.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="36"
+ android:keyLabel="$" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_4_en_gb.xml b/res/xml/shift_4_en_gb.xml
new file mode 100644
index 0000000..f7803cc
--- /dev/null
+++ b/res/xml/shift_4_en_gb.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="163"
+ android:keyLabel="£" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_4_en_in.xml b/res/xml/shift_4_en_in.xml
new file mode 100644
index 0000000..ff6476b
--- /dev/null
+++ b/res/xml/shift_4_en_in.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="8377"
+ android:keyLabel="₹" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_4_eu.xml b/res/xml/shift_4_eu.xml
new file mode 100644
index 0000000..719eb7a
--- /dev/null
+++ b/res/xml/shift_4_eu.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="8364"
+ android:keyLabel="€" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_5.xml b/res/xml/shift_5.xml
new file mode 100644
index 0000000..40ea608
--- /dev/null
+++ b/res/xml/shift_5.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="37"
+ android:keyLabel="%" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_6.xml b/res/xml/shift_6.xml
new file mode 100644
index 0000000..2532351
--- /dev/null
+++ b/res/xml/shift_6.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="94"
+ android:keyLabel="^" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_7.xml b/res/xml/shift_7.xml
new file mode 100644
index 0000000..0995c31
--- /dev/null
+++ b/res/xml/shift_7.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="38"
+ android:keyLabel="&" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_8.xml b/res/xml/shift_8.xml
new file mode 100644
index 0000000..f4e7e19
--- /dev/null
+++ b/res/xml/shift_8.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="42"
+ android:keyLabel="*" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_9.xml b/res/xml/shift_9.xml
new file mode 100644
index 0000000..b22951b
--- /dev/null
+++ b/res/xml/shift_9.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="40"
+ android:keyLabel="(" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_aa.xml b/res/xml/shift_aa.xml
new file mode 100644
index 0000000..e0d6d0e
--- /dev/null
+++ b/res/xml/shift_aa.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="228"
+ android:keyLabel="ä" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_ae.xml b/res/xml/shift_ae.xml
new file mode 100644
index 0000000..01d8fbb
--- /dev/null
+++ b/res/xml/shift_ae.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="230"
+ android:keyLabel="æ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_ao.xml b/res/xml/shift_ao.xml
new file mode 100644
index 0000000..064dbe0
--- /dev/null
+++ b/res/xml/shift_ao.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="229"
+ android:keyLabel="å" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_b.xml b/res/xml/shift_b.xml
new file mode 100644
index 0000000..d371206
--- /dev/null
+++ b/res/xml/shift_b.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="98"
+ android:keyLabel="b" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_cc.xml b/res/xml/shift_cc.xml
new file mode 100644
index 0000000..0e3929f
--- /dev/null
+++ b/res/xml/shift_cc.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="231"
+ android:keyLabel="ç" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_f.xml b/res/xml/shift_f.xml
new file mode 100644
index 0000000..1cdb194
--- /dev/null
+++ b/res/xml/shift_f.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="102"
+ android:keyLabel="f" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_h.xml b/res/xml/shift_h.xml
new file mode 100644
index 0000000..bce3549
--- /dev/null
+++ b/res/xml/shift_h.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="104"
+ android:keyLabel="h" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_j.xml b/res/xml/shift_j.xml
new file mode 100644
index 0000000..d84444d
--- /dev/null
+++ b/res/xml/shift_j.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="106"
+ android:keyLabel="j" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_m.xml b/res/xml/shift_m.xml
new file mode 100644
index 0000000..e89d95f
--- /dev/null
+++ b/res/xml/shift_m.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="109"
+ android:keyLabel="m" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_n_es.xml b/res/xml/shift_n_es.xml
new file mode 100644
index 0000000..379c2a5
--- /dev/null
+++ b/res/xml/shift_n_es.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="110"
+ android:keyLabel="n" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_nn_es.xml b/res/xml/shift_nn_es.xml
new file mode 100644
index 0000000..39e5c84
--- /dev/null
+++ b/res/xml/shift_nn_es.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="241"
+ android:keyLabel="ñ" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_oo.xml b/res/xml/shift_oo.xml
new file mode 100644
index 0000000..afe30b2
--- /dev/null
+++ b/res/xml/shift_oo.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="246"
+ android:keyLabel="ö" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_ox.xml b/res/xml/shift_ox.xml
new file mode 100644
index 0000000..4c22c78
--- /dev/null
+++ b/res/xml/shift_ox.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="248"
+ android:keyLabel="ø" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_p.xml b/res/xml/shift_p.xml
new file mode 100644
index 0000000..e4ebcbc
--- /dev/null
+++ b/res/xml/shift_p.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="112"
+ android:keyLabel="p" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_q.xml b/res/xml/shift_q.xml
new file mode 100644
index 0000000..b3282f5
--- /dev/null
+++ b/res/xml/shift_q.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="113"
+ android:keyLabel="q" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_r.xml b/res/xml/shift_r.xml
new file mode 100644
index 0000000..906e1bb
--- /dev/null
+++ b/res/xml/shift_r.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="114"
+ android:keyLabel="r" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_uu.xml b/res/xml/shift_uu.xml
new file mode 100644
index 0000000..bb56653
--- /dev/null
+++ b/res/xml/shift_uu.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="252"
+ android:keyLabel="ü" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_v.xml b/res/xml/shift_v.xml
new file mode 100644
index 0000000..4ce770a
--- /dev/null
+++ b/res/xml/shift_v.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="118"
+ android:keyLabel="v" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_w.xml b/res/xml/shift_w.xml
new file mode 100644
index 0000000..d8ab4f9
--- /dev/null
+++ b/res/xml/shift_w.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="119"
+ android:keyLabel="w" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_x.xml b/res/xml/shift_x.xml
new file mode 100644
index 0000000..743e91b
--- /dev/null
+++ b/res/xml/shift_x.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="120"
+ android:keyLabel="x" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/shift_y.xml b/res/xml/shift_y.xml
new file mode 100644
index 0000000..63bbcc2
--- /dev/null
+++ b/res/xml/shift_y.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="121"
+ android:keyLabel="y" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/sym_azerty.xml b/res/xml/sym_azerty.xml
new file mode 100644
index 0000000..b175ddb
--- /dev/null
+++ b/res/xml/sym_azerty.xml
@@ -0,0 +1,197 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="33"
+ android:keyEdgeFlags="left"
+ android:keyLabel="!" />
+ <Key
+ android:codes="64"
+ android:keyLabel="\@" />
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ <Key
+ android:codes="8364"
+ android:keyLabel="€" />
+ <Key
+ android:codes="37"
+ android:keyLabel="%" />
+ <Key
+ android:codes="94"
+ android:keyLabel="^" />
+ <Key
+ android:codes="38"
+ android:keyLabel="&" />
+ <Key
+ android:codes="42"
+ android:keyLabel="*" />
+ <Key
+ android:codes="40"
+ android:keyLabel="(" />
+ <Key
+ android:codes="41"
+ android:keyLabel=")" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="126"
+ android:keyEdgeFlags="left"
+ android:keyLabel="~" />
+ <Key
+ android:codes="96"
+ android:keyLabel="`" />
+ <Key
+ android:codes="91"
+ android:keyLabel="[" />
+ <Key
+ android:codes="93"
+ android:keyLabel="]" />
+ <Key
+ android:codes="123"
+ android:keyLabel="{" />
+ <Key
+ android:codes="125"
+ android:keyLabel="}" />
+ <Key
+ android:codes="124"
+ android:keyLabel="|" />
+ <Key
+ android:codes="43"
+ android:keyLabel="+" />
+ <Key
+ android:codes="61"
+ android:keyLabel="=" />
+ <Key
+ android:codes="47"
+ android:keyLabel="/" />
+ <Key
+ android:codes="92"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\\" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="176"
+ android:keyEdgeFlags="left"
+ android:keyLabel="°" />
+ <Key
+ android:codes="191"
+ android:keyLabel="¿" />
+ <Key
+ android:codes="161"
+ android:keyLabel="¡" />
+ <Key
+ android:codes="247"
+ android:keyLabel="÷" />
+ <Key
+ android:codes="215"
+ android:keyLabel="×" />
+ <Key
+ android:codes="59"
+ android:keyLabel=";" />
+ <Key
+ android:codes="58"
+ android:keyLabel=":" />
+ <Key
+ android:codes="34"
+ android:keyLabel=""" />
+ <Key
+ android:codes="8226"
+ android:keyLabel="•" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="36"
+ android:keyEdgeFlags="left"
+ android:keyLabel="$" />
+ <Key
+ android:codes="165"
+ android:keyLabel="¥" />
+ <Key
+ android:codes="162"
+ android:keyLabel="¢" />
+ <Key
+ android:codes="163"
+ android:keyLabel="£" />
+ <Key
+ android:codes="60"
+ android:keyLabel="<" />
+ <Key
+ android:codes="62"
+ android:keyLabel=">" />
+ <Key
+ android:codes="39"
+ android:keyLabel="\'" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_alphabet" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/sym_en_gb.xml b/res/xml/sym_en_gb.xml
new file mode 100644
index 0000000..0f7fa9b
--- /dev/null
+++ b/res/xml/sym_en_gb.xml
@@ -0,0 +1,197 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="33"
+ android:keyEdgeFlags="left"
+ android:keyLabel="!" />
+ <Key
+ android:codes="64"
+ android:keyLabel="\@" />
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ <Key
+ android:codes="163"
+ android:keyLabel="£" />
+ <Key
+ android:codes="37"
+ android:keyLabel="%" />
+ <Key
+ android:codes="94"
+ android:keyLabel="^" />
+ <Key
+ android:codes="38"
+ android:keyLabel="&" />
+ <Key
+ android:codes="42"
+ android:keyLabel="*" />
+ <Key
+ android:codes="40"
+ android:keyLabel="(" />
+ <Key
+ android:codes="41"
+ android:keyLabel=")" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="126"
+ android:keyEdgeFlags="left"
+ android:keyLabel="~" />
+ <Key
+ android:codes="96"
+ android:keyLabel="`" />
+ <Key
+ android:codes="91"
+ android:keyLabel="[" />
+ <Key
+ android:codes="93"
+ android:keyLabel="]" />
+ <Key
+ android:codes="123"
+ android:keyLabel="{" />
+ <Key
+ android:codes="125"
+ android:keyLabel="}" />
+ <Key
+ android:codes="124"
+ android:keyLabel="|" />
+ <Key
+ android:codes="43"
+ android:keyLabel="+" />
+ <Key
+ android:codes="61"
+ android:keyLabel="=" />
+ <Key
+ android:codes="47"
+ android:keyLabel="/" />
+ <Key
+ android:codes="92"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\\" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="176"
+ android:keyEdgeFlags="left"
+ android:keyLabel="°" />
+ <Key
+ android:codes="191"
+ android:keyLabel="¿" />
+ <Key
+ android:codes="161"
+ android:keyLabel="¡" />
+ <Key
+ android:codes="247"
+ android:keyLabel="÷" />
+ <Key
+ android:codes="215"
+ android:keyLabel="×" />
+ <Key
+ android:codes="59"
+ android:keyLabel=";" />
+ <Key
+ android:codes="58"
+ android:keyLabel=":" />
+ <Key
+ android:codes="34"
+ android:keyLabel=""" />
+ <Key
+ android:codes="39"
+ android:keyLabel="\'" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="8364"
+ android:keyEdgeFlags="left"
+ android:keyLabel="€" />
+ <Key
+ android:codes="165"
+ android:keyLabel="¥" />
+ <Key
+ android:codes="162"
+ android:keyLabel="¢" />
+ <Key
+ android:codes="36"
+ android:keyLabel="$" />
+ <Key
+ android:codes="60"
+ android:keyLabel="<" />
+ <Key
+ android:codes="62"
+ android:keyLabel=">" />
+ <Key
+ android:codes="8226"
+ android:keyLabel="•" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_alphabet" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/sym_en_in.xml b/res/xml/sym_en_in.xml
new file mode 100644
index 0000000..cebae23
--- /dev/null
+++ b/res/xml/sym_en_in.xml
@@ -0,0 +1,197 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="33"
+ android:keyEdgeFlags="left"
+ android:keyLabel="!" />
+ <Key
+ android:codes="64"
+ android:keyLabel="\@" />
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ <Key
+ android:codes="8377"
+ android:keyLabel="₹" />
+ <Key
+ android:codes="37"
+ android:keyLabel="%" />
+ <Key
+ android:codes="94"
+ android:keyLabel="^" />
+ <Key
+ android:codes="38"
+ android:keyLabel="&" />
+ <Key
+ android:codes="42"
+ android:keyLabel="*" />
+ <Key
+ android:codes="40"
+ android:keyLabel="(" />
+ <Key
+ android:codes="41"
+ android:keyLabel=")" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="126"
+ android:keyEdgeFlags="left"
+ android:keyLabel="~" />
+ <Key
+ android:codes="96"
+ android:keyLabel="`" />
+ <Key
+ android:codes="91"
+ android:keyLabel="[" />
+ <Key
+ android:codes="93"
+ android:keyLabel="]" />
+ <Key
+ android:codes="123"
+ android:keyLabel="{" />
+ <Key
+ android:codes="125"
+ android:keyLabel="}" />
+ <Key
+ android:codes="124"
+ android:keyLabel="|" />
+ <Key
+ android:codes="43"
+ android:keyLabel="+" />
+ <Key
+ android:codes="61"
+ android:keyLabel="=" />
+ <Key
+ android:codes="47"
+ android:keyLabel="/" />
+ <Key
+ android:codes="92"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\\" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="176"
+ android:keyEdgeFlags="left"
+ android:keyLabel="°" />
+ <Key
+ android:codes="191"
+ android:keyLabel="¿" />
+ <Key
+ android:codes="161"
+ android:keyLabel="¡" />
+ <Key
+ android:codes="247"
+ android:keyLabel="÷" />
+ <Key
+ android:codes="215"
+ android:keyLabel="×" />
+ <Key
+ android:codes="59"
+ android:keyLabel=";" />
+ <Key
+ android:codes="58"
+ android:keyLabel=":" />
+ <Key
+ android:codes="34"
+ android:keyLabel=""" />
+ <Key
+ android:codes="39"
+ android:keyLabel="\'" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="8364"
+ android:keyEdgeFlags="left"
+ android:keyLabel="€" />
+ <Key
+ android:codes="36"
+ android:keyLabel="$" />
+ <Key
+ android:codes="162"
+ android:keyLabel="¢" />
+ <Key
+ android:codes="163"
+ android:keyLabel="£" />
+ <Key
+ android:codes="60"
+ android:keyLabel="<" />
+ <Key
+ android:codes="62"
+ android:keyLabel=">" />
+ <Key
+ android:codes="8226"
+ android:keyLabel="•" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_alphabet" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/sym_eu.xml b/res/xml/sym_eu.xml
new file mode 100644
index 0000000..48c60c9
--- /dev/null
+++ b/res/xml/sym_eu.xml
@@ -0,0 +1,197 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="33"
+ android:keyEdgeFlags="left"
+ android:keyLabel="!" />
+ <Key
+ android:codes="64"
+ android:keyLabel="\@" />
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ <Key
+ android:codes="8364"
+ android:keyLabel="€" />
+ <Key
+ android:codes="37"
+ android:keyLabel="%" />
+ <Key
+ android:codes="94"
+ android:keyLabel="^" />
+ <Key
+ android:codes="38"
+ android:keyLabel="&" />
+ <Key
+ android:codes="42"
+ android:keyLabel="*" />
+ <Key
+ android:codes="40"
+ android:keyLabel="(" />
+ <Key
+ android:codes="41"
+ android:keyLabel=")" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="126"
+ android:keyEdgeFlags="left"
+ android:keyLabel="~" />
+ <Key
+ android:codes="96"
+ android:keyLabel="`" />
+ <Key
+ android:codes="91"
+ android:keyLabel="[" />
+ <Key
+ android:codes="93"
+ android:keyLabel="]" />
+ <Key
+ android:codes="123"
+ android:keyLabel="{" />
+ <Key
+ android:codes="125"
+ android:keyLabel="}" />
+ <Key
+ android:codes="124"
+ android:keyLabel="|" />
+ <Key
+ android:codes="43"
+ android:keyLabel="+" />
+ <Key
+ android:codes="61"
+ android:keyLabel="=" />
+ <Key
+ android:codes="47"
+ android:keyLabel="/" />
+ <Key
+ android:codes="92"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\\" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="176"
+ android:keyEdgeFlags="left"
+ android:keyLabel="°" />
+ <Key
+ android:codes="191"
+ android:keyLabel="¿" />
+ <Key
+ android:codes="161"
+ android:keyLabel="¡" />
+ <Key
+ android:codes="247"
+ android:keyLabel="÷" />
+ <Key
+ android:codes="215"
+ android:keyLabel="×" />
+ <Key
+ android:codes="59"
+ android:keyLabel=";" />
+ <Key
+ android:codes="58"
+ android:keyLabel=":" />
+ <Key
+ android:codes="34"
+ android:keyLabel=""" />
+ <Key
+ android:codes="39"
+ android:keyLabel="\'" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="36"
+ android:keyEdgeFlags="left"
+ android:keyLabel="$" />
+ <Key
+ android:codes="165"
+ android:keyLabel="¥" />
+ <Key
+ android:codes="162"
+ android:keyLabel="¢" />
+ <Key
+ android:codes="163"
+ android:keyLabel="£" />
+ <Key
+ android:codes="60"
+ android:keyLabel="<" />
+ <Key
+ android:codes="62"
+ android:keyLabel=">" />
+ <Key
+ android:codes="8226"
+ android:keyLabel="•" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_alphabet" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/sym_fr.xml b/res/xml/sym_fr.xml
new file mode 100644
index 0000000..b175ddb
--- /dev/null
+++ b/res/xml/sym_fr.xml
@@ -0,0 +1,197 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="33"
+ android:keyEdgeFlags="left"
+ android:keyLabel="!" />
+ <Key
+ android:codes="64"
+ android:keyLabel="\@" />
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ <Key
+ android:codes="8364"
+ android:keyLabel="€" />
+ <Key
+ android:codes="37"
+ android:keyLabel="%" />
+ <Key
+ android:codes="94"
+ android:keyLabel="^" />
+ <Key
+ android:codes="38"
+ android:keyLabel="&" />
+ <Key
+ android:codes="42"
+ android:keyLabel="*" />
+ <Key
+ android:codes="40"
+ android:keyLabel="(" />
+ <Key
+ android:codes="41"
+ android:keyLabel=")" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="126"
+ android:keyEdgeFlags="left"
+ android:keyLabel="~" />
+ <Key
+ android:codes="96"
+ android:keyLabel="`" />
+ <Key
+ android:codes="91"
+ android:keyLabel="[" />
+ <Key
+ android:codes="93"
+ android:keyLabel="]" />
+ <Key
+ android:codes="123"
+ android:keyLabel="{" />
+ <Key
+ android:codes="125"
+ android:keyLabel="}" />
+ <Key
+ android:codes="124"
+ android:keyLabel="|" />
+ <Key
+ android:codes="43"
+ android:keyLabel="+" />
+ <Key
+ android:codes="61"
+ android:keyLabel="=" />
+ <Key
+ android:codes="47"
+ android:keyLabel="/" />
+ <Key
+ android:codes="92"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\\" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="176"
+ android:keyEdgeFlags="left"
+ android:keyLabel="°" />
+ <Key
+ android:codes="191"
+ android:keyLabel="¿" />
+ <Key
+ android:codes="161"
+ android:keyLabel="¡" />
+ <Key
+ android:codes="247"
+ android:keyLabel="÷" />
+ <Key
+ android:codes="215"
+ android:keyLabel="×" />
+ <Key
+ android:codes="59"
+ android:keyLabel=";" />
+ <Key
+ android:codes="58"
+ android:keyLabel=":" />
+ <Key
+ android:codes="34"
+ android:keyLabel=""" />
+ <Key
+ android:codes="8226"
+ android:keyLabel="•" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="36"
+ android:keyEdgeFlags="left"
+ android:keyLabel="$" />
+ <Key
+ android:codes="165"
+ android:keyLabel="¥" />
+ <Key
+ android:codes="162"
+ android:keyLabel="¢" />
+ <Key
+ android:codes="163"
+ android:keyLabel="£" />
+ <Key
+ android:codes="60"
+ android:keyLabel="<" />
+ <Key
+ android:codes="62"
+ android:keyLabel=">" />
+ <Key
+ android:codes="39"
+ android:keyLabel="\'" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_alphabet" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/res/xml/sym_us.xml b/res/xml/sym_us.xml
new file mode 100644
index 0000000..2091e24
--- /dev/null
+++ b/res/xml/sym_us.xml
@@ -0,0 +1,197 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+ android:keyHeight="@dimen/key_height"
+ android:keyWidth="@dimen/key_width"
+ android:verticalGap="@dimen/keyboard_vertical_gap"
+ android:horizontalGap="@dimen/keyboard_horizontal_gap" >
+
+ <Row>
+ <Key
+ android:codes="33"
+ android:keyEdgeFlags="left"
+ android:keyLabel="!" />
+ <Key
+ android:codes="64"
+ android:keyLabel="\@" />
+ <Key
+ android:codes="35"
+ android:keyLabel="\#" />
+ <Key
+ android:codes="36"
+ android:keyLabel="$" />
+ <Key
+ android:codes="37"
+ android:keyLabel="%" />
+ <Key
+ android:codes="94"
+ android:keyLabel="^" />
+ <Key
+ android:codes="38"
+ android:keyLabel="&" />
+ <Key
+ android:codes="42"
+ android:keyLabel="*" />
+ <Key
+ android:codes="40"
+ android:keyLabel="(" />
+ <Key
+ android:codes="41"
+ android:keyLabel=")" />
+ <Key
+ android:codes="-5"
+ android:keyEdgeFlags="right"
+ android:keyIcon="@drawable/ic_ime_delete"
+ android:keyLabel="@string/keyboardview_keycode_delete" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="126"
+ android:keyEdgeFlags="left"
+ android:keyLabel="~" />
+ <Key
+ android:codes="96"
+ android:keyLabel="`" />
+ <Key
+ android:codes="91"
+ android:keyLabel="[" />
+ <Key
+ android:codes="93"
+ android:keyLabel="]" />
+ <Key
+ android:codes="123"
+ android:keyLabel="{" />
+ <Key
+ android:codes="125"
+ android:keyLabel="}" />
+ <Key
+ android:codes="124"
+ android:keyLabel="|" />
+ <Key
+ android:codes="43"
+ android:keyLabel="+" />
+ <Key
+ android:codes="61"
+ android:keyLabel="=" />
+ <Key
+ android:codes="47"
+ android:keyLabel="/" />
+ <Key
+ android:codes="92"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\\" />
+ </Row>
+ <Row>
+ <Key
+ android:codes="176"
+ android:keyEdgeFlags="left"
+ android:keyLabel="°" />
+ <Key
+ android:codes="191"
+ android:keyLabel="¿" />
+ <Key
+ android:codes="161"
+ android:keyLabel="¡" />
+ <Key
+ android:codes="247"
+ android:keyLabel="÷" />
+ <Key
+ android:codes="215"
+ android:keyLabel="×" />
+ <Key
+ android:codes="59"
+ android:keyLabel=";" />
+ <Key
+ android:codes="58"
+ android:keyLabel=":" />
+ <Key
+ android:codes="34"
+ android:keyLabel=""" />
+ <Key
+ android:codes="39"
+ android:keyLabel="\'" />
+ <Key
+ android:codes="95"
+ android:keyLabel="_" />
+ <Key
+ android:codes="38"
+ android:keyEdgeFlags="right"
+ android:keyLabel="&" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="8364"
+ android:keyEdgeFlags="left"
+ android:keyLabel="€" />
+ <Key
+ android:codes="165"
+ android:keyLabel="¥" />
+ <Key
+ android:codes="162"
+ android:keyLabel="¢" />
+ <Key
+ android:codes="163"
+ android:keyLabel="£" />
+ <Key
+ android:codes="60"
+ android:keyLabel="<" />
+ <Key
+ android:codes="62"
+ android:keyLabel=">" />
+ <Key
+ android:codes="8226"
+ android:keyLabel="•" />
+ <Key
+ android:codes="44"
+ android:keyLabel="," />
+ <Key
+ android:codes="46"
+ android:keyLabel="." />
+ <Key
+ android:codes="45"
+ android:keyLabel="-" />
+ <Key
+ android:codes="63"
+ android:keyEdgeFlags="right"
+ android:keyLabel="\?" />
+ </Row>
+ <Row android:rowEdgeFlags="bottom" >
+ <Key
+ android:codes="-2"
+ android:keyEdgeFlags="left"
+ android:keyLabel="@string/keyboardview_keycode_mode_change"
+ android:keyIcon="@drawable/ic_ime_alphabet" />
+ <Key
+ android:codes="-1"
+ android:keyLabel="@string/keyboardview_keycode_shift"
+ android:keyIcon="@drawable/ic_ime_shift_off" />
+ <Key
+ android:codes="32"
+ android:keyIcon="@drawable/ic_ime_space"
+ android:keyLabel="@string/keyboardview_keycode_space"
+ android:keyWidth="@dimen/space_key_width" />
+ <Key
+ android:codes="-3"
+ android:keyLabel="@string/keyboardview_keycode_left"
+ android:keyIcon="@drawable/ic_ime_left_arrow" />
+ <Key
+ android:codes="-4"
+ android:keyEdgeFlags="right"
+ android:keyLabel="@string/keyboardview_keycode_right"
+ android:keyIcon="@drawable/ic_ime_right_arrow" />
+ </Row>
+</Keyboard>
diff --git a/src/com/android/inputmethod/leanback/LeanbackKeyboardContainer.java b/src/com/android/inputmethod/leanback/LeanbackKeyboardContainer.java
new file mode 100644
index 0000000..124fdf3
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/LeanbackKeyboardContainer.java
@@ -0,0 +1,1570 @@
+/*
+ * Copyright (C) 2019 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.leanback;
+
+import android.animation.Animator;
+import android.animation.ValueAnimator;
+import android.speech.RecognitionListener;
+import android.os.Bundle;
+
+import com.android.inputmethod.leanback.LeanbackKeyboardController.InputListener;
+import com.android.inputmethod.leanback.voice.RecognizerView;
+import com.android.inputmethod.leanback.voice.SpeechLevelSource;
+import com.android.inputmethod.leanback.service.LeanbackImeService;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnFocusChangeListener;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.animation.AccelerateInterpolator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.animation.Animator.AnimatorListener;
+import android.view.animation.Animation;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+import android.view.animation.Transformation;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.speech.RecognizerIntent;
+import android.speech.SpeechRecognizer;
+import android.text.TextUtils;
+import android.text.method.QwertyKeyListener;
+import android.text.style.LocaleSpan;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.HorizontalScrollView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
+import android.util.Log;
+import android.inputmethodservice.Keyboard;
+import android.inputmethodservice.Keyboard.Key;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * This is the keyboard container for GridIme that contains the following views:
+ * <ul>
+ * <li>voice button</li>
+ * <li>main keyboard</li>
+ * <li>action button</li>
+ * <li>focus bubble</li>
+ * <li>touch indicator</li>
+ * <li>candidate view</li>
+ * </ul>
+ * Keyboard grid layout:
+ *
+ * <pre>
+ * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |OTH| |
+ * |<- | - | - | - | - | - | - | - | - | ->|ER |ACT|
+ * |<- | - | - | M | A | I | N | - | - | ->| | |
+ * |<- | K | E | Y | B | O | A | R | D | ->|KEY|ION|
+ * |<- | - | - | - | - | - | - | - | - | ->|S | |
+ * </pre>
+ */
+public class LeanbackKeyboardContainer {
+
+ private static final String TAG = "LbKbContainer";
+ private static final boolean DEBUG = false;
+ private static final boolean VOICE_SUPPORTED = true;
+ private static final String IME_PRIVATE_OPTIONS_ESCAPE_NORTH_LEGACY = "EscapeNorth=1";
+ private static final String IME_PRIVATE_OPTIONS_ESCAPE_NORTH = "escapeNorth";
+ private static final String IME_PRIVATE_OPTIONS_VOICE_DISMISS_LEGACY = "VoiceDismiss=1";
+ private static final String IME_PRIVATE_OPTIONS_VOICE_DISMISS = "voiceDismiss";
+
+ /**
+ * This is the length of animations that move an indicator across the keys. Snaps and flicks
+ * will use this duration for the movement.
+ */
+ private static final long MOVEMENT_ANIMATION_DURATION = 150;
+
+ /**
+ * This interpolator is used for movement animations.
+ */
+ public static final Interpolator sMovementInterpolator = new DecelerateInterpolator(1.5f);
+
+ /**
+ * These are the states that the view can be in and affect the icon appearance. NO_TOUCH is when
+ * there are no fingers down on the input device.
+ */
+ public static final int TOUCH_STATE_NO_TOUCH = 0;
+
+ /**
+ * TOUCH_SNAP indicates that a finger is down but the indicator is still considered snapped to a
+ * letter. Once the user moves a given distance from the snapped position it will change to
+ * TOUCH_MOVE.
+ */
+ public static final int TOUCH_STATE_TOUCH_SNAP = 1;
+
+ /**
+ * TOUCH_MOVE indicates the user is moving freely around the space and is not snapped to any
+ * letter.
+ */
+ public static final int TOUCH_STATE_TOUCH_MOVE = 2;
+
+ /**
+ * CLICK indicates the selection button is currently pressed. When the button is released we
+ * will transition back to snap or no touch depending on whether there is still a finger down on
+ * the input device or not.
+ */
+ public static final int TOUCH_STATE_CLICK = 3;
+
+ // The minimum distance the user must move their finger to transition from
+ // the SNAP to the MOVE state
+ public static final double TOUCH_MOVE_MIN_DISTANCE = .1;
+
+ /**
+ * When processing a flick or dpad event it is easier to move a key width + a fudge factor than
+ * to directly compute what the next key position should be. This is the fudge factor.
+ */
+ public static final double DIRECTION_STEP_MULTIPLIER = 1.25;
+
+ /**
+ * Directions sent to event listeners.
+ */
+ public static final int DIRECTION_LEFT = 1 << 0;
+ public static final int DIRECTION_DOWN = 1 << 1;
+ public static final int DIRECTION_RIGHT = 1 << 2;
+ public static final int DIRECTION_UP = 1 << 3;
+ public static final int DIRECTION_DOWN_LEFT = DIRECTION_DOWN | DIRECTION_LEFT;
+ public static final int DIRECTION_DOWN_RIGHT = DIRECTION_DOWN | DIRECTION_RIGHT;
+ public static final int DIRECTION_UP_RIGHT = DIRECTION_UP | DIRECTION_RIGHT;
+ public static final int DIRECTION_UP_LEFT = DIRECTION_UP | DIRECTION_LEFT;
+
+ /**
+ * handler messages
+ */
+ // align selector in onStartInputView
+ private static final int MSG_START_INPUT_VIEW = 0;
+
+ // If this were a physical keyboard the width in cm. This will be mapped
+ // to the width in pixels but is representative of the mapping from the
+ // remote input to the screen. Higher values will require larger moves to
+ // get across the keyboard
+ protected static final float PHYSICAL_WIDTH_CM = 12;
+ // If this were a physical keyboard the height in cm. This will be mapped
+ // to the height in pixels but is representative of the mapping from the
+ // remote input to the screen. Higher values will require larger moves to
+ // get across the keyboard
+ protected static final float PHYSICAL_HEIGHT_CM = 5;
+
+ /**
+ * Listener for publishing voice input result to {@link LeanbackKeyboardController}
+ */
+ public static interface VoiceListener {
+ public void onVoiceResult(String result);
+ }
+
+ public static interface DismissListener {
+ public void onDismiss(boolean fromVoice);
+ }
+
+ /**
+ * Class for holding information about the currently focused key.
+ */
+ public static class KeyFocus {
+ public static final int TYPE_INVALID = -1;
+ public static final int TYPE_MAIN = 0;
+ public static final int TYPE_VOICE = 1;
+ public static final int TYPE_ACTION = 2;
+ public static final int TYPE_SUGGESTION = 3;
+
+ /**
+ * The bounding box for the current focused key/view
+ */
+ final Rect rect;
+
+ /**
+ * The index of the focused key or suggestion. This is invalid for views that don't have
+ * indexed items.
+ */
+ int index;
+
+ /**
+ * The type of key which indicates which view/keyboard the focus is in.
+ */
+ int type;
+
+ /**
+ * The key code for the focused key. This is invalid for views that don't use key codes.
+ */
+ int code;
+
+ /**
+ * The text label for the focused key. This is invalid for views that don't use labels.
+ */
+ CharSequence label;
+
+ public KeyFocus() {
+ type = TYPE_INVALID;
+ rect = new Rect();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder bob = new StringBuilder();
+ bob.append("[type: ").append(type)
+ .append(", index: ").append(index)
+ .append(", code: ").append(code)
+ .append(", label: ").append(label)
+ .append(", rect: ").append(rect)
+ .append("]");
+ return bob.toString();
+ }
+
+ public void set(KeyFocus focus) {
+ index = focus.index;
+ type = focus.type;
+ code = focus.code;
+ label = focus.label;
+ rect.set(focus.rect);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ KeyFocus keyFocus = (KeyFocus) o;
+
+ if (code != keyFocus.code) {
+ return false;
+ }
+ if (index != keyFocus.index) {
+ return false;
+ }
+ if (type != keyFocus.type) {
+ return false;
+ }
+ if (label != null ? !label.equals(keyFocus.label) : keyFocus.label != null) {
+ return false;
+ }
+ if (!rect.equals(keyFocus.rect)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = rect.hashCode();
+ result = 31 * result + index;
+ result = 31 * result + type;
+ result = 31 * result + code;
+ result = 31 * result + (label != null ? label.hashCode() : 0);
+ return result;
+ }
+ }
+
+ private class VoiceIntroAnimator {
+ private AnimatorListener mEnterListener;
+ private AnimatorListener mExitListener;
+ private ValueAnimator mValueAnimator;
+
+ public VoiceIntroAnimator(AnimatorListener enterListener, AnimatorListener exitListener) {
+ mEnterListener = enterListener;
+ mExitListener = exitListener;
+
+ mValueAnimator = ValueAnimator.ofFloat(mAlphaOut, mAlphaIn);
+ mValueAnimator.setDuration(mVoiceAnimDur);
+ mValueAnimator.setInterpolator(new AccelerateInterpolator());
+ }
+
+ void startEnterAnimation() {
+ if (!isVoiceVisible() && !mValueAnimator.isRunning()) {
+ start(true);
+ }
+ }
+
+ void startExitAnimation() {
+ if (isVoiceVisible() && !mValueAnimator.isRunning()) {
+ start(false);
+ }
+ }
+
+ private void start(final boolean enterVoice) {
+ // TODO make animation continous
+ mValueAnimator.cancel();
+
+ mValueAnimator.removeAllListeners();
+ mValueAnimator.addListener(enterVoice ? mEnterListener : mExitListener);
+ mValueAnimator.removeAllUpdateListeners();
+ mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {
+
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float progress = (Float) mValueAnimator.getAnimatedValue();
+ float antiProgress = mAlphaIn + mAlphaOut - progress;
+
+ float kbAlpha = enterVoice ? antiProgress : progress;
+ float voiceAlpha = enterVoice ? progress : antiProgress;
+
+ mMainKeyboardView.setAlpha(kbAlpha);
+ mActionButtonView.setAlpha(kbAlpha);
+ mVoiceButtonView.setAlpha(voiceAlpha);
+
+ if (progress == mAlphaOut) {
+ // first pass
+ if (enterVoice) {
+ mVoiceButtonView.setVisibility(View.VISIBLE);
+ } else {
+ mMainKeyboardView.setVisibility(View.VISIBLE);
+ mActionButtonView.setVisibility(View.VISIBLE);
+ }
+ } else if (progress == mAlphaIn) {
+ // done
+ if (enterVoice) {
+ mMainKeyboardView.setVisibility(View.INVISIBLE);
+ mActionButtonView.setVisibility(View.INVISIBLE);
+ } else {
+ mVoiceButtonView.setVisibility(View.INVISIBLE);
+ }
+ }
+ }
+ });
+
+ mValueAnimator.start();
+ }
+ }
+
+ /**
+ * keyboard flags based on the edittext types
+ */
+ // if suggestions are enabled and suggestion view is visible
+ private boolean mSuggestionsEnabled;
+ // if auto entering space after period or suggestions is enabled
+ private boolean mAutoEnterSpaceEnabled;
+ // if voice button is enabled
+ private boolean mVoiceEnabled;
+ // initial main keyboard to show for the specific edittext
+ private Keyboard mInitialMainKeyboard;
+ // text resource id of the enter key. If set to 0, show enter key image
+ private int mEnterKeyTextResId;
+ private CharSequence mEnterKeyText;
+
+ /**
+ * This animator controls the way the touch indicator grows and shrinks when changing states.
+ */
+ private ValueAnimator mSelectorAnimator;
+
+ /**
+ * The current state of touch.
+ */
+ private int mTouchState = TOUCH_STATE_NO_TOUCH;
+
+ private VoiceListener mVoiceListener;
+
+ private DismissListener mDismissListener;
+
+ private LeanbackImeService mContext;
+ private RelativeLayout mRootView;
+
+ private View mKeyboardsContainer;
+ private View mSuggestionsBg;
+ private HorizontalScrollView mSuggestionsContainer;
+ private LinearLayout mSuggestions;
+ private LeanbackKeyboardView mMainKeyboardView;
+ private Button mActionButtonView;
+ private ScaleAnimation mSelectorAnimation;
+ private View mSelector;
+ private float mOverestimate;
+
+ // The modeled physical position of the current selection in cm
+ private PointF mPhysicalSelectPos = new PointF(2, .5f);
+ // The position of the touch indicator in cm
+ private PointF mPhysicalTouchPos = new PointF(2, .5f);
+ // A point for doing temporary calculations
+ private PointF mTempPoint = new PointF();
+
+ private KeyFocus mCurrKeyInfo = new KeyFocus();
+ private KeyFocus mDownKeyInfo = new KeyFocus();
+ private KeyFocus mTempKeyInfo = new KeyFocus();
+
+ private LeanbackKeyboardView mPrevView;
+ private Rect mRect = new Rect();
+ private Float mX;
+ private Float mY;
+ private int mMiniKbKeyIndex;
+
+ private final int mClickAnimDur;
+ private final int mVoiceAnimDur;
+ private final float mAlphaIn;
+ private final float mAlphaOut;
+
+ private Keyboard mAbcKeyboard;
+ private Keyboard mSymKeyboard;
+ private Keyboard mNumKeyboard;
+
+ // if we should capitalize the first letter in each sentence
+ private boolean mCapSentences;
+
+ // if we should capitalize the first letter in each word
+ private boolean mCapWords;
+
+ // if we should capitalize every character
+ private boolean mCapCharacters;
+
+ // if voice is on
+ private boolean mVoiceOn;
+
+ // Whether to allow escaping north or not
+ private boolean mEscapeNorthEnabled;
+
+ // Whether to dismiss when voice button is pressed
+ private boolean mVoiceKeyDismissesEnabled;
+
+ /**
+ * Voice
+ */
+ private Intent mRecognizerIntent;
+ private SpeechRecognizer mSpeechRecognizer;
+ private SpeechLevelSource mSpeechLevelSource;
+ private RecognizerView mVoiceButtonView;
+
+ private class ScaleAnimation extends Animation {
+ private final ViewGroup.LayoutParams mParams;
+ private final View mView;
+ private float mStartX;
+ private float mStartY;
+ private float mStartWidth;
+ private float mStartHeight;
+ private float mEndX;
+ private float mEndY;
+ private float mEndWidth;
+ private float mEndHeight;
+
+ public ScaleAnimation(FrameLayout view) {
+ mView = view;
+ mParams = view.getLayoutParams();
+ setDuration(MOVEMENT_ANIMATION_DURATION);
+ setInterpolator(sMovementInterpolator);
+ }
+
+ public void setAnimationBounds(float x, float y, float width, float height) {
+ mEndX = x;
+ mEndY = y;
+ mEndWidth = width;
+ mEndHeight = height;
+ }
+
+ @Override
+ protected void applyTransformation(float interpolatedTime, Transformation t) {
+ if (interpolatedTime == 0) {
+ mStartX = mView.getX();
+ mStartY = mView.getY();
+ mStartWidth = mParams.width;
+ mStartHeight = mParams.height;
+ } else {
+ setValues(((mEndX - mStartX) * interpolatedTime + mStartX),
+ ((mEndY - mStartY) * interpolatedTime + mStartY),
+ ((int)((mEndWidth - mStartWidth) * interpolatedTime + mStartWidth)),
+ ((int)((mEndHeight - mStartHeight) * interpolatedTime + mStartHeight)));
+ }
+ }
+
+ public void setValues(float x, float y, float width, float height) {
+ mView.setX(x);
+ mView.setY(y);
+ mParams.width = (int)(width);
+ mParams.height = (int)(height);
+ mView.setLayoutParams(mParams);
+ mView.requestLayout();
+ }
+ };
+
+ private AnimatorListener mVoiceEnterListener = new AnimatorListener() {
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mSelector.setVisibility(View.INVISIBLE);
+ startRecognition(mContext);
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ }
+ };
+
+ private AnimatorListener mVoiceExitListener = new AnimatorListener() {
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mVoiceButtonView.showNotListening();
+ mSpeechRecognizer.cancel();
+ mSpeechRecognizer.setRecognitionListener(null);
+ mVoiceOn = false;
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mSelector.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ }
+ };
+
+ private final VoiceIntroAnimator mVoiceAnimator;
+
+ // Tracks whether or not a touch event is in progress. This is true while
+ // a finger is down on the pad.
+ private boolean mTouchDown = false;
+
+ public LeanbackKeyboardContainer(Context context) {
+ mContext = (LeanbackImeService) context;
+
+ final Resources res = mContext.getResources();
+ mVoiceAnimDur = res.getInteger(R.integer.voice_anim_duration);
+ mAlphaIn = res.getFraction(R.fraction.alpha_in, 1, 1);
+ mAlphaOut = res.getFraction(R.fraction.alpha_out, 1, 1);
+
+ mVoiceAnimator = new VoiceIntroAnimator(mVoiceEnterListener, mVoiceExitListener);
+
+ initKeyboards();
+
+ mRootView = (RelativeLayout) mContext.getLayoutInflater()
+ .inflate(R.layout.root_leanback, null);
+ mKeyboardsContainer = mRootView.findViewById(R.id.keyboard);
+ mSuggestionsBg = mRootView.findViewById(R.id.candidate_background);
+ mSuggestionsContainer =
+ (HorizontalScrollView) mRootView.findViewById(R.id.suggestions_container);
+ mSuggestions = (LinearLayout) mSuggestionsContainer.findViewById(R.id.suggestions);
+
+ mMainKeyboardView = (LeanbackKeyboardView) mRootView.findViewById(R.id.main_keyboard);
+ mVoiceButtonView = (RecognizerView) mRootView.findViewById(R.id.voice);
+
+ mActionButtonView = (Button) mRootView.findViewById(R.id.enter);
+
+ mSelector = mRootView.findViewById(R.id.selector);
+ mSelectorAnimation = new ScaleAnimation((FrameLayout) mSelector);
+
+ mOverestimate = mContext.getResources().getFraction(R.fraction.focused_scale, 1, 1);
+ float scale = context.getResources().getFraction(R.fraction.clicked_scale, 1, 1);
+ mClickAnimDur = context.getResources().getInteger(R.integer.clicked_anim_duration);
+ mSelectorAnimator = ValueAnimator.ofFloat(1.0f, scale);
+ mSelectorAnimator.setDuration(mClickAnimDur);
+ mSelectorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float scale = (Float) animation.getAnimatedValue();
+ mSelector.setScaleX(scale);
+ mSelector.setScaleY(scale);
+ }
+ });
+
+ mSpeechLevelSource = new SpeechLevelSource();
+ mVoiceButtonView.setSpeechLevelSource(mSpeechLevelSource);
+ mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(mContext);
+ mVoiceButtonView.setCallback(new RecognizerView.Callback() {
+ @Override
+ public void onStartRecordingClicked() {
+ startVoiceRecording();
+ }
+
+ @Override
+ public void onStopRecordingClicked() {
+ cancelVoiceRecording();
+ }
+
+ @Override
+ public void onCancelRecordingClicked() {
+ cancelVoiceRecording();
+ }
+ });
+
+ }
+
+ public void startVoiceRecording() {
+ if (mVoiceEnabled) {
+ if (mVoiceKeyDismissesEnabled) {
+ if (DEBUG) Log.v(TAG, "Voice Dismiss");
+ mDismissListener.onDismiss(true);
+ } else {
+ mVoiceAnimator.startEnterAnimation();
+ }
+ }
+ }
+
+ public void cancelVoiceRecording() {
+ mVoiceAnimator.startExitAnimation();
+ }
+
+ public void resetVoice() {
+ mMainKeyboardView.setAlpha(mAlphaIn);
+ mActionButtonView.setAlpha(mAlphaIn);
+ mVoiceButtonView.setAlpha(mAlphaOut);
+
+ mMainKeyboardView.setVisibility(View.VISIBLE);
+ mActionButtonView.setVisibility(View.VISIBLE);
+ mVoiceButtonView.setVisibility(View.INVISIBLE);
+ }
+
+ public boolean isVoiceVisible() {
+ return mVoiceButtonView.getVisibility() == View.VISIBLE;
+ }
+
+ private void initKeyboards() {
+ Locale locale = Locale.getDefault();
+
+ if (isMatch(locale, LeanbackLocales.QWERTY_GB)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_en_gb);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_en_gb);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_IN)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_en_in);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_en_in);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_ES_EU)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_es_eu);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_ES_US)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_es_us);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_us);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_AZ)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_az);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_CA)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_ca);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_DA)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_da);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_ET)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_et);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_FI)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_fi);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_NB)) {
+ // in the LatinIME nb uses the US symbols (usd instead of euro)
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_nb);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_us);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_SV)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_sv);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTY_US)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_us);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_us);
+ } else if (isMatch(locale, LeanbackLocales.QWERTZ_CH)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwertz_ch);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.QWERTZ)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwertz);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ } else if (isMatch(locale, LeanbackLocales.AZERTY)) {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.azerty);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_azerty);
+ } else {
+ mAbcKeyboard = new Keyboard(mContext, R.xml.qwerty_eu);
+ mSymKeyboard = new Keyboard(mContext, R.xml.sym_eu);
+ }
+
+ mNumKeyboard = new Keyboard(mContext, R.xml.number);
+ }
+
+ private boolean isMatch(Locale locale, Locale[] list) {
+ for (Locale compare : list) {
+ // comparison language is either blank or they match
+ if (TextUtils.isEmpty(compare.getLanguage()) ||
+ TextUtils.equals(locale.getLanguage(), compare.getLanguage())) {
+ // comparison country is either blank or they match
+ if (TextUtils.isEmpty(compare.getCountry()) ||
+ TextUtils.equals(locale.getCountry(), compare.getCountry())) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * This method is called when we start the input at a NEW input field to set up the IME options,
+ * such as suggestions, voice, and action
+ */
+ public void onStartInput(EditorInfo attribute) {
+ setImeOptions(mContext.getResources(), attribute);
+ mVoiceOn = false;
+ }
+
+ /**
+ * This method is called whenever we bring up the IME at an input field.
+ */
+ public void onStartInputView() {
+ // This must be done here because modifying the views before it is
+ // shown can cause selection handles to be shown if using a USB
+ // keyboard in a WebView.
+ clearSuggestions();
+
+ RelativeLayout.LayoutParams lp =
+ (RelativeLayout.LayoutParams) mKeyboardsContainer.getLayoutParams();
+ if (mSuggestionsEnabled) {
+ lp.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
+ mSuggestionsContainer.setVisibility(View.VISIBLE);
+ mSuggestionsBg.setVisibility(View.VISIBLE);
+ } else {
+ lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
+ mSuggestionsContainer.setVisibility(View.GONE);
+ mSuggestionsBg.setVisibility(View.GONE);
+ }
+ mKeyboardsContainer.setLayoutParams(lp);
+
+ mMainKeyboardView.setKeyboard(mInitialMainKeyboard);
+ // TODO fix this for number keyboard
+ mVoiceButtonView.setMicEnabled(mVoiceEnabled);
+ resetVoice();
+ dismissMiniKeyboard();
+
+ // setImeOptions will be called before this, setting the text resource value
+ if (!TextUtils.isEmpty(mEnterKeyText)) {
+ mActionButtonView.setText(mEnterKeyText);
+ mActionButtonView.setContentDescription(mEnterKeyText);
+ } else {
+ mActionButtonView.setText(mEnterKeyTextResId);
+ mActionButtonView.setContentDescription(mContext.getString(mEnterKeyTextResId));
+ }
+
+ if (mCapCharacters) {
+ setShiftState(LeanbackKeyboardView.SHIFT_LOCKED);
+ } else if (mCapSentences || mCapWords) {
+ setShiftState(LeanbackKeyboardView.SHIFT_ON);
+ } else {
+ setShiftState(LeanbackKeyboardView.SHIFT_OFF);
+ }
+ }
+
+ /**
+ * This method is called when the keyboard layout is complete, to set up the initial focus and
+ * visibility. This method gets called later than {@link onStartInput} and
+ * {@link onStartInputView}.
+ */
+ public void onInitInputView() {
+ resetFocusCursor();
+ mSelector.setVisibility(View.VISIBLE);
+ }
+
+ public RelativeLayout getView() {
+ return mRootView;
+ }
+
+ public void setVoiceListener(VoiceListener listener) {
+ mVoiceListener = listener;
+ }
+
+ public void setDismissListener(DismissListener listener) {
+ mDismissListener = listener;
+ }
+
+ private void setImeOptions(Resources resources, EditorInfo attribute) {
+ mSuggestionsEnabled = true;
+ mAutoEnterSpaceEnabled = true;
+ mVoiceEnabled = true;
+ mInitialMainKeyboard = mAbcKeyboard;
+ mEscapeNorthEnabled = false;
+ mVoiceKeyDismissesEnabled = false;
+
+ // set keyboard properties
+ switch (LeanbackUtils.getInputTypeClass(attribute)) {
+ case EditorInfo.TYPE_CLASS_NUMBER:
+ case EditorInfo.TYPE_CLASS_DATETIME:
+ case EditorInfo.TYPE_CLASS_PHONE:
+ mSuggestionsEnabled = false;
+ mVoiceEnabled = false;
+ // TODO use number keyboard for these input types
+ mInitialMainKeyboard = mAbcKeyboard;
+ break;
+ case EditorInfo.TYPE_CLASS_TEXT:
+ switch (LeanbackUtils.getInputTypeVariation(attribute)) {
+ case EditorInfo.TYPE_TEXT_VARIATION_PASSWORD:
+ case EditorInfo.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+ case EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+ case EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME:
+ mSuggestionsEnabled = false;
+ mVoiceEnabled = false;
+ mInitialMainKeyboard = mAbcKeyboard;
+ break;
+ case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+ case EditorInfo.TYPE_TEXT_VARIATION_URI:
+ case EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT:
+ case EditorInfo.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+ mSuggestionsEnabled = true;
+ mAutoEnterSpaceEnabled = false;
+ mVoiceEnabled = false;
+ mInitialMainKeyboard = mAbcKeyboard;
+ break;
+ }
+ break;
+ }
+
+ if (mSuggestionsEnabled) {
+ mSuggestionsEnabled = (attribute.inputType
+ & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) == 0;
+ }
+ if (mAutoEnterSpaceEnabled) {
+ mAutoEnterSpaceEnabled = mSuggestionsEnabled && mAutoEnterSpaceEnabled;
+ }
+ mCapSentences = (attribute.inputType
+ & EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES) != 0;
+ mCapWords = ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS) != 0) ||
+ (LeanbackUtils.getInputTypeVariation(attribute)
+ == EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME);
+ mCapCharacters = (attribute.inputType
+ & EditorInfo.TYPE_TEXT_FLAG_CAP_CHARACTERS) != 0;
+
+ if (attribute.privateImeOptions != null) {
+ if (attribute.privateImeOptions.contains(IME_PRIVATE_OPTIONS_ESCAPE_NORTH) ||
+ attribute.privateImeOptions.contains(
+ IME_PRIVATE_OPTIONS_ESCAPE_NORTH_LEGACY)) {
+ mEscapeNorthEnabled = true;
+ }
+ if (attribute.privateImeOptions.contains(IME_PRIVATE_OPTIONS_VOICE_DISMISS) ||
+ attribute.privateImeOptions.contains(
+ IME_PRIVATE_OPTIONS_VOICE_DISMISS_LEGACY)) {
+ mVoiceKeyDismissesEnabled = true;
+ }
+ }
+
+ if (DEBUG) {
+ Log.d(TAG, "sugg: " + mSuggestionsEnabled + " | capSentences: " + mCapSentences
+ + " | capWords: " + mCapWords + " | capChar: " + mCapCharacters
+ + " | escapeNorth: " + mEscapeNorthEnabled
+ + " | voiceDismiss : " + mVoiceKeyDismissesEnabled
+ );
+ }
+
+ // set enter key
+ mEnterKeyText = attribute.actionLabel;
+ if (TextUtils.isEmpty(mEnterKeyText)) {
+ switch (LeanbackUtils.getImeAction(attribute)) {
+ case EditorInfo.IME_ACTION_GO:
+ mEnterKeyTextResId = R.string.label_go_key;
+ break;
+ case EditorInfo.IME_ACTION_NEXT:
+ mEnterKeyTextResId = R.string.label_next_key;
+ break;
+ case EditorInfo.IME_ACTION_SEARCH:
+ mEnterKeyTextResId = R.string.label_search_key;
+ break;
+ case EditorInfo.IME_ACTION_SEND:
+ mEnterKeyTextResId = R.string.label_send_key;
+ break;
+ default:
+ mEnterKeyTextResId = R.string.label_done_key;
+ break;
+ }
+ }
+
+ if (!VOICE_SUPPORTED) {
+ mVoiceEnabled = false;
+ }
+ }
+
+ public boolean isVoiceEnabled() {
+ return mVoiceEnabled;
+ }
+
+ public boolean areSuggestionsEnabled() {
+ return mSuggestionsEnabled;
+ }
+
+ public boolean enableAutoEnterSpace() {
+ return mAutoEnterSpaceEnabled;
+ }
+
+ private PointF getAlignmentPosition(float posXCm, float posYCm, PointF result) {
+ float width = mRootView.getWidth() - mRootView.getPaddingRight()
+ - mRootView.getPaddingLeft()
+ - mContext.getResources().getDimension(R.dimen.selector_size);
+ float height = mRootView.getHeight() - mRootView.getPaddingTop()
+ - mRootView.getPaddingBottom()
+ - mContext.getResources().getDimension(R.dimen.selector_size);
+ result.x = posXCm / PHYSICAL_WIDTH_CM * width + mRootView.getPaddingLeft();
+ result.y = posYCm / PHYSICAL_HEIGHT_CM * height + mRootView.getPaddingTop();
+ return result;
+ }
+
+ private void getPhysicalPosition(float x, float y, PointF result) {
+ x -= mSelector.getWidth() / 2;
+ y -= mSelector.getHeight() / 2;
+ float width = mRootView.getWidth() - mRootView.getPaddingRight()
+ - mRootView.getPaddingLeft()
+ - mContext.getResources().getDimension(R.dimen.selector_size);
+ float height = mRootView.getHeight() - mRootView.getPaddingTop()
+ - mRootView.getPaddingBottom()
+ - mContext.getResources().getDimension(R.dimen.selector_size);
+ float posXCm = (x - mRootView.getPaddingLeft()) * PHYSICAL_WIDTH_CM / width;
+ float posYCm = (y - mRootView.getPaddingTop()) * PHYSICAL_HEIGHT_CM / height;
+ result.x = posXCm;
+ result.y = posYCm;
+ }
+
+ private void offsetRect(Rect rect, View view) {
+ rect.left = 0;
+ rect.top = 0;
+ rect.right = view.getWidth();
+ rect.bottom = view.getHeight();
+ ((ViewGroup) mRootView).offsetDescendantRectToMyCoords(view, rect);
+ }
+
+ /**
+ * Finds the {@link KeyFocus} on screen that best matches the given pixel positions
+ *
+ * @param x position in pixels, if null, use the last valid x value
+ * @param y position in pixels, if null, use the last valid y value
+ * @param focus the focus object to update with the result
+ * @return true if focus was successfully found, false otherwise.
+ */
+ public boolean getBestFocus(Float x, Float y, KeyFocus focus) {
+ boolean validFocus = true;
+
+ offsetRect(mRect, mActionButtonView);
+ int actionLeft = mRect.left;
+
+ offsetRect(mRect, mMainKeyboardView);
+ int keyboardTop = mRect.top;
+
+ // use last if invalid
+ x = (x == null) ? mX : x;
+ y = (y == null) ? mY : y;
+
+ final int count = mSuggestions.getChildCount();
+ if (y < keyboardTop && count > 0 && mSuggestionsEnabled) {
+ for (int i = 0; i < count; i++) {
+ View suggestView = mSuggestions.getChildAt(i);
+ offsetRect(mRect, suggestView);
+ if (x < mRect.right || i+1 == count) {
+ suggestView.requestFocus();
+ LeanbackUtils.sendAccessibilityEvent(suggestView.findViewById(R.id.text), true);
+ configureFocus(focus, mRect, i, KeyFocus.TYPE_SUGGESTION);
+ break;
+ }
+ }
+ } else if (y < keyboardTop && mEscapeNorthEnabled) {
+ validFocus = false;
+ escapeNorth();
+ } else if (x > actionLeft) {
+ // closest is the action button
+ offsetRect(mRect, mActionButtonView);
+ configureFocus(focus, mRect, 0, KeyFocus.TYPE_ACTION);
+ } else {
+ mX = x;
+ mY = y;
+
+ // In the main view
+ offsetRect(mRect, mMainKeyboardView);
+ x = (x - mRect.left);
+ y = (y - mRect.top);
+
+ int index = mMainKeyboardView.getNearestIndex(x, y);
+ Key key = mMainKeyboardView.getKey(index);
+ configureFocus(focus, mRect, index, key, KeyFocus.TYPE_MAIN);
+ }
+
+ return validFocus;
+ }
+
+ private void escapeNorth() {
+ if (DEBUG) Log.v(TAG, "Escaping north");
+ mDismissListener.onDismiss(false);
+ }
+
+ private void configureFocus(KeyFocus focus, Rect rect, int index, int type) {
+ focus.type = type;
+ focus.index = index;
+ focus.rect.set(rect);
+ }
+
+ private void configureFocus(KeyFocus focus, Rect rect, int index, Key key, int type) {
+ focus.type = type;
+ if (key == null) {
+ return;
+ }
+ if (key.codes != null) {
+ focus.code = key.codes[0];
+ } else {
+ focus.code = KeyEvent.KEYCODE_UNKNOWN;
+ }
+ focus.index = index;
+ focus.label = key.label;
+ focus.rect.left = key.x + rect.left;
+ focus.rect.top = key.y + rect.top;
+ focus.rect.right = focus.rect.left + key.width;
+ focus.rect.bottom = focus.rect.top + key.height;
+ }
+
+ private void setKbFocus(KeyFocus focus, boolean forceFocusChange, boolean animate) {
+ if (focus.equals(mCurrKeyInfo) && !forceFocusChange) {
+ // Nothing changed
+ return;
+ }
+ LeanbackKeyboardView prevView = mPrevView;
+ mPrevView = null;
+ boolean overestimateWidth = false;
+ boolean overestimateHeight = false;
+
+ switch (focus.type) {
+ case KeyFocus.TYPE_VOICE:
+ mVoiceButtonView.setMicFocused(true);
+ dismissMiniKeyboard();
+ break;
+ case KeyFocus.TYPE_ACTION:
+ LeanbackUtils.sendAccessibilityEvent(mActionButtonView, true);
+ dismissMiniKeyboard();
+ break;
+ case KeyFocus.TYPE_SUGGESTION:
+ dismissMiniKeyboard();
+ break;
+ case KeyFocus.TYPE_MAIN:
+ overestimateHeight = true;
+ overestimateWidth = (focus.code != LeanbackKeyboardView.ASCII_SPACE);
+ mMainKeyboardView.setFocus(focus.index, mTouchState == TOUCH_STATE_CLICK, overestimateWidth);
+ mPrevView = mMainKeyboardView;
+ break;
+ }
+
+ if (prevView != null && prevView != mPrevView) {
+ prevView.setFocus(-1, mTouchState == TOUCH_STATE_CLICK);
+ }
+
+ setSelectorToFocus(focus.rect, overestimateWidth, overestimateHeight, animate);
+ mCurrKeyInfo.set(focus);
+ }
+
+ public void setSelectorToFocus(Rect rect, boolean overestimateWidth, boolean overestimateHeight,
+ boolean animate) {
+ if (mSelector.getWidth() == 0 || mSelector.getHeight() == 0
+ || rect.width() == 0 || rect.height() == 0) {
+ return;
+ }
+
+ float width = rect.width();
+ float height = rect.height();
+
+ if (overestimateHeight) {
+ height *= mOverestimate;
+ }
+ if (overestimateWidth) {
+ width *= mOverestimate;
+ }
+
+ float major = Math.max(width, height);
+ float minor = Math.min(width, height);
+ // if the difference between the width and height is less than 10%,
+ // keep the width and height the same.
+ if (major / minor < 1.1) {
+ width = height = Math.max(width, height);
+ }
+
+ float x = rect.exactCenterX() - width/2;
+ float y = rect.exactCenterY() - height/2;
+ mSelectorAnimation.cancel();
+ if (animate) {
+ mSelectorAnimation.reset();
+ mSelectorAnimation.setAnimationBounds(x, y, width, height);
+ mSelector.startAnimation(mSelectorAnimation);
+ } else {
+ mSelectorAnimation.setValues(x, y, width, height);
+ }
+ }
+
+ public Keyboard.Key getKey(int type, int index) {
+ return (type == KeyFocus.TYPE_MAIN) ? mMainKeyboardView.getKey(index) : null;
+ }
+
+ public int getCurrKeyCode() {
+ Key key = getKey(mCurrKeyInfo.type, mCurrKeyInfo.index);
+ if (key != null) {
+ return key.codes[0];
+ }
+ return 0;
+ }
+
+ public int getTouchState() {
+ return mTouchState;
+ }
+
+ /**
+ * Set the view state which affects how the touch indicator is drawn. This code currently
+ * assumes the state changes below for simplicity. If the state machine is updated this code
+ * should probably be checked to ensure it still works. NO_TOUCH -> on touch start -> SNAP SNAP
+ * -> on enough movement -> MOVE MOVE -> on hover long enough -> SNAP SNAP -> on a click down ->
+ * CLICK CLICK -> on click released -> SNAP ANY STATE -> on touch end -> NO_TOUCH
+ *
+ * @param state The new state to transition to
+ */
+ public void setTouchState(int state) {
+ switch (state) {
+ case TOUCH_STATE_NO_TOUCH:
+ if (mTouchState == TOUCH_STATE_TOUCH_MOVE || mTouchState == TOUCH_STATE_CLICK) {
+ // If the touch indicator was small make it big again
+ mSelectorAnimator.reverse();
+ }
+ break;
+ case TOUCH_STATE_TOUCH_SNAP:
+ if (mTouchState == TOUCH_STATE_CLICK) {
+ // And make the touch indicator big again
+ mSelectorAnimator.reverse();
+ } else if (mTouchState == TOUCH_STATE_TOUCH_MOVE) {
+ // Just make the touch indicator big
+ mSelectorAnimator.reverse();
+ }
+ break;
+ case TOUCH_STATE_TOUCH_MOVE:
+ if (mTouchState == TOUCH_STATE_NO_TOUCH || mTouchState == TOUCH_STATE_TOUCH_SNAP) {
+ // Shrink the touch indicator
+ mSelectorAnimator.start();
+ }
+ break;
+ case TOUCH_STATE_CLICK:
+ if (mTouchState == TOUCH_STATE_NO_TOUCH || mTouchState == TOUCH_STATE_TOUCH_SNAP) {
+ // Shrink the touch indicator
+ mSelectorAnimator.start();
+ }
+ break;
+ }
+ setTouchStateInternal(state);
+ setKbFocus(mCurrKeyInfo, true, true);
+ }
+
+ public KeyFocus getCurrFocus() {
+ return mCurrKeyInfo;
+ }
+
+ public void onVoiceClick() {
+ if (mVoiceButtonView != null) {
+ mVoiceButtonView.onClick();
+ }
+ }
+
+ public void onModeChangeClick() {
+ dismissMiniKeyboard();
+ if (mMainKeyboardView.getKeyboard().equals(mSymKeyboard)) {
+ mMainKeyboardView.setKeyboard(mAbcKeyboard);
+ } else {
+ mMainKeyboardView.setKeyboard(mSymKeyboard);
+ }
+ }
+
+ public void onShiftClick() {
+ setShiftState(mMainKeyboardView.isShifted() ? LeanbackKeyboardView.SHIFT_OFF
+ : LeanbackKeyboardView.SHIFT_ON);
+ }
+
+ public void onTextEntry() {
+ // reset shift if caps is not on
+ if (mMainKeyboardView.isShifted()) {
+ if (!isCapsLockOn() && !mCapCharacters) {
+ setShiftState(LeanbackKeyboardView.SHIFT_OFF);
+ }
+ } else {
+ if (isCapsLockOn() || mCapCharacters) {
+ setShiftState(LeanbackKeyboardView.SHIFT_LOCKED);
+ }
+ }
+
+ if (dismissMiniKeyboard()) {
+ moveFocusToIndex(mMiniKbKeyIndex, KeyFocus.TYPE_MAIN);
+ }
+ }
+
+ public void onSpaceEntry() {
+ if (mMainKeyboardView.isShifted()) {
+ if (!isCapsLockOn() && !mCapCharacters && !mCapWords) {
+ setShiftState(LeanbackKeyboardView.SHIFT_OFF);
+ }
+ } else {
+ if (isCapsLockOn() || mCapCharacters || mCapWords) {
+ setShiftState(LeanbackKeyboardView.SHIFT_ON);
+ }
+ }
+ }
+
+ public void onPeriodEntry() {
+ if (mMainKeyboardView.isShifted()) {
+ if (!isCapsLockOn() && !mCapCharacters && !mCapWords && !mCapSentences) {
+ setShiftState(LeanbackKeyboardView.SHIFT_OFF);
+ }
+ } else {
+ if (isCapsLockOn() || mCapCharacters || mCapWords || mCapSentences) {
+ setShiftState(LeanbackKeyboardView.SHIFT_ON);
+ }
+ }
+ }
+
+ public boolean dismissMiniKeyboard() {
+ return mMainKeyboardView.dismissMiniKeyboard();
+ }
+
+ public boolean isCurrKeyShifted() {
+ return mMainKeyboardView.isShifted();
+ }
+
+ public CharSequence getSuggestionText(int index) {
+ CharSequence text = null;
+
+ if(index >= 0 && index < mSuggestions.getChildCount()){
+ Button suggestion =
+ (Button) mSuggestions.getChildAt(index).findViewById(R.id.text);
+ if (suggestion != null) {
+ text = suggestion.getText();
+ }
+ }
+
+ return text;
+ }
+
+ /**
+ * This method sets the keyboard focus and update the layout of the new focus
+ *
+ * @param focus the new focus of the keyboard
+ */
+ public void setFocus(KeyFocus focus) {
+ setKbFocus(focus, false, true);
+ }
+
+ public boolean getNextFocusInDirection(int direction, KeyFocus startFocus, KeyFocus nextFocus) {
+ boolean validNextFocus = true;
+
+ switch (startFocus.type) {
+ case KeyFocus.TYPE_VOICE:
+ // TODO move between voice button and kb button
+ break;
+ case KeyFocus.TYPE_ACTION:
+ offsetRect(mRect, mMainKeyboardView);
+ if ((direction & DIRECTION_LEFT) != 0) {
+ // y is null, so we use the last y. This way a user can hold left and wrap
+ // around the keyboard while staying in the same row
+ validNextFocus = getBestFocus((float) mRect.right, null, nextFocus);
+ } else if ((direction & DIRECTION_UP) != 0) {
+ offsetRect(mRect, mSuggestions);
+ validNextFocus = getBestFocus(
+ (float) startFocus.rect.centerX(), (float) mRect.centerY(), nextFocus);
+ }
+ break;
+ case KeyFocus.TYPE_SUGGESTION:
+ if ((direction & DIRECTION_DOWN) != 0) {
+ offsetRect(mRect, mMainKeyboardView);
+ validNextFocus = getBestFocus(
+ (float) startFocus.rect.centerX(), (float) mRect.top, nextFocus);
+ } else if ((direction & DIRECTION_UP) != 0) {
+ if (mEscapeNorthEnabled) {
+ escapeNorth();
+ }
+ } else {
+ boolean left = (direction & DIRECTION_LEFT) != 0;
+ boolean right = (direction & DIRECTION_RIGHT) != 0;
+
+ if (left || right) {
+ // Cannot offset on the suggestion container because as it scrolls those
+ // values change
+ offsetRect(mRect, mRootView);
+ MarginLayoutParams lp =
+ (MarginLayoutParams) mSuggestionsContainer.getLayoutParams();
+ int leftSide = mRect.left + lp.leftMargin;
+ int rightSide = mRect.right - lp.rightMargin;
+ int index = startFocus.index + (left ? -1 : 1);
+
+ View suggestView = mSuggestions.getChildAt(index);
+ if (suggestView != null) {
+ offsetRect(mRect, suggestView);
+
+ if (mRect.left < leftSide && mRect.right > rightSide) {
+ mRect.left = leftSide;
+ mRect.right = rightSide;
+ } else if (mRect.left < leftSide) {
+ mRect.right = leftSide + mRect.width();
+ mRect.left = leftSide;
+ } else if (mRect.right > rightSide) {
+ mRect.left = rightSide - mRect.width();
+ mRect.right = rightSide;
+ }
+
+ suggestView.requestFocus();
+ LeanbackUtils.sendAccessibilityEvent(
+ suggestView.findViewById(R.id.text), true);
+ configureFocus(nextFocus, mRect, index, KeyFocus.TYPE_SUGGESTION);
+ }
+ }
+ }
+ break;
+ case KeyFocus.TYPE_MAIN:
+ Key key = getKey(startFocus.type, startFocus.index);
+ // Step within the view. Using height because all keys are the same height
+ // and widths vary. Half the height is to ensure the next key is reached
+ float extraSlide = startFocus.rect.height()/2.0f;
+ float x = startFocus.rect.centerX();
+ float y = startFocus.rect.centerY();
+ if (startFocus.code == LeanbackKeyboardView.ASCII_SPACE) {
+ // if we're moving off of space, use the old x position for memory
+ x = mX;
+ }
+ if ((direction & DIRECTION_LEFT) != 0) {
+ if ((key.edgeFlags & Keyboard.EDGE_LEFT) == 0) {
+ // not on the left edge of the kb
+ x = startFocus.rect.left - extraSlide;
+ }
+ } else if ((direction & DIRECTION_RIGHT) != 0) {
+ if ((key.edgeFlags & Keyboard.EDGE_RIGHT) != 0) {
+ // jump to the action button
+ offsetRect(mRect, mActionButtonView);
+ x = mRect.centerX();
+ } else {
+ x = startFocus.rect.right + extraSlide;
+ }
+ }
+ // Don't need any special handling for up/down due to
+ // layout positioning. If the layout changes this should be
+ // reconsidered.
+ if ((direction & DIRECTION_UP) != 0) {
+ y -= startFocus.rect.height() * DIRECTION_STEP_MULTIPLIER;
+ } else if ((direction & DIRECTION_DOWN) != 0) {
+ y += startFocus.rect.height() * DIRECTION_STEP_MULTIPLIER;
+ }
+ getPhysicalPosition(x, y, mTempPoint);
+ validNextFocus = getBestFocus(x, y, nextFocus);
+ break;
+ }
+
+ return validNextFocus;
+ }
+
+ private PointF getTouchSnapPosition() {
+ PointF snapPos = new PointF();
+ getPhysicalPosition(mCurrKeyInfo.rect.centerX(), mCurrKeyInfo.rect.centerY(), snapPos);
+ return snapPos;
+ }
+
+ public void clearSuggestions() {
+ mSuggestions.removeAllViews();
+
+ if (getCurrFocus().type == KeyFocus.TYPE_SUGGESTION) {
+ resetFocusCursor();
+ }
+ }
+
+ public void updateSuggestions(ArrayList<String> suggestions) {
+ final int oldCount = mSuggestions.getChildCount();
+ final int newCount = suggestions.size();
+
+ if (newCount < oldCount) {
+ // remove excess views
+ mSuggestions.removeViews(newCount, oldCount-newCount);
+ } else if (newCount > oldCount) {
+ // add more
+ for (int i = oldCount; i < newCount; i++) {
+ View suggestion = mContext.getLayoutInflater()
+ .inflate(R.layout.candidate, null);
+ mSuggestions.addView(suggestion);
+ }
+ }
+
+ for (int i = 0; i < newCount; i++) {
+ Button suggestion =
+ (Button) mSuggestions.getChildAt(i).findViewById(R.id.text);
+ suggestion.setText(suggestions.get(i));
+ suggestion.setContentDescription(suggestions.get(i));
+ }
+
+ if (getCurrFocus().type == KeyFocus.TYPE_SUGGESTION) {
+ resetFocusCursor();
+ }
+ }
+
+ /**
+ * Moves the selector back to the entry point key (T in general)
+ */
+ public void resetFocusCursor() {
+ // T is the best starting letter, it's in the 5th column and 2nd row,
+ // this approximates that location
+ double x = 0.45;
+ double y = 0.375;
+ offsetRect(mRect, mMainKeyboardView);
+ mX = (float)(mRect.left + x*mRect.width());
+ mY = (float)(mRect.top + y*mRect.height());
+ getBestFocus(mX, mY, mTempKeyInfo);
+ setKbFocus(mTempKeyInfo, true, false);
+
+ setTouchStateInternal(TOUCH_STATE_NO_TOUCH);
+ mSelectorAnimator.reverse();
+ mSelectorAnimator.end();
+ }
+
+ private void setTouchStateInternal(int state) {
+ mTouchState = state;
+ }
+
+ private void setShiftState(int state) {
+ mMainKeyboardView.setShiftState(state);
+ }
+
+ private void startRecognition(Context context) {
+ mRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
+ mRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
+ RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
+ mRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
+ mSpeechRecognizer.setRecognitionListener(new RecognitionListener() {
+ float peakRmsLevel = 0;
+ int rmsCounter = 0;
+
+ @Override
+ public void onBeginningOfSpeech() {
+ mVoiceButtonView.showRecording();
+ }
+
+ @Override
+ public void onEndOfSpeech() {
+ mVoiceButtonView.showRecognizing();
+ mVoiceOn = false;
+ }
+
+ @Override
+ public void onError(int error) {
+ cancelVoiceRecording();
+ switch (error) {
+ case SpeechRecognizer.ERROR_NO_MATCH:
+ Log.d(TAG, "recognizer error no match");
+ break;
+ case SpeechRecognizer.ERROR_SERVER:
+ Log.d(TAG, "recognizer error server error");
+ break;
+ case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
+ Log.d(TAG, "recognizer error speech timeout");
+ break;
+ case SpeechRecognizer.ERROR_CLIENT:
+ Log.d(TAG, "recognizer error client error");
+ break;
+ default:
+ Log.d(TAG, "recognizer other error " + error);
+ break;
+ }
+ }
+
+ @Override
+ public synchronized void onPartialResults(Bundle partialResults) {
+ }
+
+ @Override
+ public void onReadyForSpeech(Bundle params) {
+ mVoiceButtonView.showListening();
+ }
+
+ @Override
+ public void onEvent(int eventType, Bundle params) {
+ }
+
+ @Override
+ public void onBufferReceived(byte[] buffer) {
+ }
+
+ @Override
+ public synchronized void onRmsChanged(float rmsdB) {
+
+ mVoiceOn = true;
+ mSpeechLevelSource.setSpeechLevel((rmsdB < 0) ? 0 : (int) (10 * rmsdB));
+ peakRmsLevel = Math.max(rmsdB, peakRmsLevel);
+ rmsCounter++;
+
+ if (rmsCounter > 100 && peakRmsLevel == 0) {
+ mVoiceButtonView.showNotListening();
+ }
+ }
+
+ @Override
+ public void onResults(Bundle results) {
+ final ArrayList<String> matches =
+ results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
+ if (matches != null) {
+ if (mVoiceListener != null) {
+ mVoiceListener.onVoiceResult(matches.get(0));
+ }
+ }
+
+ cancelVoiceRecording();
+ }
+ });
+ mSpeechRecognizer.startListening(mRecognizerIntent);
+ }
+
+ public boolean isMiniKeyboardOnScreen() {
+ return mMainKeyboardView.isMiniKeyboardOnScreen();
+ }
+
+ public boolean onKeyLongPress() {
+ if (mCurrKeyInfo.code == Keyboard.KEYCODE_SHIFT) {
+ onToggleCapsLock();
+ setTouchState(TOUCH_STATE_NO_TOUCH);
+ return true;
+ } else if (mCurrKeyInfo.type == KeyFocus.TYPE_MAIN) {
+ mMainKeyboardView.onKeyLongPress();
+ if (mMainKeyboardView.isMiniKeyboardOnScreen()) {
+ mMiniKbKeyIndex = mCurrKeyInfo.index;
+ moveFocusToIndex(mMainKeyboardView.getBaseMiniKbIndex(), KeyFocus.TYPE_MAIN);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private void moveFocusToIndex(int index, int type) {
+ Key key = mMainKeyboardView.getKey(index);
+ configureFocus(mTempKeyInfo, mRect, index, key, type);
+ setTouchState(TOUCH_STATE_NO_TOUCH);
+ setKbFocus(mTempKeyInfo, true, true);
+ }
+
+ private void onToggleCapsLock() {
+ onShiftDoubleClick(isCapsLockOn());
+ }
+
+ public void onShiftDoubleClick(boolean wasCapsLockOn) {
+ setShiftState(
+ wasCapsLockOn ? LeanbackKeyboardView.SHIFT_OFF : LeanbackKeyboardView.SHIFT_LOCKED);
+ }
+
+ public boolean isCapsLockOn() {
+ return mMainKeyboardView.getShiftState() == LeanbackKeyboardView.SHIFT_LOCKED;
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/LeanbackKeyboardController.java b/src/com/android/inputmethod/leanback/LeanbackKeyboardController.java
new file mode 100644
index 0000000..93fc80d
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/LeanbackKeyboardController.java
@@ -0,0 +1,600 @@
+/*
+ * Copyright (C) 2019 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.leanback;
+
+import android.graphics.PointF;
+import android.inputmethodservice.InputMethodService;
+import android.inputmethodservice.Keyboard;
+import android.inputmethodservice.Keyboard.Key;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+
+import com.android.inputmethod.leanback.LeanbackKeyboardContainer.KeyFocus;
+
+import java.util.ArrayList;
+/**
+ * Holds logic for the keyboard views. This includes things like when to
+ * snap, when to switch keyboards, etc. It provides callbacks for when actions
+ * that need to be handled at the IME level occur (when text is entered, when
+ * the action should be performed).
+ */
+public class LeanbackKeyboardController implements LeanbackKeyboardContainer.VoiceListener,
+ LeanbackKeyboardContainer.DismissListener {
+ private static final String TAG = "LbKbController";
+ private static final boolean DEBUG = false;
+
+ /**
+ * The amount of time to block movement after a button down was detected.
+ */
+ public static final int CLICK_MOVEMENT_BLOCK_DURATION_MS = 500;
+
+ /**
+ * The minimum distance in pixels before the view will transition to the
+ * move state.
+ */
+ public float mResizeSquareDistance;
+
+ // keep track of the most recent key changes and their times so we can
+ // revert motion caused by clicking
+ private static final int KEY_CHANGE_HISTORY_SIZE = 10;
+ private static final long KEY_CHANGE_REVERT_TIME_MS = 100;
+
+ /**
+ * This listener reports high level actions that have occurred, such as
+ * text entry (from keys or voice) or the action button being pressed.
+ */
+ public interface InputListener {
+ public static final int ENTRY_TYPE_STRING = 0;
+ public static final int ENTRY_TYPE_BACKSPACE = 1;
+ public static final int ENTRY_TYPE_SUGGESTION = 2;
+ public static final int ENTRY_TYPE_LEFT = 3;
+ public static final int ENTRY_TYPE_RIGHT = 4;
+ public static final int ENTRY_TYPE_ACTION = 5;
+ public static final int ENTRY_TYPE_VOICE = 6;
+ public static final int ENTRY_TYPE_DISMISS = 7;
+ public static final int ENTRY_TYPE_VOICE_DISMISS = 8;
+
+ /**
+ * Sent when the user has selected something that should affect the text
+ * field, such as entering a character, selecting the action, or
+ * finishing a voice action.
+ *
+ * @param type The type of key selected
+ * @param keyCode the key code of the key if applicable
+ * @param result The text entered if applicable
+ */
+ public void onEntry(int type, int keyCode, CharSequence result);
+ }
+
+ private static final class KeyChange {
+ public long time;
+ public PointF position;
+
+ public KeyChange(long time, PointF position) {
+ this.time = time;
+ this.position = position;
+ }
+ }
+
+ private class DoubleClickDetector {
+ final long DOUBLE_CLICK_TIMEOUT_MS = 200;
+ long mFirstClickTime = 0;
+ boolean mFirstClickShiftLocked;
+
+ public void reset() {
+ mFirstClickTime = 0;
+ }
+
+ public void addEvent(long currTime) {
+ if (currTime - mFirstClickTime > DOUBLE_CLICK_TIMEOUT_MS) {
+ mFirstClickTime = currTime;
+ mFirstClickShiftLocked = mContainer.isCapsLockOn();
+ commitKey();
+ } else {
+ mContainer.onShiftDoubleClick(mFirstClickShiftLocked);
+ reset();
+ }
+ }
+ }
+
+ private DoubleClickDetector mDoubleClickDetector = new DoubleClickDetector();
+
+ private View.OnLayoutChangeListener mOnLayoutChangeListener
+ = new View.OnLayoutChangeListener() {
+
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ int w = right - left;
+ int h = bottom - top;
+ int oldW = oldRight - oldLeft;
+ int oldH = oldBottom - oldTop;
+ if (w > 0 && h > 0) {
+ if (w != oldW || h != oldH) {
+ initInputView();
+ }
+ }
+ }
+ };
+
+ private InputMethodService mContext;
+ private InputListener mInputListener;
+ private LeanbackKeyboardContainer mContainer;
+
+ private LeanbackKeyboardContainer.KeyFocus mDownFocus =
+ new LeanbackKeyboardContainer.KeyFocus();
+ private LeanbackKeyboardContainer.KeyFocus mTempFocus =
+ new LeanbackKeyboardContainer.KeyFocus();
+
+ ArrayList<KeyChange> mKeyChangeHistory = new ArrayList<KeyChange>(KEY_CHANGE_HISTORY_SIZE + 1);
+ private PointF mTempPoint = new PointF();
+
+ private boolean mKeyDownReceived = false;
+ private boolean mLongPressHandled = false;
+ private KeyFocus mKeyDownKeyFocus;
+ private int mMoveCount;
+
+ public LeanbackKeyboardController(InputMethodService context, InputListener listener) {
+ this(context, listener, new LeanbackKeyboardContainer(context));
+ }
+
+ LeanbackKeyboardController(InputMethodService context, InputListener listener,
+ LeanbackKeyboardContainer container) {
+ mContext = context;
+ mResizeSquareDistance = context.getResources().getDimension(R.dimen.resize_move_distance);
+ mResizeSquareDistance *= mResizeSquareDistance;
+ mInputListener = listener;
+ setKeyboardContainer(container);
+ mContainer.setVoiceListener(this);
+ mContainer.setDismissListener(this);
+ }
+
+ /**
+ * This method is called when we start the input at a NEW input field.
+ */
+ public void onStartInput(EditorInfo attribute) {
+ if (mContainer != null) {
+ mContainer.onStartInput(attribute);
+ initInputView();
+ }
+ }
+
+ /**
+ * This method is called by whenever we bring up the IME at an input field.
+ */
+ public void onStartInputView() {
+ mKeyDownReceived = false;
+ if (mContainer != null) {
+ mContainer.onStartInputView();
+ }
+ mDoubleClickDetector.reset();
+ }
+
+ /**
+ * This method sets the pixel positions in mSpaceTracker to match the
+ * current KeyFocus in {@link LeanbackKeyboardContainer} This method is called
+ * when the keyboard layout is complete, after
+ * {@link LeanbackKeyboardContainer.onInitInputView}, to initialize the starting
+ * position of mSpaceTracker; and in onUp to reset the pixel position in
+ * mSpaceTracker.
+ */
+ private void updatePositionToCurrentFocus() {
+ PointF currPosition = getCurrentKeyPosition();
+ if (currPosition != null) {
+ }
+ }
+
+ private void initInputView() {
+ mContainer.onInitInputView();
+ updatePositionToCurrentFocus();
+ }
+
+ private PointF getCurrentKeyPosition() {
+ if (mContainer != null) {
+ LeanbackKeyboardContainer.KeyFocus initialKeyInfo = mContainer.getCurrFocus();
+ return new PointF(initialKeyInfo.rect.centerX(), initialKeyInfo.rect.centerY());
+ }
+ return null;
+ }
+
+ private void performBestSnap(long time) {
+ KeyFocus focus = mContainer.getCurrFocus();
+ mTempPoint.x = focus.rect.centerX();
+ mTempPoint.y = focus.rect.centerY();
+ PointF bestSnap = getBestSnapPosition(mTempPoint, time);
+ mContainer.getBestFocus(bestSnap.x, bestSnap.y, mTempFocus);
+ mContainer.setFocus(mTempFocus);
+ updatePositionToCurrentFocus();
+ }
+
+ private PointF getBestSnapPosition(PointF currPoint, long currTime) {
+ if (mKeyChangeHistory.size() <= 1) {
+ return currPoint;
+ }
+ for (int i = 0; i < mKeyChangeHistory.size() - 1; i++) {
+ KeyChange change = mKeyChangeHistory.get(i);
+ KeyChange nextChange = mKeyChangeHistory.get(i + 1);
+ if (currTime - nextChange.time < KEY_CHANGE_REVERT_TIME_MS) {
+ if (DEBUG) {
+ Log.d(TAG, "Reverting keychange to " + change.position.toString());
+ }
+ // Return the oldest key change within the revert window and
+ // clear all key changes
+ currPoint = change.position;
+ // on a revert, clear the history and add the reverting point.
+ // This way the reverted point will be preferred if there's
+ // another fast change before the next call.
+ mKeyChangeHistory.clear();
+ mKeyChangeHistory.add(new KeyChange(currTime, currPoint));
+ break;
+ }
+ }
+ return currPoint;
+ }
+
+ public void setKeyboardContainer(LeanbackKeyboardContainer container) {
+ mContainer = container;
+ container.getView().addOnLayoutChangeListener(mOnLayoutChangeListener);
+ }
+
+ public View getView() {
+ if (mContainer != null) {
+ return mContainer.getView();
+ }
+ return null;
+ }
+
+ public boolean areSuggestionsEnabled() {
+ if (mContainer != null) {
+ return mContainer.areSuggestionsEnabled();
+ }
+ return false;
+ }
+
+ public boolean enableAutoEnterSpace() {
+ if (mContainer != null) {
+ return mContainer.enableAutoEnterSpace();
+ }
+ return false;
+ }
+
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ mDownFocus.set(mContainer.getCurrFocus());
+ // this will handle other events, e.g. hardware keyboard
+ if (isEnterKey(keyCode)) {
+ mKeyDownReceived = true;
+ // first keyDown
+ if (event.getRepeatCount() == 0) {
+ mContainer.setTouchState(LeanbackKeyboardContainer.TOUCH_STATE_CLICK);
+ }
+ }
+
+ return handleKeyDownEvent(keyCode, event.getRepeatCount());
+ }
+
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ // this only handles InputDevice.SOURCE_TOUCH_NAVIGATION events
+ if (isEnterKey(keyCode)) {
+ if (!mKeyDownReceived || mLongPressHandled) {
+ mLongPressHandled = false;
+ return true;
+ }
+ mKeyDownReceived = false;
+ if (mContainer.getTouchState() == LeanbackKeyboardContainer.TOUCH_STATE_CLICK) {
+ mContainer.setTouchState(LeanbackKeyboardContainer.TOUCH_STATE_TOUCH_SNAP);
+ }
+ }
+ return handleKeyUpEvent(keyCode, event.getEventTime());
+ }
+
+ public boolean onGenericMotionEvent(MotionEvent event) {
+ return false;
+ }
+
+ private boolean onDirectionalMove(int dir) {
+ if (mContainer.getNextFocusInDirection(dir, mDownFocus, mTempFocus)) {
+ mContainer.setFocus(mTempFocus);
+ mDownFocus.set(mTempFocus);
+
+ clearKeyIfNecessary();
+ }
+
+ return true;
+ }
+
+ private void clearKeyIfNecessary() {
+ mMoveCount++;
+ if (mMoveCount >= 3) {
+ mMoveCount = 0;
+ mKeyDownKeyFocus = null;
+ }
+ }
+
+ private void commitKey() {
+ commitKey(mContainer.getCurrFocus());
+ }
+
+ private void commitKey(LeanbackKeyboardContainer.KeyFocus keyFocus) {
+ if (mContainer == null || keyFocus == null) {
+ return;
+ }
+
+ switch (keyFocus.type) {
+ case KeyFocus.TYPE_VOICE:
+ // voice doesn't have to go through the IME
+ mContainer.onVoiceClick();
+ break;
+ case KeyFocus.TYPE_ACTION:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_ACTION, 0, null);
+ break;
+ case KeyFocus.TYPE_SUGGESTION:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_SUGGESTION, 0,
+ mContainer.getSuggestionText(keyFocus.index));
+ break;
+ default:
+ Key key = mContainer.getKey(keyFocus.type, keyFocus.index);
+ if (key != null) {
+ int code = key.codes[0];
+ CharSequence label = key.label;
+ handleCommitKeyboardKey(code, label);
+ }
+ break;
+
+ }
+ }
+
+ private void handleCommitKeyboardKey(int code, CharSequence label) {
+ switch (code) {
+ case Keyboard.KEYCODE_MODE_CHANGE:
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "mode change");
+ }
+ mContainer.onModeChangeClick();
+ break;
+ case LeanbackKeyboardView.KEYCODE_CAPS_LOCK:
+ mContainer.onShiftDoubleClick(mContainer.isCapsLockOn());
+ break;
+ case Keyboard.KEYCODE_SHIFT:
+ // TODO invalidate and draw a different shift
+ // key in the function keyboard
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "shift");
+ }
+ mContainer.onShiftClick();
+ break;
+ case LeanbackKeyboardView.KEYCODE_DISMISS_MINI_KEYBOARD:
+ mContainer.dismissMiniKeyboard();
+ break;
+ case LeanbackKeyboardView.KEYCODE_LEFT:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_LEFT, 0, null);
+ break;
+ case LeanbackKeyboardView.KEYCODE_RIGHT:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_RIGHT, 0, null);
+ break;
+ case Keyboard.KEYCODE_DELETE:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_BACKSPACE, 0, null);
+ break;
+ case LeanbackKeyboardView.ASCII_SPACE:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_STRING, code, " ");
+ mContainer.onSpaceEntry();
+ break;
+ case LeanbackKeyboardView.ASCII_PERIOD:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_STRING, code, label);
+ mContainer.onPeriodEntry();
+ break;
+ case LeanbackKeyboardView.KEYCODE_VOICE:
+ mContainer.startVoiceRecording();
+ break;
+ // fall through to default with this label
+ default:
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_STRING, code, label);
+ mContainer.onTextEntry();
+
+ if (mContainer.isMiniKeyboardOnScreen()) {
+ mContainer.dismissMiniKeyboard();
+ }
+ break;
+ }
+ }
+
+ private boolean handleKeyDownEvent(int keyCode, int eventRepeatCount) {
+ keyCode = getSimplifiedKey(keyCode);
+
+ // never trap back
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ mContainer.cancelVoiceRecording();
+ return false;
+ }
+
+ // capture all key downs when voice is visible
+ if (mContainer.isVoiceVisible()) {
+ if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT || keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
+ mContainer.cancelVoiceRecording();
+ }
+ return true;
+ }
+
+ boolean handled = true;
+ switch(keyCode) {
+ // Direction keys are handled on down to allow repeated movement
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ handled = onDirectionalMove(LeanbackKeyboardContainer.DIRECTION_LEFT);
+ break;
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ handled = onDirectionalMove(LeanbackKeyboardContainer.DIRECTION_RIGHT);
+ break;
+ case KeyEvent.KEYCODE_DPAD_UP:
+ handled = onDirectionalMove(LeanbackKeyboardContainer.DIRECTION_UP);
+ break;
+ case KeyEvent.KEYCODE_DPAD_DOWN:
+ handled = onDirectionalMove(LeanbackKeyboardContainer.DIRECTION_DOWN);
+ break;
+ case KeyEvent.KEYCODE_BUTTON_X:
+ handleCommitKeyboardKey(Keyboard.KEYCODE_DELETE, null);
+ break;
+ case KeyEvent.KEYCODE_BUTTON_Y:
+ handleCommitKeyboardKey(LeanbackKeyboardView.ASCII_SPACE, null);
+ break;
+ case KeyEvent.KEYCODE_BUTTON_L1:
+ handleCommitKeyboardKey(LeanbackKeyboardView.KEYCODE_LEFT, null);
+ break;
+ case KeyEvent.KEYCODE_BUTTON_R1:
+ handleCommitKeyboardKey(LeanbackKeyboardView.KEYCODE_RIGHT, null);
+ break;
+ // these are handled on up
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ if (eventRepeatCount == 0) {
+ mMoveCount = 0;
+ mKeyDownKeyFocus = new KeyFocus();
+ mKeyDownKeyFocus.set(mContainer.getCurrFocus());
+ } else if (eventRepeatCount == 1) {
+ if (handleKeyLongPress(keyCode)) {
+ mKeyDownKeyFocus = null;
+ }
+ }
+
+ if (isKeyHandledOnKeyDown(mContainer.getCurrKeyCode())) {
+ commitKey();
+ }
+ break;
+ // also handled on up
+ case KeyEvent.KEYCODE_BUTTON_THUMBL:
+ case KeyEvent.KEYCODE_BUTTON_THUMBR:
+ case KeyEvent.KEYCODE_ENTER:
+ break;
+ default:
+ handled = false;
+ break;
+ }
+ return handled;
+ }
+
+ private boolean handleKeyLongPress(int keyCode) {
+ mLongPressHandled = isEnterKey(keyCode) && mContainer.onKeyLongPress();
+ if (mContainer.isMiniKeyboardOnScreen()) {
+ Log.d(TAG, "mini keyboard shown after long press");
+ }
+ return mLongPressHandled;
+ }
+
+ private boolean isKeyHandledOnKeyDown(int currKeyCode) {
+ return currKeyCode == Keyboard.KEYCODE_DELETE
+ || currKeyCode == LeanbackKeyboardView.KEYCODE_LEFT
+ || currKeyCode == LeanbackKeyboardView.KEYCODE_RIGHT;
+ }
+
+ /**
+ * This handles all key events from an input device
+ * @param keyCode
+ * @return true if the key was handled, false otherwise
+ */
+ private boolean handleKeyUpEvent(int keyCode, long currTime) {
+ keyCode = getSimplifiedKey(keyCode);
+
+ // never trap back
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ return false;
+ }
+
+ // capture all key ups when voice is visible
+ if (mContainer.isVoiceVisible()) {
+ return true;
+ }
+
+ boolean handled = true;
+ switch(keyCode) {
+ // Some keys are handled on down to allow repeats
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ case KeyEvent.KEYCODE_DPAD_UP:
+ case KeyEvent.KEYCODE_DPAD_DOWN:
+ clearKeyIfNecessary();
+ break;
+ case KeyEvent.KEYCODE_BUTTON_X:
+ case KeyEvent.KEYCODE_BUTTON_Y:
+ case KeyEvent.KEYCODE_BUTTON_L1:
+ case KeyEvent.KEYCODE_BUTTON_R1:
+ break;
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ if (mContainer.getCurrKeyCode() == Keyboard.KEYCODE_SHIFT) {
+ mDoubleClickDetector.addEvent(currTime);
+ } else if (!isKeyHandledOnKeyDown(mContainer.getCurrKeyCode())) {
+ commitKey(mKeyDownKeyFocus);
+ }
+ break;
+ case KeyEvent.KEYCODE_BUTTON_THUMBL:
+ handleCommitKeyboardKey(Keyboard.KEYCODE_MODE_CHANGE, null);
+ break;
+ case KeyEvent.KEYCODE_BUTTON_THUMBR:
+ handleCommitKeyboardKey(LeanbackKeyboardView.KEYCODE_CAPS_LOCK, null);
+ break;
+ case KeyEvent.KEYCODE_ENTER:
+ if (mContainer != null) {
+ KeyFocus keyFocus = mContainer.getCurrFocus();
+ if (keyFocus != null && keyFocus.type == KeyFocus.TYPE_SUGGESTION) {
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_SUGGESTION, 0,
+ mContainer.getSuggestionText(keyFocus.index));
+ }
+ }
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_DISMISS, 0, null);
+ break;
+ default:
+ handled = false;
+ break;
+ }
+ return handled;
+ }
+
+ public void updateSuggestions(ArrayList<String> suggestions) {
+ if (mContainer != null) {
+ mContainer.updateSuggestions(suggestions);
+ }
+ }
+
+ @Override
+ public void onVoiceResult(String result) {
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_VOICE, 0, result);
+ }
+
+ @Override
+ public void onDismiss(boolean fromVoice) {
+ if (fromVoice) {
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_VOICE_DISMISS, 0, null);
+ } else {
+ mInputListener.onEntry(InputListener.ENTRY_TYPE_DISMISS, 0, null);
+ }
+ }
+
+ private boolean isEnterKey(int keyCode) {
+ return getSimplifiedKey(keyCode) == KeyEvent.KEYCODE_DPAD_CENTER;
+ }
+
+ private int getSimplifiedKey(int keyCode) {
+ // simplify for dpad center
+ keyCode = (keyCode == KeyEvent.KEYCODE_DPAD_CENTER ||
+ keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER ||
+ keyCode == KeyEvent.KEYCODE_BUTTON_A) ? KeyEvent.KEYCODE_DPAD_CENTER : keyCode;
+
+ // simply for back
+ keyCode = (keyCode == KeyEvent.KEYCODE_BUTTON_B ? KeyEvent.KEYCODE_BACK : keyCode);
+
+ return keyCode;
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/LeanbackKeyboardView.java b/src/com/android/inputmethod/leanback/LeanbackKeyboardView.java
new file mode 100644
index 0000000..45d52e8
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/LeanbackKeyboardView.java
@@ -0,0 +1,570 @@
+/*
+ * Copyright (C) 2019 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.leanback;
+
+import android.content.Context;
+
+import java.util.ArrayList;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.inputmethodservice.Keyboard;
+import android.inputmethodservice.Keyboard.Key;
+import android.inputmethodservice.Keyboard.Row;
+import android.media.AudioManager;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class LeanbackKeyboardView extends FrameLayout {
+
+ private static final String TAG = "LbKbView";
+ private static final boolean DEBUG = false;
+
+ private static final int NOT_A_KEY = -1;
+
+ public static final int SHIFT_OFF = 0;
+ public static final int SHIFT_ON = 1;
+ public static final int SHIFT_LOCKED = 2;
+ private int mShiftState;
+
+ private final float mFocusedScale;
+ private final float mClickedScale;
+ private final int mClickAnimDur;
+ private final int mUnfocusStartDelay;
+ private final int mInactiveMiniKbAlpha;
+
+ private Keyboard mKeyboard;
+ private KeyHolder[] mKeys;
+ private ImageView[] mKeyImageViews;
+
+ private int mFocusIndex;
+ private boolean mFocusClicked;
+ private View mCurrentFocusView;
+ private boolean mMiniKeyboardOnScreen;
+
+ /**
+ * Special keycodes
+ */
+ public static final int ASCII_SPACE = 32;
+ public static final int ASCII_PERIOD = 46;
+ public static final int KEYCODE_SHIFT = -1;
+ public static final int KEYCODE_SYM_TOGGLE = -2;
+ public static final int KEYCODE_LEFT = -3;
+ public static final int KEYCODE_RIGHT = -4;
+ public static final int KEYCODE_DELETE = -5;
+ public static final int KEYCODE_CAPS_LOCK = -6;
+ public static final int KEYCODE_VOICE = -7;
+ public static final int KEYCODE_DISMISS_MINI_KEYBOARD = -8;
+
+ private int mBaseMiniKbIndex = -1;
+
+ private Paint mPaint;
+ private Rect mPadding;
+ private int mModeChangeTextSize;
+ private int mKeyTextSize;
+ private int mKeyTextColor;
+ private int mRowCount;
+ private int mColCount;
+
+ private class KeyHolder {
+ public boolean isInMiniKb = false;
+ public boolean isInvertible = false;
+ public Key key;
+
+ public KeyHolder(Key key) {
+ this.key = key;
+ }
+ }
+
+ public LeanbackKeyboardView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ final Resources res = context.getResources();
+ TypedArray a = context.getTheme()
+ .obtainStyledAttributes(attrs, R.styleable.LeanbackKeyboardView, 0, 0);
+ mRowCount = a.getInteger(R.styleable.LeanbackKeyboardView_rowCount, -1);
+ mColCount = a.getInteger(R.styleable.LeanbackKeyboardView_columnCount, -1);
+
+ mKeyTextSize = (int) res.getDimension(R.dimen.key_font_size);
+
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
+ mPaint.setTextSize(mKeyTextSize);
+ mPaint.setTextAlign(Align.CENTER);
+ mPaint.setAlpha(255);
+
+ mPadding = new Rect(0, 0, 0, 0);
+
+ mModeChangeTextSize = (int) res.getDimension(R.dimen.function_key_mode_change_font_size);
+
+ mKeyTextColor = res.getColor(R.color.key_text_default);
+
+ mFocusIndex = -1;
+
+ mShiftState = SHIFT_OFF;
+
+ mFocusedScale = res.getFraction(R.fraction.focused_scale, 1, 1);
+ mClickedScale = res.getFraction(R.fraction.clicked_scale, 1, 1);
+ mClickAnimDur = res.getInteger(R.integer.clicked_anim_duration);
+ mUnfocusStartDelay = res.getInteger(R.integer.unfocused_anim_delay);
+
+ mInactiveMiniKbAlpha = res.getInteger(R.integer.inactive_mini_kb_alpha);
+ }
+
+ /**
+ * Get the total rows of the keyboard
+ */
+ public int getRowCount() {
+ return mRowCount;
+ }
+
+ /**
+ * Get the total columns of the keyboard
+ */
+ public int getColCount() {
+ return mColCount;
+ }
+
+ /**
+ * Get the key at the specified index
+ *
+ * @param index
+ * @return null if the keyboardView has not been assigned a keyboard
+ */
+ public Key getKey(int index) {
+ if (mKeys == null || mKeys.length == 0 || index < 0 || index > mKeys.length) {
+ return null;
+ }
+ return mKeys[index].key;
+ }
+
+ /**
+ * Get the current focused key
+ */
+ public Key getFocusedKey() {
+ return mFocusIndex == -1 ? null : mKeys[mFocusIndex].key;
+ }
+
+ /**
+ * Get the keyboard that's attached to the keyboardView
+ */
+ public Keyboard getKeyboard() {
+ return mKeyboard;
+ }
+
+ /**
+ * Get the key that's the nearest to the given position
+ *
+ * @param x position in pixels
+ * @param y position in pixels
+ */
+ public int getNearestIndex(float x, float y) {
+ if (mKeys == null || mKeys.length == 0) {
+ return 0;
+ }
+ x -= getPaddingLeft();
+ y -= getPaddingTop();
+ float height = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
+ float width = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
+ int rows = getRowCount();
+ int cols = getColCount();
+ int row = (int) (y / height * rows);
+ if (row < 0) {
+ row = 0;
+ } else if (row >= rows) {
+ row = rows - 1;
+ }
+ int col = (int) (x / width * cols);
+ if (col < 0) {
+ col = 0;
+ } else if (col >= cols) {
+ col = cols - 1;
+ }
+ int index = mColCount * row + col;
+
+ // at space key (space key is 7 keys wide)
+ if (index > 46 && index < 53) {
+ index = 46;
+ }
+
+ // beyond space, remove 6 extra slots for space
+ if (index >= 53) {
+ index -= 6;
+ }
+
+ if (index < 0) {
+ index = 0;
+ } else if (index >= mKeys.length) {
+ index = mKeys.length - 1;
+ }
+
+ return index;
+ }
+
+ /**
+ * Attaches a keyboard to this view. The keyboard can be switched at any
+ * time and the view will re-layout itself to accommodate the keyboard.
+ *
+ * @see Keyboard
+ * @see #getKeyboard()
+ * @param keyboard the keyboard to display in this view
+ */
+ public void setKeyboard(Keyboard keyboard) {
+ // Remove any pending messages
+ removeMessages();
+ mKeyboard = keyboard;
+ setKeys(mKeyboard.getKeys());
+
+ // reset shift state
+ int shiftState = mShiftState;
+ mShiftState = -1;
+ setShiftState(shiftState);
+
+ requestLayout();
+ invalidateAllKeys();
+ // computeProximityThreshold(keyboard); // TODO
+ }
+
+ private ImageView createKeyImageView(int keyIndex) {
+
+ final Rect padding = mPadding;
+ final int kbdPaddingLeft = getPaddingLeft();
+ final int kbdPaddingTop = getPaddingTop();
+ final KeyHolder keyHolder = mKeys[keyIndex];
+ final Key key = keyHolder.key;
+
+ // Switch the character to uppercase if shift is pressed
+ adjustCase(keyHolder);
+ String label = key.label == null ? null : key.label.toString();
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "LABEL: " + key.label + "->" + label);
+ }
+
+ Bitmap bitmap = Bitmap.createBitmap(key.width, key.height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ final Paint paint = mPaint;
+ paint.setColor(mKeyTextColor);
+
+ canvas.drawARGB(0, 0, 0, 0);
+
+ if (key.icon != null) {
+ if (key.codes[0] == Keyboard.KEYCODE_SHIFT) {
+ switch (mShiftState) {
+ case SHIFT_OFF:
+ key.icon = getContext().getResources().getDrawable(R.drawable.ic_ime_shift_off);
+ break;
+ case SHIFT_ON:
+ key.icon = getContext().getResources().getDrawable(R.drawable.ic_ime_shift_on);
+ break;
+ case SHIFT_LOCKED:
+ key.icon = getContext().getResources()
+ .getDrawable(R.drawable.ic_ime_shift_lock_on);
+ break;
+ }
+ }
+ final int drawableX = (key.width - padding.left - padding.right
+ - key.icon.getIntrinsicWidth()) / 2 + padding.left;
+ final int drawableY = (key.height - padding.top - padding.bottom
+ - key.icon.getIntrinsicHeight()) / 2 + padding.top;
+ canvas.translate(drawableX, drawableY);
+ key.icon.setBounds(0, 0,
+ key.icon.getIntrinsicWidth(), key.icon.getIntrinsicHeight());
+ key.icon.draw(canvas);
+ canvas.translate(-drawableX, -drawableY);
+ } else if (label != null) {
+ // For characters, use large font. For labels like "Done", use
+ // small font.
+ if (label.length() > 1) {
+ paint.setTextSize(mModeChangeTextSize);
+ paint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL));
+ } else {
+ paint.setTextSize(mKeyTextSize);
+ paint.setTypeface(Typeface.create("sans-serif-light", Typeface.NORMAL));
+ }
+ // Draw the text
+ canvas.drawText(label,
+ (key.width - padding.left - padding.right) / 2
+ + padding.left,
+ (key.height - padding.top - padding.bottom) / 2
+ + (paint.getTextSize() - paint.descent()) / 2 + padding.top,
+ paint);
+ // Turn off drop shadow
+ paint.setShadowLayer(0, 0, 0, 0);
+ }
+
+ ImageView view = new ImageView(getContext());
+ view.setImageBitmap(bitmap);
+ view.setContentDescription(label);
+ addView(view, new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.WRAP_CONTENT));
+
+ view.setX(key.x + kbdPaddingLeft);
+ view.setY(key.y + kbdPaddingTop);
+ view.setImageAlpha(mMiniKeyboardOnScreen && !keyHolder.isInMiniKb ?
+ mInactiveMiniKbAlpha : 255);
+ view.setVisibility(View.VISIBLE);
+
+ return view;
+ }
+
+ private void createKeyImageViews(KeyHolder[] keys) {
+ int totalKeys = keys.length;
+ if (mKeyImageViews != null) {
+ for (ImageView view : mKeyImageViews) {
+ this.removeView(view);
+ }
+ mKeyImageViews = null;
+ }
+
+ for (int keyIndex = 0; keyIndex < totalKeys; keyIndex++) {
+ if (mKeyImageViews == null) {
+ mKeyImageViews = new ImageView[totalKeys];
+ } else if (mKeyImageViews[keyIndex] != null) {
+ removeView(mKeyImageViews[keyIndex]);
+ }
+ mKeyImageViews[keyIndex] = createKeyImageView(keyIndex);
+ }
+ }
+
+ private void removeMessages() {
+ // TODO create mHandler and remove all messages here
+ }
+
+ /**
+ * Requests a redraw of the entire keyboard. Calling {@link #invalidate} is
+ * not sufficient because the keyboard renders the keys to an off-screen
+ * buffer and an invalidate() only draws the cached buffer.
+ *
+ * @see #invalidateKey(int)
+ */
+ public void invalidateAllKeys() {
+ createKeyImageViews(mKeys);
+ }
+
+ public void invalidateKey(int keyIndex) {
+ if (mKeys == null)
+ return;
+ if (keyIndex < 0 || keyIndex >= mKeys.length) {
+ return;
+ }
+ if (mKeyImageViews[keyIndex] != null) {
+ removeView(mKeyImageViews[keyIndex]);
+ }
+ mKeyImageViews[keyIndex] = createKeyImageView(keyIndex);
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ }
+
+ private CharSequence adjustCase(KeyHolder keyHolder) {
+ CharSequence label = keyHolder.key.label;
+
+ if (label != null && label.length() < 3) {
+ // if we're adjusting the case of a basic letter in the mini keyboard,
+ // we want the opposite case
+ boolean invert = keyHolder.isInMiniKb && keyHolder.isInvertible;
+ if (mKeyboard.isShifted() ^ invert) {
+ label = label.toString().toUpperCase();
+ } else {
+ label = label.toString().toLowerCase();
+ }
+
+ keyHolder.key.label = label;
+ }
+
+ return label;
+ }
+
+ public void setShiftState(int state) {
+ if (mShiftState == state) {
+ return;
+ }
+ switch (state) {
+ case SHIFT_OFF:
+ mKeyboard.setShifted(false);
+ break;
+ case SHIFT_ON:
+ case SHIFT_LOCKED:
+ mKeyboard.setShifted(true);
+ break;
+ }
+ mShiftState = state;
+ invalidateAllKeys();
+ }
+
+ public int getShiftState() {
+ return mShiftState;
+ }
+
+ public boolean isShifted() {
+ return mShiftState == SHIFT_ON || mShiftState == SHIFT_LOCKED;
+ }
+
+ public void setFocus(int index, boolean clicked) {
+ setFocus(index, clicked, true);
+ }
+
+ public void setFocus(int index, boolean clicked, boolean showFocusScale) {
+ if (mKeyImageViews == null || mKeyImageViews.length == 0) {
+ return;
+ }
+ if (index < 0 || index >= mKeyImageViews.length) {
+ index = NOT_A_KEY;
+ }
+
+ if (index != mFocusIndex || clicked != mFocusClicked) {
+ if (index != mFocusIndex) {
+ if (mFocusIndex != NOT_A_KEY) {
+ LeanbackUtils.sendAccessibilityEvent(mKeyImageViews[mFocusIndex], false);
+ }
+ if (index != NOT_A_KEY) {
+ LeanbackUtils.sendAccessibilityEvent(mKeyImageViews[index], true);
+ }
+ }
+
+ if (mCurrentFocusView != null) {
+ mCurrentFocusView.animate().scaleX(1f).scaleY(1f)
+ .setInterpolator(LeanbackKeyboardContainer.sMovementInterpolator)
+ .setStartDelay(mUnfocusStartDelay);
+ mCurrentFocusView.animate().setDuration(mClickAnimDur)
+ .setInterpolator(LeanbackKeyboardContainer.sMovementInterpolator)
+ .setStartDelay(mUnfocusStartDelay);
+ }
+ if (index != NOT_A_KEY) {
+ float scale = clicked ? mClickedScale : (showFocusScale ? mFocusedScale : 1.0f);
+ mCurrentFocusView = mKeyImageViews[index];
+ mCurrentFocusView.animate().scaleX(scale).scaleY(scale)
+ .setInterpolator(LeanbackKeyboardContainer.sMovementInterpolator)
+ .setDuration(mClickAnimDur).start();
+ }
+ mFocusIndex = index;
+ mFocusClicked = clicked;
+
+ // if focusing on a non-mini kb key, dismiss minikb
+ if (NOT_A_KEY != index && !mKeys[index].isInMiniKb) {
+ dismissMiniKeyboard();
+ }
+ }
+ }
+
+ public boolean isMiniKeyboardOnScreen() {
+ return mMiniKeyboardOnScreen;
+ }
+
+ public void onKeyLongPress() {
+ int popupResId = mKeys[mFocusIndex].key.popupResId;
+ if (popupResId != 0) {
+ dismissMiniKeyboard();
+ mMiniKeyboardOnScreen = true;
+ Keyboard miniKeyboard = new Keyboard(getContext(), popupResId);
+ List<Key> accentKeys = miniKeyboard.getKeys();
+ int totalAccentKeys = accentKeys.size();
+ int baseIndex = mFocusIndex;
+ int currentRow = mFocusIndex / mColCount;
+ int nextRow = (mFocusIndex + totalAccentKeys) / mColCount;
+ // if all accent keys don't fit in a row when aligned with the popup
+ // key, align the accent keys to the right boundary of that row
+ if (currentRow != nextRow) {
+ baseIndex = nextRow * mColCount - totalAccentKeys;
+ }
+ mBaseMiniKbIndex = baseIndex;
+ for (int i = 0; i < totalAccentKeys; i++) {
+ Key accentKey = accentKeys.get(i);
+ // inherit the key position and edge flags. this way the xml files for the each
+ // miniKb don't have to take into account the configuration of the keyboard
+ // they're being inserted into.
+ accentKey.x = mKeys[baseIndex + i].key.x;
+ accentKey.y = mKeys[baseIndex + i].key.y;
+ accentKey.edgeFlags = mKeys[baseIndex + i].key.edgeFlags;
+ mKeys[baseIndex + i].key = accentKey;
+ mKeys[baseIndex + i].isInMiniKb = true;
+ mKeys[baseIndex + i].isInvertible = (i == 0);
+ }
+
+ invalidateAllKeys();
+ }
+ }
+
+ public int getBaseMiniKbIndex() {
+ return mBaseMiniKbIndex;
+ }
+
+ /**
+ * @return true if the minikeyboard was on-screen and is now dismissed, false otherwise.
+ */
+ public boolean dismissMiniKeyboard() {
+ if (mMiniKeyboardOnScreen) {
+ mMiniKeyboardOnScreen = false;
+ setKeys(mKeyboard.getKeys());
+ invalidateAllKeys();
+ return true;
+ }
+
+ return false;
+ }
+
+ public void setFocus(int row, int col, boolean clicked) {
+ setFocus(mColCount * row + col, clicked);
+ }
+
+ @Override
+ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ // For the kids, ya know?
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ // Round up a little
+ if (mKeyboard == null) {
+ setMeasuredDimension(getPaddingLeft() + getPaddingRight(),
+ getPaddingTop() + getPaddingBottom());
+ } else {
+ int width = mKeyboard.getMinWidth() + getPaddingLeft() + getPaddingRight();
+ if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) {
+ width = MeasureSpec.getSize(widthMeasureSpec);
+ }
+ setMeasuredDimension(width, mKeyboard.getHeight() + getPaddingTop() + getPaddingBottom());
+ }
+ }
+
+ private void setKeys(List<Key> keys) {
+ mKeys = new KeyHolder[keys.size()];
+ Iterator<Key> itt = keys.iterator();
+ for (int i = 0; i < mKeys.length && itt.hasNext(); i++) {
+ Key k = itt.next();
+ mKeys[i] = new KeyHolder(k);
+ }
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/LeanbackLocales.java b/src/com/android/inputmethod/leanback/LeanbackLocales.java
new file mode 100644
index 0000000..4dd785d
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/LeanbackLocales.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2019 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.leanback;
+
+import java.util.Locale;
+
+public class LeanbackLocales {
+
+ /*
+ * -Locales are organized into groups based on keyboard layout (e.g. qwerty, qwertz, azerty)
+ * -In each group, the most specific layouts (those that specify language AND country)
+ * are listed first
+ * -The list of locales are named as such: <keyboard layout>_<country|language>_zone
+ * (Note: the naming of the list is made as generic as possible, for example if there is only
+ * one list for a given keyboard layout then the country, language and zone is omitted)
+ * (Note: country is preferred over language because it is more specific, if no country is
+ * specified, use language)
+ * (Note: zone refers to US vs EU, which specifies which type of currency to use
+ * dollar, euro, or pound)
+ */
+
+ /**************************** QWERTY ****************************/
+ // QWERTY (EN GB)
+ public static final Locale BRITISH_ENGLISH = new Locale("en", "GB");
+ public static final Locale[] QWERTY_GB = new Locale[] {BRITISH_ENGLISH};
+
+ // QWERTY (EN IN)
+ public static final Locale INDIAN_ENGLISH = new Locale("en", "IN");
+ public static final Locale[] QWERTY_IN = new Locale[] {INDIAN_ENGLISH};
+
+ // QWERTY (ES EU)
+ public static final Locale SPAIN_SPANISH = new Locale("es", "ES");
+ public static final Locale GALIC_SPANISH = new Locale("gl", "ES");
+ public static final Locale BASQUE_SPANISH = new Locale("eu", "ES");
+ public static final Locale[] QWERTY_ES_EU = new Locale[] {
+ SPAIN_SPANISH, GALIC_SPANISH, BASQUE_SPANISH};
+
+ // QWERTY (ES US)
+ public static final Locale OTHER_SPANISH = new Locale("es", "");
+ public static final Locale[] QWERTY_ES_US = new Locale[] {OTHER_SPANISH};
+
+ // QWERTY (AZ)
+ public static final Locale AZERBAIJANI = new Locale("az", "");
+ public static final Locale[] QWERTY_AZ = new Locale[] {AZERBAIJANI};
+
+ // QWERTY (CA)
+ public static final Locale CATALAN = new Locale("ca", "");
+ public static final Locale[] QWERTY_CA = new Locale[] {CATALAN};
+
+ // QWERTY (DA)
+ public static final Locale DANISH = new Locale("da", "");
+ public static final Locale[] QWERTY_DA = new Locale[] {DANISH};
+
+ // QWERTY (ET)
+ public static final Locale ESTONIAN = new Locale("et", "");
+ public static final Locale[] QWERTY_ET = new Locale[] {ESTONIAN};
+
+ // QWERTY (FI)
+ public static final Locale FINNISH = new Locale("fi", "");
+ public static final Locale[] QWERTY_FI = new Locale[] {FINNISH};
+
+ // QWERTY (NB)
+ public static final Locale NORWEGIAN = new Locale("nb", "");
+ public static final Locale[] QWERTY_NB = new Locale[] {NORWEGIAN};
+
+ // QWERTY (SV)
+ public static final Locale SWEDISH = new Locale("sv", "");
+ public static final Locale[] QWERTY_SV = new Locale[] {SWEDISH};
+
+ // QWERTY (US)
+ public static final Locale ENGLISH = Locale.ENGLISH;
+ public static final Locale CANADIAN_FRENCH = Locale.CANADA_FRENCH;
+ public static final Locale[] QWERTY_US = new Locale[] {ENGLISH, CANADIAN_FRENCH};
+
+
+ /**************************** QWERTZ ****************************/
+
+ // QWERTZ (CH)
+ public static final Locale SWISS_GERMAN = new Locale("de", "CH");
+ public static final Locale SWISS_ITALIAN = new Locale("it", "CH");
+ public static final Locale[] QWERTZ_CH = new Locale[] { SWISS_GERMAN, SWISS_ITALIAN};
+
+ // QWERTZ
+ public static final Locale GERMAN = new Locale("de", "");
+ public static final Locale CROATIAN = new Locale("hr", "");
+ public static final Locale CZECH = new Locale("cs", "");
+ public static final Locale SWISS_FRENCH = new Locale("fr", "CH");
+ public static final Locale HUNGARIAN = new Locale("hu", "");
+ public static final Locale SERBIAN = new Locale("sr", "");
+ public static final Locale SLOVENIAN = new Locale("sl", "");
+ public static final Locale ALBANIANIAN = new Locale("sq", "");
+ public static final Locale[] QWERTZ = new Locale[] { GERMAN, CROATIAN, CZECH, SWISS_FRENCH,
+ SWISS_ITALIAN, HUNGARIAN,SERBIAN, SLOVENIAN, ALBANIANIAN};
+
+
+ /**************************** AZERTY ****************************/
+
+ // AZERTY
+ public static final Locale FRENCH = Locale.FRENCH;
+ public static final Locale BELGIAN_DUTCH = new Locale("nl", "BE");
+ public static final Locale[] AZERTY = new Locale[] {FRENCH, BELGIAN_DUTCH};
+
+}
diff --git a/src/com/android/inputmethod/leanback/LeanbackSuggestionsFactory.java b/src/com/android/inputmethod/leanback/LeanbackSuggestionsFactory.java
new file mode 100644
index 0000000..9423132
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/LeanbackSuggestionsFactory.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2019 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.leanback;
+
+import android.inputmethodservice.InputMethodService;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.inputmethod.CompletionInfo;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+
+import java.util.ArrayList;
+
+/**
+ * This class is used to get suggestions from LatinIme's suggestion engine based
+ * on the current composing word
+ */
+public class LeanbackSuggestionsFactory {
+
+ private static final String TAG = "LbSuggestionsFactory";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.VERBOSE);
+
+ // mode for suggestions
+ private static final int MODE_DEFAULT = 0;
+ private static final int MODE_DOMAIN = 1;
+ private static final int MODE_AUTO_COMPLETE = 2;
+
+ private InputMethodService mContext;
+ private int mNumSuggestions;
+ private int mMode;
+
+ // current active suggestions
+ private final ArrayList<String> mSuggestions = new ArrayList<String>();
+
+ public LeanbackSuggestionsFactory(InputMethodService context, int maxSuggestions) {
+ mContext = context;
+ mNumSuggestions = maxSuggestions;
+ }
+
+ public void onStartInput(EditorInfo attribute) {
+ mMode = MODE_DEFAULT;
+
+ if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
+ mMode = MODE_AUTO_COMPLETE;
+ }
+
+ switch (LeanbackUtils.getInputTypeClass(attribute)) {
+ case EditorInfo.TYPE_CLASS_TEXT:
+ switch (LeanbackUtils.getInputTypeVariation(attribute)) {
+ case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+ case EditorInfo.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+ mMode = MODE_DOMAIN;
+ break;
+ }
+ break;
+ }
+ }
+
+ /**
+ * call this method in {@link InputMethodService#onDisplayCompletions} to
+ * insert completions provided by the app in front of the dictionary
+ * suggestions
+ */
+ public void onDisplayCompletions(CompletionInfo[] completions) {
+ createSuggestions();
+
+ // insert completions to the front of suggestions
+ final int totalCompletions = completions == null ? 0 : completions.length;
+ for (int i = 0; i < totalCompletions && mSuggestions.size() < mNumSuggestions; i++) {
+ if (TextUtils.isEmpty(completions[i].getText())) {
+ break;
+ }
+ mSuggestions.add(i, completions[i].getText().toString());
+ }
+
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ for (int i = 0; i < mSuggestions.size(); i++) {
+ Log.d(TAG, "completion " + i + ": " + mSuggestions.get(i));
+ }
+ }
+ }
+
+ public boolean shouldSuggestionsAmend() {
+ return (mMode == MODE_DOMAIN);
+ }
+
+ public ArrayList<String> getSuggestions() {
+ return mSuggestions;
+ }
+
+ public void clearSuggestions() {
+ mSuggestions.clear();
+ }
+
+ public void createSuggestions() {
+ clearSuggestions();
+
+ if (mMode == MODE_DOMAIN) {
+ String[] commonDomains =
+ mContext.getResources().getStringArray(R.array.common_domains);
+ for (String domain : commonDomains) {
+ mSuggestions.add(domain);
+ }
+ }
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/LeanbackUtils.java b/src/com/android/inputmethod/leanback/LeanbackUtils.java
new file mode 100644
index 0000000..530e851
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/LeanbackUtils.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2019 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.leanback;
+
+import android.os.Handler;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.inputmethod.EditorInfo;
+
+/**
+ * This class contains common methods used by LeanbackImeService classes
+ */
+public class LeanbackUtils {
+
+ private static final int ACCESSIBILITY_DELAY_MS = 250;
+ private static final Handler sAccessibilityHandler = new Handler();
+
+ /**
+ * checks if the keyCode represents an alphabet char
+ *
+ * @return true if the keyCode represents an alphabet char
+ */
+ public static boolean isAlphabet(int keyCode) {
+ if (Character.isLetter(keyCode)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * get the IME action of the current {@link EditText}
+ */
+ public static int getImeAction(EditorInfo attribute) {
+ return attribute.imeOptions
+ & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);
+ }
+
+ /**
+ * get the input type class of the current {@link EditText}
+ */
+ public static int getInputTypeClass(EditorInfo attribute) {
+ return attribute.inputType & EditorInfo.TYPE_MASK_CLASS;
+ }
+
+ /**
+ * get the input type variation of the current {@link EditText}
+ */
+ public static int getInputTypeVariation(EditorInfo attribute) {
+ return attribute.inputType & EditorInfo.TYPE_MASK_VARIATION;
+ }
+
+ public static void sendAccessibilityEvent(final View view, boolean focusGained) {
+ if (view != null && focusGained) {
+ sAccessibilityHandler.removeCallbacksAndMessages(null);
+ sAccessibilityHandler.postDelayed(new Runnable() {
+ public void run() {
+ view.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
+ }
+ }, ACCESSIBILITY_DELAY_MS);
+ }
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/service/LeanbackImeService.java b/src/com/android/inputmethod/leanback/service/LeanbackImeService.java
new file mode 100644
index 0000000..ab286b2
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/service/LeanbackImeService.java
@@ -0,0 +1,344 @@
+/*
+ * Copyright (C) 2019 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.leanback.service;
+
+import android.content.Intent;
+import android.inputmethodservice.InputMethodService;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.InputDevice;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.CompletionInfo;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.util.Log;
+
+import com.android.inputmethod.leanback.LeanbackKeyboardContainer;
+import com.android.inputmethod.leanback.LeanbackKeyboardController;
+import com.android.inputmethod.leanback.LeanbackKeyboardView;
+import com.android.inputmethod.leanback.LeanbackLocales;
+import com.android.inputmethod.leanback.LeanbackSuggestionsFactory;
+import com.android.inputmethod.leanback.LeanbackUtils;
+
+/**
+ * This is a simplified version of GridIme
+ */
+public class LeanbackImeService extends InputMethodService {
+
+ private static final String TAG = "LbImeService";
+ private static final boolean DEBUG = false;
+
+ // use dpad events, with lock axis
+ static final int MODE_TRACKPAD_NAVIGATION = 0;
+ // track motion directly.
+ static final int MODE_FREE_MOVEMENT = 1;
+
+ public static final int MAX_SUGGESTIONS = 10;
+
+ private static final int MSG_SUGGESTIONS_CLEAR = 123;
+ private static final int SUGGESTIONS_CLEAR_DELAY = 1000;
+
+ public static final String IME_OPEN = "com.android.inputmethod.leanback.action.IME_OPEN";
+ public static final String IME_CLOSE = "com.android.inputmethod.leanback.action.IME_CLOSE";
+
+ private LeanbackKeyboardController.InputListener mInputListener
+ = new LeanbackKeyboardController.InputListener() {
+ @Override
+ public void onEntry(int type, int keyCode, CharSequence result) {
+ handleTextEntry(type, keyCode, result);
+ }
+ };
+
+ private View mInputView;
+ private LeanbackKeyboardController mKeyboardController;
+ private LeanbackSuggestionsFactory mSuggestionsFactory;
+
+ // IME will auto insert space after clicking on the candidates if next
+ // character is alphabet
+ private boolean mEnterSpaceBeforeCommitting;
+
+ private boolean mShouldClearSuggestions = true;
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == MSG_SUGGESTIONS_CLEAR) {
+ if (mShouldClearSuggestions) {
+ mSuggestionsFactory.clearSuggestions();
+ mKeyboardController.updateSuggestions(mSuggestionsFactory.getSuggestions());
+ mShouldClearSuggestions = false;
+ }
+ }
+ }
+ };
+
+ public LeanbackImeService() {
+ if (!enableHardwareAcceleration()) {
+ Log.w(TAG, "Could not enable hardware acceleration");
+ }
+ }
+
+ private void clearSuggestionsDelayed() {
+ // if suggestions amend, we should keep clearing them
+ if (!mSuggestionsFactory.shouldSuggestionsAmend()) {
+ mHandler.removeMessages(MSG_SUGGESTIONS_CLEAR);
+ mShouldClearSuggestions = true;
+ mHandler.sendEmptyMessageDelayed(MSG_SUGGESTIONS_CLEAR, SUGGESTIONS_CLEAR_DELAY);
+ }
+ }
+
+ @Override
+ public void onInitializeInterface() {
+ mKeyboardController = new LeanbackKeyboardController(this, mInputListener);
+ mEnterSpaceBeforeCommitting = false;
+ mSuggestionsFactory = new LeanbackSuggestionsFactory(this, MAX_SUGGESTIONS);
+ }
+
+ @Override
+ public View onCreateInputView() {
+ mInputView = mKeyboardController.getView();
+ mInputView.requestFocus();
+ return mInputView;
+ }
+
+ /**
+ * {@inheritDoc} This function gets called whenever we start the input
+ * window
+ */
+ @Override
+ public void onStartInputView(EditorInfo info, boolean restarting) {
+ super.onStartInputView(info, restarting);
+ mKeyboardController.onStartInputView();
+ sendBroadcast(new Intent(IME_OPEN));
+
+ if (mKeyboardController.areSuggestionsEnabled()) {
+ mSuggestionsFactory.createSuggestions();
+ mKeyboardController.updateSuggestions(mSuggestionsFactory.getSuggestions());
+
+ // repost text to get completions
+ InputConnection ic = getCurrentInputConnection();
+ if (ic != null) {
+ String c = getEditorText(ic);
+ ic.deleteSurroundingText(getCharLengthBeforeCursor(ic),
+ getCharLengthAfterCursor(ic));
+ ic.commitText(c, 1);
+ }
+ }
+ }
+
+
+ @Override
+ public void onFinishInputView(boolean finishingInput) {
+ super.onFinishInputView(finishingInput);
+ sendBroadcast(new Intent(IME_CLOSE));
+ mSuggestionsFactory.clearSuggestions();
+ }
+
+ /**
+ * {@inheritDoc} This function doesn't get called when we dismiss the
+ * keyboard, and reopen it on the same input field
+ */
+ @Override
+ public void onStartInput(EditorInfo attribute, boolean restarting) {
+ super.onStartInput(attribute, restarting);
+ mEnterSpaceBeforeCommitting = false;
+ mSuggestionsFactory.onStartInput(attribute);
+ mKeyboardController.onStartInput(attribute);
+ }
+
+ /**
+ * {@inheritDoc} Always return true to show GridIme when editText calls
+ * requestFocus
+ */
+ @Override
+ public boolean onShowInputRequested(int flags, boolean configChange) {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc} Always enable soft keyboard. If we return the super method,
+ * the IME will not be shown if there is a hardware keyboard connected
+ */
+ @Override
+ public boolean onEvaluateInputViewShown() {
+ return true;
+ }
+
+ @Override
+ public boolean onEvaluateFullscreenMode() {
+ // Superclass always returns true in landscape mode.
+ // Assume we're on TV with lots of display area.
+ return false;
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (isInputViewShown()
+ && mKeyboardController.onKeyUp(keyCode, event)) {
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (isInputViewShown()
+ && mKeyboardController.onKeyDown(keyCode, event)) {
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ public boolean onGenericMotionEvent(MotionEvent event) {
+ if (isInputViewShown() && (event.getSource() & InputDevice.SOURCE_TOUCH_NAVIGATION)
+ == InputDevice.SOURCE_TOUCH_NAVIGATION) {
+ if (mKeyboardController.onGenericMotionEvent(event)) {
+ return true;
+ }
+ }
+ return super.onGenericMotionEvent(event);
+ }
+
+ @Override
+ public void onDisplayCompletions(CompletionInfo[] completions) {
+ if (mKeyboardController.areSuggestionsEnabled()) {
+ mShouldClearSuggestions = false;
+ mHandler.removeMessages(MSG_SUGGESTIONS_CLEAR);
+ mSuggestionsFactory.onDisplayCompletions(completions);
+ mKeyboardController.updateSuggestions(mSuggestionsFactory.getSuggestions());
+ }
+ }
+
+ private String getEditorText(InputConnection ic) {
+ StringBuilder editorText = new StringBuilder();
+ CharSequence textBeforeCursor = ic.getTextBeforeCursor(1000, 0);
+ CharSequence textAfterCursor = ic.getTextAfterCursor(1000, 0);
+ if (textBeforeCursor != null) {
+ editorText.append(textBeforeCursor);
+ }
+ if (textAfterCursor != null) {
+ editorText.append(textAfterCursor);
+ }
+ return editorText.toString();
+ }
+
+ private int getAmpersandLocation(InputConnection ic) {
+ String editorText = getEditorText(ic);
+ int indexOf = editorText.indexOf('@');
+ if (indexOf < 0) {
+ indexOf = editorText.length();
+ }
+
+ return indexOf;
+ }
+
+ private int getCharLengthBeforeCursor(InputConnection ic) {
+ final CharSequence textLeft = ic.getTextBeforeCursor(1000, 0);
+ return textLeft != null ? textLeft.length() : 0;
+ }
+
+ private int getCharLengthAfterCursor(InputConnection ic ) {
+ final CharSequence textRight = ic.getTextAfterCursor(1000, 0);
+ return textRight != null ? textRight.length() : 0;
+ }
+
+ private void handleTextEntry(int type, int keyCode, CharSequence c) {
+ InputConnection ic = getCurrentInputConnection();
+ boolean updateSuggestions = true;
+
+ if (ic == null) {
+ return;
+ }
+
+ switch (type) {
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_BACKSPACE:
+ clearSuggestionsDelayed();
+ ic.deleteSurroundingText(1, 0);
+ mEnterSpaceBeforeCommitting = false;
+ break;
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_LEFT:
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_RIGHT:
+ CharSequence textBeforeCursor = ic.getTextBeforeCursor(1000, 0);
+ int newCursorPosition = textBeforeCursor == null ? 0 : textBeforeCursor.length();
+
+ if (type == LeanbackKeyboardController.InputListener.ENTRY_TYPE_LEFT) {
+ if (newCursorPosition > 0) {
+ newCursorPosition--;
+ }
+ } else {
+ CharSequence textAfterCursor = ic.getTextAfterCursor(1000, 0);
+ if (textAfterCursor != null && textAfterCursor.length() > 0) {
+ newCursorPosition++;
+ }
+ }
+
+ ic.setSelection(newCursorPosition, newCursorPosition);
+ break;
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_STRING:
+ clearSuggestionsDelayed();
+ if (mEnterSpaceBeforeCommitting
+ && mKeyboardController.enableAutoEnterSpace()) {
+ if (LeanbackUtils.isAlphabet(keyCode)) {
+ ic.commitText(" ", 1);
+ }
+ mEnterSpaceBeforeCommitting = false;
+ }
+ ic.commitText(c, 1);
+ if (keyCode == LeanbackKeyboardView.ASCII_PERIOD) {
+ mEnterSpaceBeforeCommitting = true;
+ }
+ break;
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_SUGGESTION:
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_VOICE:
+ clearSuggestionsDelayed();
+ if (!mSuggestionsFactory.shouldSuggestionsAmend()) {
+ ic.deleteSurroundingText(getCharLengthBeforeCursor(ic),
+ getCharLengthAfterCursor(ic));
+ } else {
+ int location = getAmpersandLocation(ic);
+ ic.setSelection(location, location);
+ ic.deleteSurroundingText(0, getCharLengthAfterCursor(ic));
+ }
+ ic.commitText(c, 1);
+ mEnterSpaceBeforeCommitting = true;
+ // go straight into action (skip updating suggestions)
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_ACTION:
+ sendDefaultEditorAction(false);
+ updateSuggestions = false;
+ break;
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_DISMISS:
+ ic.performEditorAction(EditorInfo.IME_ACTION_NONE);
+ updateSuggestions = false;
+ break;
+ case LeanbackKeyboardController.InputListener.ENTRY_TYPE_VOICE_DISMISS:
+ ic.performEditorAction(EditorInfo.IME_ACTION_GO);
+ updateSuggestions = false;
+ break;
+ }
+
+ if (mKeyboardController.areSuggestionsEnabled() && updateSuggestions) {
+ mKeyboardController.updateSuggestions(mSuggestionsFactory.getSuggestions());
+ }
+ }
+
+ public void onHideIme() {
+ requestHideSelf(0);
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/voice/BitmapSoundLevelView.java b/src/com/android/inputmethod/leanback/voice/BitmapSoundLevelView.java
new file mode 100644
index 0000000..e74500e
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/voice/BitmapSoundLevelView.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2019 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.leanback.voice;
+
+import com.android.inputmethod.leanback.R;
+
+import android.animation.ObjectAnimator;
+import android.animation.TimeAnimator;
+import android.animation.TimeAnimator.TimeListener;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * Displays the recording value of the microphone.
+ */
+public class BitmapSoundLevelView extends View {
+ private static final boolean DEBUG = false;
+ private static final String TAG = "BitmapSoundLevelsView";
+
+ private static final int MIC_PRIMARY_LEVEL_IMAGE_OFFSET = 3;
+ private static final int MIC_LEVEL_GUIDELINE_OFFSET = 13;
+
+ private final Paint mEmptyPaint = new Paint();
+ private Rect mDestRect;
+
+ private final int mEnableBackgroundColor;
+ private final int mDisableBackgroundColor;
+
+ // Generates clock ticks for the animation using the global animation loop.
+ private TimeAnimator mAnimator;
+
+ private int mCurrentVolume;
+
+ // Bitmap for the main level meter, most closely follows the mic.
+ private final Bitmap mPrimaryLevel;
+
+ // Bitmap for trailing level meter, shows a peak level.
+ private final Bitmap mTrailLevel;
+
+ // The minimum size of the levels, that is the size when volume is 0.
+ private final int mMinimumLevelSize;
+
+ // A translation to apply to the center of the levels, allows the levels to be offset from
+ // the center of the mView without having to translate the whole mView.
+ private final int mCenterTranslationX;
+ private final int mCenterTranslationY;
+
+ // Peak level observed, and how many frames left before it starts decaying.
+ private int mPeakLevel;
+ private int mPeakLevelCountDown;
+
+ // Input level is pulled from here.
+ private SpeechLevelSource mLevelSource;
+
+ private Paint mPaint;
+
+ public BitmapSoundLevelView(Context context) {
+ this(context, null);
+ }
+
+ public BitmapSoundLevelView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public BitmapSoundLevelView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BitmapSoundLevelView,
+ defStyleAttr, 0);
+ mEnableBackgroundColor = a.getColor(R.styleable.BitmapSoundLevelView_enabledBackgroundColor,
+ Color.parseColor("#66FFFFFF"));
+
+ mDisableBackgroundColor = a.getColor(
+ R.styleable.BitmapSoundLevelView_disabledBackgroundColor,
+ Color.WHITE);
+
+ boolean primaryLevelEnabled = false;
+ boolean peakLevelEnabled = false;
+ int primaryLevelId = 0;
+ if (a.hasValue(R.styleable.BitmapSoundLevelView_primaryLevels)) {
+ primaryLevelId = a.getResourceId(
+ R.styleable.BitmapSoundLevelView_primaryLevels, R.drawable.vs_reactive_dark);
+ primaryLevelEnabled = true;
+ }
+
+ int trailLevelId = 0;
+ if (a.hasValue(R.styleable.BitmapSoundLevelView_trailLevels)) {
+ trailLevelId = a.getResourceId(
+ R.styleable.BitmapSoundLevelView_trailLevels, R.drawable.vs_reactive_light);
+ peakLevelEnabled = true;
+ }
+
+ mCenterTranslationX = a.getDimensionPixelOffset(
+ R.styleable.BitmapSoundLevelView_levelsCenterX, 0);
+
+ mCenterTranslationY = a.getDimensionPixelOffset(
+ R.styleable.BitmapSoundLevelView_levelsCenterY, 0);
+
+ mMinimumLevelSize = a.getDimensionPixelOffset(
+ R.styleable.BitmapSoundLevelView_minLevelRadius, 0);
+
+ a.recycle();
+
+ if (primaryLevelEnabled) {
+ mPrimaryLevel = BitmapFactory.decodeResource(getResources(), primaryLevelId);
+ } else {
+ mPrimaryLevel = null;
+ }
+
+ if (peakLevelEnabled) {
+ mTrailLevel = BitmapFactory.decodeResource(getResources(), trailLevelId);
+ } else {
+ mTrailLevel = null;
+ }
+
+ mPaint = new Paint();
+
+ mDestRect = new Rect();
+
+ mEmptyPaint.setFilterBitmap(true);
+
+ // Safe source, replaced with system one when attached.
+ mLevelSource = new SpeechLevelSource();
+ mLevelSource.setSpeechLevel(0);
+
+ // This animator generates ticks that invalidate the
+ // mView so that the animation is synced with the global animation loop.
+ mAnimator = new TimeAnimator();
+ mAnimator.setRepeatCount(ObjectAnimator.INFINITE);
+ mAnimator.setTimeListener(new TimeListener() {
+ @Override
+ public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
+ invalidate();
+ }
+ });
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ updateAnimatorState();
+ }
+
+ private void updateAnimatorState() {
+ if (isEnabled()) {
+ startAnimator();
+ } else {
+ stopAnimator();
+ }
+ }
+
+ private void startAnimator() {
+ if (DEBUG) Log.d(TAG, "startAnimator()");
+ if (!mAnimator.isStarted()) {
+ mAnimator.start();
+ }
+ }
+
+ private void stopAnimator() {
+ if (DEBUG) Log.d(TAG, "stopAnimator()");
+ mAnimator.cancel();
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ updateAnimatorState();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ stopAnimator();
+ super.onDetachedFromWindow();
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ super.onWindowFocusChanged(hasWindowFocus);
+ if (hasWindowFocus) {
+ updateAnimatorState();
+ } else {
+ stopAnimator();
+ }
+ }
+
+ public void setLevelSource(SpeechLevelSource source) {
+ if (DEBUG) {
+ Log.d(TAG, "Speech source set");
+ }
+ mLevelSource = source;
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ if (isEnabled()) {
+ canvas.drawColor(mEnableBackgroundColor);
+
+ int level = mLevelSource.getSpeechLevel();
+
+ // Set the peak level for the trailing circle, goes to a peak, waits there for
+ // some frames, then starts to decay.
+ if (level > mPeakLevel) {
+ mPeakLevel = level;
+ mPeakLevelCountDown = 25;
+ } else {
+ if (mPeakLevelCountDown == 0) {
+ mPeakLevel = Math.max(0, mPeakLevel - 2);
+ } else {
+ mPeakLevelCountDown--;
+ }
+ }
+
+ // Either ease towards the target level, or decay away from it depending on whether
+ // its higher or lower than the current.
+ if (level > mCurrentVolume) {
+ mCurrentVolume = mCurrentVolume + ((level - mCurrentVolume) / 4);
+ } else {
+ mCurrentVolume = (int) (mCurrentVolume * 0.95f);
+ }
+
+ int centerX = mCenterTranslationX + (getWidth() / 2);
+ int centerY = mCenterTranslationY + (getWidth() / 2);
+ if (mTrailLevel != null) {
+ int size = ((centerX - mMinimumLevelSize) * mPeakLevel) / 100 + mMinimumLevelSize;
+
+ mDestRect.set(
+ centerX - size,
+ centerY - size,
+ centerX + size,
+ centerY + size);
+ canvas.drawBitmap(mTrailLevel, null, mDestRect, mEmptyPaint);
+ }
+
+ if (mPrimaryLevel != null) {
+ int size =
+ ((centerX - mMinimumLevelSize) * mCurrentVolume) / 100 + mMinimumLevelSize;
+
+ mDestRect.set(
+ centerX - size,
+ centerY - size,
+ centerX + size,
+ centerY + size);
+ canvas.drawBitmap(mPrimaryLevel, null, mDestRect, mEmptyPaint);
+ mPaint.setColor(getResources().getColor(R.color.search_mic_background));
+ mPaint.setStyle(Paint.Style.FILL);
+ canvas.drawCircle(centerX, centerY, mMinimumLevelSize -
+ MIC_PRIMARY_LEVEL_IMAGE_OFFSET, mPaint);
+ }
+ if(mTrailLevel != null && mPrimaryLevel != null) {
+ mPaint.setColor(getResources().getColor(R.color.search_mic_levels_guideline));
+ mPaint.setStyle(Paint.Style.STROKE);
+ canvas.drawCircle(centerX, centerY, centerX - MIC_LEVEL_GUIDELINE_OFFSET, mPaint);
+ }
+ } else {
+ canvas.drawColor(mDisableBackgroundColor);
+ }
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/voice/RecognizerView.java b/src/com/android/inputmethod/leanback/voice/RecognizerView.java
new file mode 100644
index 0000000..ac162a2
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/voice/RecognizerView.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2019 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.leanback.voice;
+
+import com.android.inputmethod.leanback.LeanbackUtils;
+import com.android.inputmethod.leanback.R;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+
+/**
+ * Displays the recognizer status.
+ * This mView includes a {@link BitmapSoundLevelsView} to display the recording value.
+ */
+public class RecognizerView extends RelativeLayout {
+ private static final boolean DEBUG = false;
+ private static final String TAG = "RecognizerView";
+
+ private BitmapSoundLevelView mSoundLevels;
+ protected ImageView mMicButton;
+
+ private Callback mCallback;
+
+ private State mState;
+
+ private boolean mEnabled;
+
+ private enum State {
+ NOT_LISTENING,
+ MIC_INITIALIZING,
+ LISTENING,
+ RECORDING,
+ RECOGNIZING,
+ }
+
+ public RecognizerView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public RecognizerView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public RecognizerView(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onFinishInflate() {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ inflater.inflate(R.layout.recognizer_view, this, true);
+
+ mSoundLevels = (BitmapSoundLevelView) findViewById(R.id.microphone);
+ mMicButton = (ImageView) findViewById(R.id.recognizer_mic_button);
+
+ mState = State.NOT_LISTENING;
+ }
+
+ public View getMicButton() {
+ return mMicButton;
+ }
+
+ public void onClick() {
+ if (DEBUG) Log.v(TAG, "onClick " + mState);
+ switch (mState) {
+ case MIC_INITIALIZING:
+ if (DEBUG)
+ Log.d(TAG, "Ignore #onClick as mic is initializing");
+ return;
+ case LISTENING:
+ mCallback.onCancelRecordingClicked();
+ break;
+ case RECORDING:
+ mCallback.onStopRecordingClicked();
+ break;
+ case RECOGNIZING:
+ mCallback.onCancelRecordingClicked();
+ break;
+ case NOT_LISTENING:
+ mCallback.onStartRecordingClicked();
+ break;
+ default:
+ return;
+ }
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ // When the mView is attached to a window, a callback has to be already set.
+ //
+ // This isn't true when this mView is used in the intent API layout. When the user hits
+ // retry, we reattach the layout to the window, which is being shown. onAttachedToWindow( )
+ // will be called from inside setContentView( ) and before we can attach a callback to it.
+ // We ensure that the callback is not used when not set.
+ //
+ // Preconditions.checkNotNull(mCallback);
+
+ // The callbacks from the microphone happen before the mView is attached to the window.
+ // I need to investigate how to change the code to avoid it.
+ refreshUi();
+ }
+
+ public void showRecording() {
+ updateState(State.RECORDING);
+ }
+
+ public void showListening() {
+ updateState(State.LISTENING);
+ }
+
+ public void showNotListening() {
+ updateState(State.NOT_LISTENING);
+ }
+
+ public void showRecognizing() {
+ updateState(State.RECOGNIZING);
+ }
+
+ public void setCallback(final Callback callback) {
+ mCallback = callback;
+ }
+
+ private void updateState(State newState) {
+ if (DEBUG) Log.d(TAG, mState + " -> " + newState);
+ mState = newState;
+ refreshUi();
+ }
+
+ public void setSpeechLevelSource(SpeechLevelSource source) {
+ mSoundLevels.setLevelSource(source);
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ SavedState ss = new SavedState(super.onSaveInstanceState());
+ ss.mState = mState;
+ return ss;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ if (!(state instanceof SavedState)) {
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ SavedState ss = (SavedState) state;
+ super.onRestoreInstanceState(ss.getSuperState());
+
+ mState = ss.mState;
+ }
+
+ protected void refreshUi() {
+ if (!mEnabled) {
+ return;
+ }
+ switch (mState) {
+ case MIC_INITIALIZING:
+ mMicButton.setImageResource(R.drawable.vs_micbtn_on_selector);
+ mSoundLevels.setEnabled(false);
+ break;
+ case LISTENING:
+ mMicButton.setImageResource(R.drawable.vs_micbtn_on_selector);
+ mSoundLevels.setEnabled(true);
+ break;
+ case RECORDING:
+ mMicButton.setImageResource(R.drawable.vs_micbtn_rec_selector);
+ mSoundLevels.setEnabled(true);
+ break;
+ case NOT_LISTENING:
+ mMicButton.setImageResource(R.drawable.vs_micbtn_off_selector);
+ mSoundLevels.setEnabled(false);
+ break;
+ case RECOGNIZING:
+ mMicButton.setImageResource(R.drawable.vs_micbtn_off_selector);
+ mSoundLevels.setEnabled(false);
+ break;
+ }
+ }
+
+ public void setMicFocused(boolean hasFocus) {
+ if (mEnabled) {
+ if (hasFocus) {
+ mMicButton.setImageResource(R.drawable.ic_voice_focus);
+ } else {
+ mMicButton.setImageResource(R.drawable.ic_voice_available);
+ }
+
+ LeanbackUtils.sendAccessibilityEvent(mMicButton, hasFocus);
+ }
+ }
+
+ public void setMicEnabled(boolean enabled) {
+ mEnabled = enabled;
+ if (enabled) {
+ mMicButton.setAlpha(1.0f);
+ mMicButton.setImageResource(R.drawable.ic_voice_available);
+ } else {
+ mMicButton.setAlpha(0.1f);
+ mMicButton.setImageResource(R.drawable.ic_voice_off);
+ }
+ }
+
+ public void showInitializingMic() {
+ updateState(State.MIC_INITIALIZING);
+ }
+
+ public interface Callback {
+ void onStartRecordingClicked();
+ void onStopRecordingClicked();
+ void onCancelRecordingClicked();
+ }
+
+ public static class SavedState extends View.BaseSavedState {
+ State mState;
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeString(mState.toString());
+ }
+
+ @SuppressWarnings("hiding")
+ public static final Parcelable.Creator<SavedState> CREATOR
+ = new Parcelable.Creator<SavedState>() {
+
+ @Override
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ @Override
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+
+ private SavedState(Parcel in) {
+ super(in);
+ mState = State.valueOf(in.readString());
+ }
+ }
+}
diff --git a/src/com/android/inputmethod/leanback/voice/SpeechLevelSource.java b/src/com/android/inputmethod/leanback/voice/SpeechLevelSource.java
new file mode 100644
index 0000000..2c94589
--- /dev/null
+++ b/src/com/android/inputmethod/leanback/voice/SpeechLevelSource.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2019 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.leanback.voice;
+
+/**
+ * Keeps track of the speech level as last observed by the recognition
+ * engine as microphone data flows through it. Can be polled by the UI to
+ * animate its views.
+ */
+public class SpeechLevelSource {
+ private volatile int mSpeechLevel;
+
+ public void setSpeechLevel(int speechLevel) {
+ if (speechLevel < 0 || speechLevel > 100) {
+ throw new IllegalArgumentException();
+ }
+ mSpeechLevel = speechLevel;
+ }
+
+ public int getSpeechLevel() {
+ return mSpeechLevel;
+ }
+
+ public void reset() {
+ mSpeechLevel = -1;
+ }
+
+ public boolean isValid() {
+ return mSpeechLevel > 0;
+ }
+}
+