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()[]*&amp;@{}/&lt;&gt;_+=|&quot;</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="&amp;" />
+    </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="\&apos;" />
+        <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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+    </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="&amp;" />
+        <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="&quot;" />
+        <Key
+            android:codes="8226"
+            android:keyLabel="•" />
+        <Key
+            android:codes="95"
+            android:keyLabel="_" />
+        <Key
+            android:codes="38"
+            android:keyEdgeFlags="right"
+            android:keyLabel="&amp;" />
+    </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="&lt;" />
+        <Key
+            android:codes="62"
+            android:keyLabel=">" />
+        <Key
+            android:codes="39"
+            android:keyLabel="\&apos;" />
+        <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="&amp;" />
+        <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="&quot;" />
+        <Key
+            android:codes="39"
+            android:keyLabel="\&apos;" />
+        <Key
+            android:codes="95"
+            android:keyLabel="_" />
+        <Key
+            android:codes="38"
+            android:keyEdgeFlags="right"
+            android:keyLabel="&amp;" />
+    </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="&lt;" />
+        <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="&amp;" />
+        <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="&quot;" />
+        <Key
+            android:codes="39"
+            android:keyLabel="\&apos;" />
+        <Key
+            android:codes="95"
+            android:keyLabel="_" />
+        <Key
+            android:codes="38"
+            android:keyEdgeFlags="right"
+            android:keyLabel="&amp;" />
+    </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="&lt;" />
+        <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="&amp;" />
+        <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="&quot;" />
+        <Key
+            android:codes="39"
+            android:keyLabel="\&apos;" />
+        <Key
+            android:codes="95"
+            android:keyLabel="_" />
+        <Key
+            android:codes="38"
+            android:keyEdgeFlags="right"
+            android:keyLabel="&amp;" />
+    </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="&lt;" />
+        <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="&amp;" />
+        <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="&quot;" />
+        <Key
+            android:codes="8226"
+            android:keyLabel="•" />
+        <Key
+            android:codes="95"
+            android:keyLabel="_" />
+        <Key
+            android:codes="38"
+            android:keyEdgeFlags="right"
+            android:keyLabel="&amp;" />
+    </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="&lt;" />
+        <Key
+            android:codes="62"
+            android:keyLabel=">" />
+        <Key
+            android:codes="39"
+            android:keyLabel="\&apos;" />
+        <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="&amp;" />
+        <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="&quot;" />
+        <Key
+            android:codes="39"
+            android:keyLabel="\&apos;" />
+        <Key
+            android:codes="95"
+            android:keyLabel="_" />
+        <Key
+            android:codes="38"
+            android:keyEdgeFlags="right"
+            android:keyLabel="&amp;" />
+    </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="&lt;" />
+        <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;
+    }
+}
+