From 15c99e9f1a7776b95325d36cf9e38b6d674e483b Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Mon, 30 Jan 2012 11:14:45 +0900
Subject: [PATCH] Support addtionalMoreKeys

This change also removes
  * Unused more_keys_for_q, w, and p.

Change-Id: Idb99e5f6d8c2ad2d28437f42b35b21c282cd181f
---
 .../values-ar/donottranslate-more-keys.xml    |  20 +-
 .../values-ca/donottranslate-more-keys.xml    |   8 +-
 .../values-cs/donottranslate-more-keys.xml    |  14 +-
 .../values-da/donottranslate-more-keys.xml    |  10 +-
 .../donottranslate-more-keys.xml              |  23 --
 .../values-de/donottranslate-more-keys.xml    |   8 +-
 .../values-en/donottranslate-more-keys.xml    |   8 +-
 .../values-es/donottranslate-more-keys.xml    |   8 +-
 .../values-et/donottranslate-more-keys.xml    |  14 +-
 .../values-fi/donottranslate-more-keys.xml    |   4 +-
 .../donottranslate-more-keys.xml              |  25 ---
 .../donottranslate-more-keys.xml              |  26 ---
 .../values-fr/donottranslate-more-keys.xml    |  15 +-
 .../values-hr/donottranslate-more-keys.xml    |   2 +-
 .../values-hu/donottranslate-more-keys.xml    |  10 +-
 .../values-it/donottranslate-more-keys.xml    |   8 +-
 .../values-ky/donottranslate-more-keys.xml    |   4 +-
 .../values-lt/donottranslate-more-keys.xml    |  14 +-
 .../values-lv/donottranslate-more-keys.xml    |  14 +-
 .../values-nb/donottranslate-more-keys.xml    |   6 +-
 .../values-nl/donottranslate-more-keys.xml    |   8 +-
 .../values-pl/donottranslate-more-keys.xml    |   4 +-
 .../values-pt/donottranslate-more-keys.xml    |   8 +-
 .../values-rm/donottranslate-more-keys.xml    |   2 +-
 .../values-ro/donottranslate-more-keys.xml    |   4 +-
 .../values-ru/donottranslate-more-keys.xml    |   2 +-
 .../values-sk/donottranslate-more-keys.xml    |  14 +-
 .../values-sv/donottranslate-more-keys.xml    |   6 +-
 java/res/values-sw600dp/config.xml            |   1 -
 java/res/values-sw768dp/config.xml            |   1 -
 .../values-tr/donottranslate-more-keys.xml    |   6 +-
 .../values-vi/donottranslate-more-keys.xml    |  10 +-
 java/res/values/attrs.xml                     |   6 +
 java/res/values/config.xml                    |   1 -
 java/res/values/donottranslate-more-keys.xml  |  33 +--
 java/res/xml-sw600dp/row_qwerty1.xml          |   9 +-
 java/res/xml-sw600dp/rows_azerty.xml          |   7 +-
 java/res/xml-sw600dp/rows_qwertz.xml          |   9 +-
 java/res/xml-sw600dp/rows_scandinavian.xml    |   9 +-
 java/res/xml-sw600dp/rows_symbols.xml         |  10 +
 java/res/xml-sw768dp/row_qwerty1.xml          |   9 +-
 java/res/xml-sw768dp/rows_azerty.xml          |   9 +-
 java/res/xml-sw768dp/rows_qwertz.xml          |   9 +-
 java/res/xml-sw768dp/rows_scandinavian.xml    |   9 +-
 java/res/xml-sw768dp/rows_symbols.xml         |  10 +
 java/res/xml/row_qwerty1.xml                  |  13 +-
 java/res/xml/rows_arabic.xml                  |  24 +-
 java/res/xml/rows_azerty.xml                  |  17 +-
 java/res/xml/rows_bulgarian.xml               |  21 +-
 java/res/xml/rows_qwertz.xml                  |  13 +-
 java/res/xml/rows_scandinavian.xml            |  13 +-
 java/res/xml/rows_serbian.xml                 |  20 +-
 java/res/xml/rows_slavic.xml                  |  17 +-
 java/res/xml/rows_symbols.xml                 |  10 +
 .../com/android/inputmethod/keyboard/Key.java |  15 +-
 .../keyboard/internal/KeyStyles.java          |   1 +
 .../keyboard/internal/MoreKeySpecParser.java  | 111 +++++----
 .../internal/MoreKeySpecParserTests.java      | 210 ++++++++++++++++++
 58 files changed, 566 insertions(+), 356 deletions(-)
 delete mode 100644 java/res/values-de-rZZ/donottranslate-more-keys.xml
 delete mode 100644 java/res/values-fr-rCA/donottranslate-more-keys.xml
 delete mode 100644 java/res/values-fr-rCH/donottranslate-more-keys.xml

diff --git a/java/res/values-ar/donottranslate-more-keys.xml b/java/res/values-ar/donottranslate-more-keys.xml
index e49677adb7..6a14a3c55e 100644
--- a/java/res/values-ar/donottranslate-more-keys.xml
+++ b/java/res/values-ar/donottranslate-more-keys.xml
@@ -50,18 +50,18 @@
     <string name="keylabel_for_symbols_8">"Ù¨"</string>
     <string name="keylabel_for_symbols_9">"Ù©"</string>
     <string name="keylabel_for_symbols_0">"Ù "</string>
-    <string name="more_keys_for_symbols_1">1</string>
-    <string name="more_keys_for_symbols_2">2</string>
-    <string name="more_keys_for_symbols_3">3</string>
-    <string name="more_keys_for_symbols_4">4</string>
-    <string name="more_keys_for_symbols_5">5</string>
-    <string name="more_keys_for_symbols_6">6</string>
-    <string name="more_keys_for_symbols_7">7</string>
-    <string name="more_keys_for_symbols_8">8</string>
-    <string name="more_keys_for_symbols_9">9</string>
+    <string name="additional_more_keys_for_symbols_1">1</string>
+    <string name="additional_more_keys_for_symbols_2">2</string>
+    <string name="additional_more_keys_for_symbols_3">3</string>
+    <string name="additional_more_keys_for_symbols_4">4</string>
+    <string name="additional_more_keys_for_symbols_5">5</string>
+    <string name="additional_more_keys_for_symbols_6">6</string>
+    <string name="additional_more_keys_for_symbols_7">7</string>
+    <string name="additional_more_keys_for_symbols_8">8</string>
+    <string name="additional_more_keys_for_symbols_9">9</string>
     <!-- \u066b: ARABIC DECIMAL SEPARATOR
          \u066c: ARABIC THOUSANDS SEPARATOR -->
-    <string name="more_keys_for_symbols_0">0,\u066b,\u066c</string>
+    <string name="additional_more_keys_for_symbols_0">0,\u066b,\u066c</string>
     <string name="keylabel_for_comma">\u060c</string>
     <string name="keylabel_for_f1">\u060c</string>
     <string name="keylabel_for_symbols_question">\u061f</string>
diff --git a/java/res/values-ca/donottranslate-more-keys.xml b/java/res/values-ca/donottranslate-more-keys.xml
index bd9fb7ccda..512a861106 100644
--- a/java/res/values-ca/donottranslate-more-keys.xml
+++ b/java/res/values-ca/donottranslate-more-keys.xml
@@ -19,10 +19,10 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">à,á,ä,â,ã,å,ą,æ,ā,ª</string>
-    <string name="more_keys_for_e">3,è,é,ë,ê,ę,ė,ē</string>
-    <string name="more_keys_for_i">8,í,ï,ì,î,į,ī</string>
-    <string name="more_keys_for_o">9,ò,ó,ö,ô,õ,ø,œ,ō,º</string>
-    <string name="more_keys_for_u">7,ú,ü,ù,û,ū</string>
+    <string name="more_keys_for_e">è,é,ë,ê,ę,ė,ē</string>
+    <string name="more_keys_for_i">í,ï,ì,î,į,ī</string>
+    <string name="more_keys_for_o">ò,ó,ö,ô,õ,ø,œ,ō,º</string>
+    <string name="more_keys_for_u">ú,ü,ù,û,ū</string>
     <string name="more_keys_for_n">ñ,ń</string>
     <string name="more_keys_for_c">ç,ć,č</string>
     <string name="more_keys_for_l">Å€,Å‚</string>
diff --git a/java/res/values-cs/donottranslate-more-keys.xml b/java/res/values-cs/donottranslate-more-keys.xml
index 70b3f3ee7a..3701adb1b7 100644
--- a/java/res/values-cs/donottranslate-more-keys.xml
+++ b/java/res/values-cs/donottranslate-more-keys.xml
@@ -19,16 +19,16 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">á,à,â,ä,æ,ã,å,ā</string>
-    <string name="more_keys_for_e">3,é,ě,è,ê,ë,ę,ė,ē</string>
-    <string name="more_keys_for_i">8,í,î,ï,ì,į,ī</string>
-    <string name="more_keys_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string>
-    <string name="more_keys_for_u">7,ú,ů,û,ü,ù,ū</string>
+    <string name="more_keys_for_e">é,ě,è,ê,ë,ę,ė,ē</string>
+    <string name="more_keys_for_i">í,î,ï,ì,į,ī</string>
+    <string name="more_keys_for_o">ó,ö,ô,ò,õ,œ,ø,ō</string>
+    <string name="more_keys_for_u">ú,ů,û,ü,ù,ū</string>
     <string name="more_keys_for_s">š,ß,ś</string>
     <string name="more_keys_for_n">ň,ñ,ń</string>
     <string name="more_keys_for_c">č,ç,ć</string>
     <string name="more_keys_for_y">ý,ÿ</string>
     <string name="more_keys_for_d">ď</string>
-    <string name="more_keys_for_r">4,Å™</string>
-    <string name="more_keys_for_t">5,Å¥</string>
-    <string name="more_keys_for_z">6,ž,ź,ż</string>
+    <string name="more_keys_for_r">Å™</string>
+    <string name="more_keys_for_t">Å¥</string>
+    <string name="more_keys_for_z">ž,ź,ż</string>
 </resources>
diff --git a/java/res/values-da/donottranslate-more-keys.xml b/java/res/values-da/donottranslate-more-keys.xml
index bed034d40b..b1c8d20720 100644
--- a/java/res/values-da/donottranslate-more-keys.xml
+++ b/java/res/values-da/donottranslate-more-keys.xml
@@ -19,13 +19,13 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">á,ä,à,â,ã,ā</string>
-    <string name="more_keys_for_e">3,é,ë</string>
-    <string name="more_keys_for_i">8,í,ï</string>
-    <string name="more_keys_for_o">9,ó,ô,ò,õ,œ,ō</string>
-    <string name="more_keys_for_u">7,ú,ü,û,ù,ū</string>
+    <string name="more_keys_for_e">é,ë</string>
+    <string name="more_keys_for_i">í,ï</string>
+    <string name="more_keys_for_o">ó,ô,ò,õ,œ,ō</string>
+    <string name="more_keys_for_u">ú,ü,û,ù,ū</string>
     <string name="more_keys_for_s">ß,ś,š</string>
     <string name="more_keys_for_n">ñ,ń</string>
-    <string name="more_keys_for_y">6,ý,ÿ</string>
+    <string name="more_keys_for_y">ý,ÿ</string>
     <string name="more_keys_for_d">ð</string>
     <string name="more_keys_for_l">Å‚</string>
     <string name="keylabel_for_scandinavia_row1_11">Ã¥</string>
diff --git a/java/res/values-de-rZZ/donottranslate-more-keys.xml b/java/res/values-de-rZZ/donottranslate-more-keys.xml
deleted file mode 100644
index e7ec5e152b..0000000000
--- a/java/res/values-de-rZZ/donottranslate-more-keys.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2011, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT 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">
-    <string name="more_keys_for_y">6</string>
-    <string name="more_keys_for_z"></string>
-</resources>
diff --git a/java/res/values-de/donottranslate-more-keys.xml b/java/res/values-de/donottranslate-more-keys.xml
index 80aa32ae2a..48462c59d8 100644
--- a/java/res/values-de/donottranslate-more-keys.xml
+++ b/java/res/values-de/donottranslate-more-keys.xml
@@ -19,11 +19,9 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">ä,â,à,á,æ,ã,å,ā</string>
-    <string name="more_keys_for_e">3,Ä—</string>
-    <string name="more_keys_for_o">9,ö,ô,ò,ó,õ,œ,ø,ō</string>
-    <string name="more_keys_for_u">7,ü,û,ù,ú,ū</string>
+    <string name="more_keys_for_e">Ä—</string>
+    <string name="more_keys_for_o">ö,ô,ò,ó,õ,œ,ø,ō</string>
+    <string name="more_keys_for_u">ü,û,ù,ú,ū</string>
     <string name="more_keys_for_s">ß,ś,š</string>
     <string name="more_keys_for_n">ñ,ń</string>
-    <string name="more_keys_for_y"></string>
-    <string name="more_keys_for_z">6</string>
 </resources>
diff --git a/java/res/values-en/donottranslate-more-keys.xml b/java/res/values-en/donottranslate-more-keys.xml
index bc26c6aa0c..9073d3b4f4 100644
--- a/java/res/values-en/donottranslate-more-keys.xml
+++ b/java/res/values-en/donottranslate-more-keys.xml
@@ -19,11 +19,11 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">à,á,â,ä,æ,ã,å,ā</string>
-    <string name="more_keys_for_e">3,è,é,ê,ë,ē</string>
-    <string name="more_keys_for_i">8,î,ï,í,ī,ì</string>
-    <string name="more_keys_for_o">9,ô,ö,ò,ó,œ,ø,ō,õ</string>
+    <string name="more_keys_for_e">è,é,ê,ë,ē</string>
+    <string name="more_keys_for_i">î,ï,í,ī,ì</string>
+    <string name="more_keys_for_o">ô,ö,ò,ó,œ,ø,ō,õ</string>
     <string name="more_keys_for_s">ß</string>
-    <string name="more_keys_for_u">7,û,ü,ù,ú,ū</string>
+    <string name="more_keys_for_u">û,ü,ù,ú,ū</string>
     <string name="more_keys_for_n">ñ</string>
     <string name="more_keys_for_c">ç</string>
 </resources>
diff --git a/java/res/values-es/donottranslate-more-keys.xml b/java/res/values-es/donottranslate-more-keys.xml
index d5a8ed19d7..4292736473 100644
--- a/java/res/values-es/donottranslate-more-keys.xml
+++ b/java/res/values-es/donottranslate-more-keys.xml
@@ -19,10 +19,10 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">á,à,ä,â,ã,å,ą,æ,ā,ª</string>
-    <string name="more_keys_for_e">3,é,è,ë,ê,ę,ė,ē</string>
-    <string name="more_keys_for_i">8,í,ï,ì,î,į,ī</string>
-    <string name="more_keys_for_o">9,ó,ò,ö,ô,õ,ø,œ,ō,º</string>
-    <string name="more_keys_for_u">7,ú,ü,ù,û,ū</string>
+    <string name="more_keys_for_e">é,è,ë,ê,ę,ė,ē</string>
+    <string name="more_keys_for_i">í,ï,ì,î,į,ī</string>
+    <string name="more_keys_for_o">ó,ò,ö,ô,õ,ø,œ,ō,º</string>
+    <string name="more_keys_for_u">ú,ü,ù,û,ū</string>
     <string name="more_keys_for_n">ñ,ń</string>
     <string name="more_keys_for_c">ç,ć,č</string>
     <string name="more_keys_for_punctuation">"\\,,\?,!,¿,¡,:,-,\',\",),(,/,;,+,&amp;,\@"</string>
diff --git a/java/res/values-et/donottranslate-more-keys.xml b/java/res/values-et/donottranslate-more-keys.xml
index 1011347cd5..bda22fcec6 100644
--- a/java/res/values-et/donottranslate-more-keys.xml
+++ b/java/res/values-et/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">ä,ā,à,á,â,ã,å,æ,ą</string>
-    <string name="more_keys_for_e">3,ē,è,ė,é,ê,ë,ę,ě</string>
-    <string name="more_keys_for_i">8,ī,ì,į,í,î,ï,ı</string>
-    <string name="more_keys_for_o">9,ö,õ,ò,ó,ô,œ,ő,ø</string>
-    <string name="more_keys_for_u">7,ü,ū,ų,ù,ú,û,ů,ű</string>
+    <string name="more_keys_for_e">ē,è,ė,é,ê,ë,ę,ě</string>
+    <string name="more_keys_for_i">ī,ì,į,í,î,ï,ı</string>
+    <string name="more_keys_for_o">ö,õ,ò,ó,ô,œ,ő,ø</string>
+    <string name="more_keys_for_u">ü,ū,ų,ù,ú,û,ů,ű</string>
     <string name="more_keys_for_s">š,ß,ś,ş</string>
     <string name="more_keys_for_n">ņ,ñ,ń,ń</string>
     <string name="more_keys_for_c">č,ç,ć</string>
-    <string name="more_keys_for_y">6,ý,ÿ</string>
+    <string name="more_keys_for_y">ý,ÿ</string>
     <string name="more_keys_for_d">ď</string>
-    <string name="more_keys_for_r">4,Å—,Å™,Å•</string>
-    <string name="more_keys_for_t">5,Å£,Å¥</string>
+    <string name="more_keys_for_r">Å—,Å™,Å•</string>
+    <string name="more_keys_for_t">Å£,Å¥</string>
     <string name="more_keys_for_z">ž,ż,ź</string>
     <string name="more_keys_for_k">Ä·</string>
     <string name="more_keys_for_l">ļ,ł,ĺ,ľ</string>
diff --git a/java/res/values-fi/donottranslate-more-keys.xml b/java/res/values-fi/donottranslate-more-keys.xml
index e1dfa2bcf6..b922fe21d9 100644
--- a/java/res/values-fi/donottranslate-more-keys.xml
+++ b/java/res/values-fi/donottranslate-more-keys.xml
@@ -19,8 +19,8 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">æ,à,á,â,ã,ā</string>
-    <string name="more_keys_for_o">9,ø,ô,ò,ó,õ,œ,ō</string>
-    <string name="more_keys_for_u">7,ü</string>
+    <string name="more_keys_for_o">ø,ô,ò,ó,õ,œ,ō</string>
+    <string name="more_keys_for_u">ü</string>
     <string name="more_keys_for_s">š,ß,ś</string>
     <string name="more_keys_for_z">ž,ź,ż</string>
     <string name="keylabel_for_scandinavia_row1_11">Ã¥</string>
diff --git a/java/res/values-fr-rCA/donottranslate-more-keys.xml b/java/res/values-fr-rCA/donottranslate-more-keys.xml
deleted file mode 100644
index 80e9d93460..0000000000
--- a/java/res/values-fr-rCA/donottranslate-more-keys.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2011, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT 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">
-    <string name="more_keys_for_a">à,â,æ,á,ä,ã,å,ā,ª</string>
-    <string name="more_keys_for_q">1</string>
-    <string name="more_keys_for_w">2</string>
-    <string name="more_keys_for_z"></string>
-</resources>
diff --git a/java/res/values-fr-rCH/donottranslate-more-keys.xml b/java/res/values-fr-rCH/donottranslate-more-keys.xml
deleted file mode 100644
index 561c5e52f1..0000000000
--- a/java/res/values-fr-rCH/donottranslate-more-keys.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2011, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT 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">
-    <string name="more_keys_for_a">à,â,æ,á,ä,ã,å,ā,ª</string>
-    <string name="more_keys_for_y">ÿ</string>
-    <string name="more_keys_for_q">1</string>
-    <string name="more_keys_for_w">2</string>
-    <string name="more_keys_for_z">6</string>
-</resources>
diff --git a/java/res/values-fr/donottranslate-more-keys.xml b/java/res/values-fr/donottranslate-more-keys.xml
index cd6d49bada..0f78e7cd99 100644
--- a/java/res/values-fr/donottranslate-more-keys.xml
+++ b/java/res/values-fr/donottranslate-more-keys.xml
@@ -18,14 +18,11 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="more_keys_for_a">à,â,1,æ,á,ä,ã,å,ā,ª</string>
-    <string name="more_keys_for_e">é,è,ê,ë,3,ę,ė,ē</string>
-    <string name="more_keys_for_i">î,8,ï,ì,í,į,ī</string>
-    <string name="more_keys_for_o">ô,œ,9,ö,ò,ó,õ,ø,ō,º</string>
-    <string name="more_keys_for_u">ù,û,7,ü,ú,ū</string>
+    <string name="more_keys_for_a">à,â,%,æ,á,ä,ã,å,ā,ª</string>
+    <string name="more_keys_for_e">é,è,ê,ë,%,ę,ė,ē</string>
+    <string name="more_keys_for_i">î,%,ï,ì,í,į,ī</string>
+    <string name="more_keys_for_o">ô,œ,%,ö,ò,ó,õ,ø,ō,º</string>
+    <string name="more_keys_for_u">ù,û,%,ü,ú,ū</string>
     <string name="more_keys_for_c">ç,ć,č</string>
-    <string name="more_keys_for_y">6,ÿ</string>
-    <string name="more_keys_for_q"></string>
-    <string name="more_keys_for_w"></string>
-    <string name="more_keys_for_z">2</string>
+    <string name="more_keys_for_y">%,ÿ</string>
 </resources>
diff --git a/java/res/values-hr/donottranslate-more-keys.xml b/java/res/values-hr/donottranslate-more-keys.xml
index c34e0e6466..112c444c30 100644
--- a/java/res/values-hr/donottranslate-more-keys.xml
+++ b/java/res/values-hr/donottranslate-more-keys.xml
@@ -21,7 +21,7 @@
     <string name="more_keys_for_s">š,ś,ß</string>
     <string name="more_keys_for_n">ñ,ń</string>
     <string name="more_keys_for_y"></string>
-    <string name="more_keys_for_z">6,ž,ź,ż</string>
+    <string name="more_keys_for_z">ž,ź,ż</string>
     <string name="more_keys_for_c">č,ć,ç</string>
     <string name="more_keys_for_d">Ä‘</string>
 </resources>
diff --git a/java/res/values-hu/donottranslate-more-keys.xml b/java/res/values-hu/donottranslate-more-keys.xml
index 42b330199e..cc23dff48b 100644
--- a/java/res/values-hu/donottranslate-more-keys.xml
+++ b/java/res/values-hu/donottranslate-more-keys.xml
@@ -19,10 +19,8 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">á,à,â,ä,æ,ã,å,ā</string>
-    <string name="more_keys_for_e">3,é,è,ê,ë,ę,ė,ē</string>
-    <string name="more_keys_for_i">8,í,î,ï,ì,į,ī</string>
-    <string name="more_keys_for_o">9,ó,ö,ő,ô,ò,õ,œ,ø,ō</string>
-    <string name="more_keys_for_u">7,ú,ü,ű,û,ù,ū</string>
-    <string name="more_keys_for_y"></string>
-    <string name="more_keys_for_z">6</string>
+    <string name="more_keys_for_e">é,è,ê,ë,ę,ė,ē</string>
+    <string name="more_keys_for_i">í,î,ï,ì,į,ī</string>
+    <string name="more_keys_for_o">ó,ö,ő,ô,ò,õ,œ,ø,ō</string>
+    <string name="more_keys_for_u">ú,ü,ű,û,ù,ū</string>
 </resources>
diff --git a/java/res/values-it/donottranslate-more-keys.xml b/java/res/values-it/donottranslate-more-keys.xml
index fa1537becf..69659a3893 100644
--- a/java/res/values-it/donottranslate-more-keys.xml
+++ b/java/res/values-it/donottranslate-more-keys.xml
@@ -19,8 +19,8 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">à,á,â,ä,æ,ã,å,ā,ª</string>
-    <string name="more_keys_for_e">3,è,é,ê,ë,ę,ė,ē</string>
-    <string name="more_keys_for_i">8,ì,í,î,ï,į,ī</string>
-    <string name="more_keys_for_o">9,ò,ó,ô,ö,õ,œ,ø,ō,º</string>
-    <string name="more_keys_for_u">7,ù,ú,û,ü,ū</string>
+    <string name="more_keys_for_e">è,é,ê,ë,ę,ė,ē</string>
+    <string name="more_keys_for_i">ì,í,î,ï,į,ī</string>
+    <string name="more_keys_for_o">ò,ó,ô,ö,õ,œ,ø,ō,º</string>
+    <string name="more_keys_for_u">ù,ú,û,ü,ū</string>
 </resources>
diff --git a/java/res/values-ky/donottranslate-more-keys.xml b/java/res/values-ky/donottranslate-more-keys.xml
index d56cde5771..44720aa7f5 100644
--- a/java/res/values-ky/donottranslate-more-keys.xml
+++ b/java/res/values-ky/donottranslate-more-keys.xml
@@ -18,7 +18,7 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="more_keys_for_slavic_u">3,Ò¯</string>
-    <string name="more_keys_for_slavic_en">6,Ò£</string>
+    <string name="more_keys_for_slavic_u">Ò¯</string>
+    <string name="more_keys_for_slavic_en">Ò£</string>
     <string name="more_keys_for_slavic_o">Ó©</string>
 </resources>
diff --git a/java/res/values-lt/donottranslate-more-keys.xml b/java/res/values-lt/donottranslate-more-keys.xml
index e36ce6a66e..fc6c84b2df 100644
--- a/java/res/values-lt/donottranslate-more-keys.xml
+++ b/java/res/values-lt/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">ą,ä,ā,à,á,â,ã,å,æ</string>
-    <string name="more_keys_for_e">3,ė,ę,ē,è,é,ê,ë,ě</string>
-    <string name="more_keys_for_i">8,į,ī,ì,í,î,ï,ı</string>
-    <string name="more_keys_for_o">9,ö,õ,ò,ó,ô,œ,ő,ø</string>
-    <string name="more_keys_for_u">7,ū,ų,ü,ū,ù,ú,û,ů,ű</string>
+    <string name="more_keys_for_e">ė,ę,ē,è,é,ê,ë,ě</string>
+    <string name="more_keys_for_i">į,ī,ì,í,î,ï,ı</string>
+    <string name="more_keys_for_o">ö,õ,ò,ó,ô,œ,ő,ø</string>
+    <string name="more_keys_for_u">ū,ų,ü,ū,ù,ú,û,ů,ű</string>
     <string name="more_keys_for_s">š,ß,ś,ş</string>
     <string name="more_keys_for_n">ņ,ñ,ń,ń</string>
     <string name="more_keys_for_c">č,ç,ć</string>
-    <string name="more_keys_for_y">6,ý,ÿ</string>
+    <string name="more_keys_for_y">ý,ÿ</string>
     <string name="more_keys_for_d">ď</string>
-    <string name="more_keys_for_r">4,Å—,Å™,Å•</string>
-    <string name="more_keys_for_t">5,Å£,Å¥</string>
+    <string name="more_keys_for_r">Å—,Å™,Å•</string>
+    <string name="more_keys_for_t">Å£,Å¥</string>
     <string name="more_keys_for_z">ž,ż,ź</string>
     <string name="more_keys_for_k">Ä·</string>
     <string name="more_keys_for_l">ļ,ł,ĺ,ľ</string>
diff --git a/java/res/values-lv/donottranslate-more-keys.xml b/java/res/values-lv/donottranslate-more-keys.xml
index 8514e738d2..3b937dfe3d 100644
--- a/java/res/values-lv/donottranslate-more-keys.xml
+++ b/java/res/values-lv/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">ā,à,á,â,ã,ä,å,æ,ą</string>
-    <string name="more_keys_for_e">3,ē,ė,è,é,ê,ë,ę,ě</string>
-    <string name="more_keys_for_i">8,ī,į,ì,í,î,ï,ı</string>
-    <string name="more_keys_for_o">9,ò,ó,ô,õ,ö,œ,ő,ø</string>
-    <string name="more_keys_for_u">7,ū,ų,ù,ú,û,ü,ů,ű</string>
+    <string name="more_keys_for_e">ē,ė,è,é,ê,ë,ę,ě</string>
+    <string name="more_keys_for_i">ī,į,ì,í,î,ï,ı</string>
+    <string name="more_keys_for_o">ò,ó,ô,õ,ö,œ,ő,ø</string>
+    <string name="more_keys_for_u">ū,ų,ù,ú,û,ü,ů,ű</string>
     <string name="more_keys_for_s">š,ß,ś,ş</string>
     <string name="more_keys_for_n">ņ,ñ,ń,ń</string>
     <string name="more_keys_for_c">č,ç,ć</string>
-    <string name="more_keys_for_y">6,ý,ÿ</string>
+    <string name="more_keys_for_y">ý,ÿ</string>
     <string name="more_keys_for_d">ď</string>
-    <string name="more_keys_for_r">4,Å—,Å™,Å•</string>
-    <string name="more_keys_for_t">5,Å£,Å¥</string>
+    <string name="more_keys_for_r">Å—,Å™,Å•</string>
+    <string name="more_keys_for_t">Å£,Å¥</string>
     <string name="more_keys_for_z">ž,ż,ź</string>
     <string name="more_keys_for_k">Ä·</string>
     <string name="more_keys_for_l">ļ,ł,ĺ,ľ</string>
diff --git a/java/res/values-nb/donottranslate-more-keys.xml b/java/res/values-nb/donottranslate-more-keys.xml
index e83d6b7688..cf6e4d1ce3 100644
--- a/java/res/values-nb/donottranslate-more-keys.xml
+++ b/java/res/values-nb/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">à,ä,á,â,ã,ā</string>
-    <string name="more_keys_for_e">3,é,è,ê,ë,ę,ė,ē</string>
-    <string name="more_keys_for_o">9,ô,ò,ó,ö,õ,œ,ō</string>
-    <string name="more_keys_for_u">7,ü,û,ù,ú,ū</string>
+    <string name="more_keys_for_e">é,è,ê,ë,ę,ė,ē</string>
+    <string name="more_keys_for_o">ô,ò,ó,ö,õ,œ,ō</string>
+    <string name="more_keys_for_u">ü,û,ù,ú,ū</string>
     <string name="keylabel_for_scandinavia_row1_11">Ã¥</string>
     <string name="keylabel_for_scandinavia_row2_10">ø</string>
     <string name="keylabel_for_scandinavia_row2_11">æ</string>
diff --git a/java/res/values-nl/donottranslate-more-keys.xml b/java/res/values-nl/donottranslate-more-keys.xml
index 49cc419642..ac03872f33 100644
--- a/java/res/values-nl/donottranslate-more-keys.xml
+++ b/java/res/values-nl/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">á,ä,â,à,æ,ã,å,ā</string>
-    <string name="more_keys_for_e">3,é,ë,ê,è,ę,ė,ē</string>
-    <string name="more_keys_for_i">8,í,ï,ì,î,į,ī</string>
-    <string name="more_keys_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string>
-    <string name="more_keys_for_u">7,ú,ü,û,ù,ū</string>
+    <string name="more_keys_for_e">é,ë,ê,è,ę,ė,ē</string>
+    <string name="more_keys_for_i">í,ï,ì,î,į,ī</string>
+    <string name="more_keys_for_o">ó,ö,ô,ò,õ,œ,ø,ō</string>
+    <string name="more_keys_for_u">ú,ü,û,ù,ū</string>
     <string name="more_keys_for_n">ñ,ń</string>
 </resources>
diff --git a/java/res/values-pl/donottranslate-more-keys.xml b/java/res/values-pl/donottranslate-more-keys.xml
index 18e1499917..84e74e8496 100644
--- a/java/res/values-pl/donottranslate-more-keys.xml
+++ b/java/res/values-pl/donottranslate-more-keys.xml
@@ -19,8 +19,8 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">ą,á,à,â,ä,æ,ã,å,ā</string>
-    <string name="more_keys_for_e">3,ę,è,é,ê,ë,ė,ē</string>
-    <string name="more_keys_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string>
+    <string name="more_keys_for_e">ę,è,é,ê,ë,ė,ē</string>
+    <string name="more_keys_for_o">ó,ö,ô,ò,õ,œ,ø,ō</string>
     <string name="more_keys_for_s">ś,ß,š</string>
     <string name="more_keys_for_n">ń,ñ</string>
     <string name="more_keys_for_c">ć,ç,č</string>
diff --git a/java/res/values-pt/donottranslate-more-keys.xml b/java/res/values-pt/donottranslate-more-keys.xml
index 31d9417ab6..868fe7824f 100644
--- a/java/res/values-pt/donottranslate-more-keys.xml
+++ b/java/res/values-pt/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">á,ã,à,â,ä,å,æ,ª</string>
-    <string name="more_keys_for_e">3,é,ê,è,ę,ė,ē,ë</string>
-    <string name="more_keys_for_i">8,í,î,ì,ï,į,ī</string>
-    <string name="more_keys_for_o">9,ó,õ,ô,ò,ö,œ,ø,ō,º</string>
-    <string name="more_keys_for_u">7,ú,ü,ù,û,ū</string>
+    <string name="more_keys_for_e">é,ê,è,ę,ė,ē,ë</string>
+    <string name="more_keys_for_i">í,î,ì,ï,į,ī</string>
+    <string name="more_keys_for_o">ó,õ,ô,ò,ö,œ,ø,ō,º</string>
+    <string name="more_keys_for_u">ú,ü,ù,û,ū</string>
     <string name="more_keys_for_c">ç,č,ć</string>
 </resources>
diff --git a/java/res/values-rm/donottranslate-more-keys.xml b/java/res/values-rm/donottranslate-more-keys.xml
index ea9a559447..c40c29b13e 100644
--- a/java/res/values-rm/donottranslate-more-keys.xml
+++ b/java/res/values-rm/donottranslate-more-keys.xml
@@ -18,5 +18,5 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="more_keys_for_o">9,ò,ó,ö,ô,õ,œ,ø</string>
+    <string name="more_keys_for_o">ò,ó,ö,ô,õ,œ,ø</string>
 </resources>
diff --git a/java/res/values-ro/donottranslate-more-keys.xml b/java/res/values-ro/donottranslate-more-keys.xml
index 51df560995..42fd913363 100644
--- a/java/res/values-ro/donottranslate-more-keys.xml
+++ b/java/res/values-ro/donottranslate-more-keys.xml
@@ -19,7 +19,7 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">â,ã,ă,à,á,ä,æ,å,ā</string>
-    <string name="more_keys_for_i">8,î,ï,ì,í,į,ī</string>
+    <string name="more_keys_for_i">î,ï,ì,í,į,ī</string>
     <string name="more_keys_for_s">ș,ß,ś,š</string>
-    <string name="more_keys_for_t">5,È›</string>
+    <string name="more_keys_for_t">È›</string>
 </resources>
diff --git a/java/res/values-ru/donottranslate-more-keys.xml b/java/res/values-ru/donottranslate-more-keys.xml
index 7ae9ffbdac..b7e74660db 100644
--- a/java/res/values-ru/donottranslate-more-keys.xml
+++ b/java/res/values-ru/donottranslate-more-keys.xml
@@ -18,5 +18,5 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="more_keys_for_slavic_ye">5,Ñ‘</string>
+    <string name="more_keys_for_slavic_ye">Ñ‘</string>
 </resources>
diff --git a/java/res/values-sk/donottranslate-more-keys.xml b/java/res/values-sk/donottranslate-more-keys.xml
index b6b35c1a37..574eedb1f3 100644
--- a/java/res/values-sk/donottranslate-more-keys.xml
+++ b/java/res/values-sk/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">á,ä,ā,à,â,ã,å,æ,ą</string>
-    <string name="more_keys_for_e">3,é,ě,ē,ė,è,ê,ë,ę</string>
-    <string name="more_keys_for_i">8,í,ī,į,ì,î,ï,ı</string>
-    <string name="more_keys_for_o">9,ô,ó,ö,ò,õ,œ,ő,ø</string>
-    <string name="more_keys_for_u">7,ú,ů,ü,ū,ų,ù,û,ű</string>
+    <string name="more_keys_for_e">é,ě,ē,ė,è,ê,ë,ę</string>
+    <string name="more_keys_for_i">í,ī,į,ì,î,ï,ı</string>
+    <string name="more_keys_for_o">ô,ó,ö,ò,õ,œ,ő,ø</string>
+    <string name="more_keys_for_u">ú,ů,ü,ū,ų,ù,û,ű</string>
     <string name="more_keys_for_s">š,ß,ś,ş</string>
     <string name="more_keys_for_n">ň,ņ,ñ,ń,ń</string>
     <string name="more_keys_for_c">č,ç,ć</string>
-    <string name="more_keys_for_y">6,ý,ÿ</string>
+    <string name="more_keys_for_y">ý,ÿ</string>
     <string name="more_keys_for_d">ď</string>
-    <string name="more_keys_for_r">4,Å•,Å™,Å—</string>
-    <string name="more_keys_for_t">5,Å¥,Å£</string>
+    <string name="more_keys_for_r">Å•,Å™,Å—</string>
+    <string name="more_keys_for_t">Å¥,Å£</string>
     <string name="more_keys_for_z">ž,ż,ź</string>
     <string name="more_keys_for_k">Ä·</string>
     <string name="more_keys_for_l">ľ,ĺ,ļ,ł</string>
diff --git a/java/res/values-sv/donottranslate-more-keys.xml b/java/res/values-sv/donottranslate-more-keys.xml
index d391be5ab5..6d9800e57c 100644
--- a/java/res/values-sv/donottranslate-more-keys.xml
+++ b/java/res/values-sv/donottranslate-more-keys.xml
@@ -18,9 +18,9 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="more_keys_for_e">3,é,è,ê,ë,ę</string>
-    <string name="more_keys_for_o">9,œ,ô,ò,ó,õ,ō</string>
-    <string name="more_keys_for_u">7,ü,û,ù,ú,ū</string>
+    <string name="more_keys_for_e">é,è,ê,ë,ę</string>
+    <string name="more_keys_for_o">œ,ô,ò,ó,õ,ō</string>
+    <string name="more_keys_for_u">ü,û,ù,ú,ū</string>
     <string name="more_keys_for_s">ß,ś,š</string>
     <string name="keylabel_for_scandinavia_row1_11">Ã¥</string>
     <string name="keylabel_for_scandinavia_row2_10">ö</string>
diff --git a/java/res/values-sw600dp/config.xml b/java/res/values-sw600dp/config.xml
index 35da3009f9..40c674190d 100644
--- a/java/res/values-sw600dp/config.xml
+++ b/java/res/values-sw600dp/config.xml
@@ -24,7 +24,6 @@
     <bool name="config_enable_show_voice_key_option">false</bool>
     <bool name="config_enable_show_popup_on_keypress_option">false</bool>
     <bool name="config_enable_bigram_suggestions_option">false</bool>
-    <bool name="config_digit_more_keys_enabled">false</bool>
     <!-- Whether or not Popup on key press is enabled by default -->
     <bool name="config_default_popup_preview">false</bool>
     <bool name="config_default_sound_enabled">true</bool>
diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml
index ddeadaf0f0..98d722aba9 100644
--- a/java/res/values-sw768dp/config.xml
+++ b/java/res/values-sw768dp/config.xml
@@ -24,7 +24,6 @@
     <bool name="config_enable_show_voice_key_option">false</bool>
     <bool name="config_enable_show_popup_on_keypress_option">false</bool>
     <bool name="config_enable_bigram_suggestions_option">false</bool>
-    <bool name="config_digit_more_keys_enabled">false</bool>
     <!-- Whether or not Popup on key press is enabled by default -->
     <bool name="config_default_popup_preview">false</bool>
     <bool name="config_default_sound_enabled">true</bool>
diff --git a/java/res/values-tr/donottranslate-more-keys.xml b/java/res/values-tr/donottranslate-more-keys.xml
index 6906b35801..227ebf98c9 100644
--- a/java/res/values-tr/donottranslate-more-keys.xml
+++ b/java/res/values-tr/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">â</string>
-    <string name="more_keys_for_i">8,ı,î,ï,ì,í,į,ī</string>
-    <string name="more_keys_for_o">9,ö,ô,œ,ò,ó,õ,ø,ō</string>
-    <string name="more_keys_for_u">7,ü,û,ù,ú,ū</string>
+    <string name="more_keys_for_i">ı,î,ï,ì,í,į,ī</string>
+    <string name="more_keys_for_o">ö,ô,œ,ò,ó,õ,ø,ō</string>
+    <string name="more_keys_for_u">ü,û,ù,ú,ū</string>
     <string name="more_keys_for_s">ş,ß,ś,š</string>
     <string name="more_keys_for_g">ÄŸ</string>
     <string name="more_keys_for_c">ç,ć,č</string>
diff --git a/java/res/values-vi/donottranslate-more-keys.xml b/java/res/values-vi/donottranslate-more-keys.xml
index 97a7d79aec..9e2f6b8fde 100644
--- a/java/res/values-vi/donottranslate-more-keys.xml
+++ b/java/res/values-vi/donottranslate-more-keys.xml
@@ -19,10 +19,10 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a">à,á,ả,ã,ạ,ă,ằ,ắ,ẳ,ẵ,ặ,â,ầ,ấ,ẩ,ẫ,ậ</string>
-    <string name="more_keys_for_e">3,è,é,ẻ,ẽ,ẹ,ê,ề,ế,ể,ễ,ệ</string>
-    <string name="more_keys_for_i">8,ì,í,ỉ,ĩ,ị</string>
-    <string name="more_keys_for_o">9,ò,ó,ỏ,õ,ọ,ô,ồ,ố,ổ,ỗ,ộ,ơ,ờ,ớ,ở,ỡ,ợ</string>
-    <string name="more_keys_for_u">7,ù,ú,ủ,ũ,ụ,ư,ừ,ứ,ử,ữ,ự</string>
-    <string name="more_keys_for_y">6,ỳ,ý,ỷ,ỹ,ỵ</string>
+    <string name="more_keys_for_e">è,é,ẻ,ẽ,ẹ,ê,ề,ế,ể,ễ,ệ</string>
+    <string name="more_keys_for_i">ì,í,ỉ,ĩ,ị</string>
+    <string name="more_keys_for_o">ò,ó,ỏ,õ,ọ,ô,ồ,ố,ổ,ỗ,ộ,ơ,ờ,ớ,ở,ỡ,ợ</string>
+    <string name="more_keys_for_u">ù,ú,ủ,ũ,ụ,ư,ừ,ứ,ử,ữ,ự</string>
+    <string name="more_keys_for_y">ỳ,ý,ỷ,ỹ,ỵ</string>
     <string name="more_keys_for_d">Ä‘</string>
 </resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index bd7c550c17..8d00f7aa5e 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -227,6 +227,12 @@
         <attr name="altCode" format="integer" />
         <!-- The keys to display in the more keys keyboard. -->
         <attr name="moreKeys" format="string" />
+        <!-- The keys to display in the more keys keyboard in addition to moreKeys.
+             The additional more keys are inserted at the '%' markers in the moreKeys if any.
+             They are inserted at the head of moreKeys if none.
+             If there are remaining entries of additionalMoreKeys even after all '%' markers have
+             been replaced, those remaining entries are appended at the end of moreKeys. -->
+        <attr name="additionalMoreKeys" format="string" />
         <!-- Maximum column of more keys keyboard -->
         <attr name="maxMoreKeysColumn" format="integer" />
         <attr name="backgroundType" format="enum">
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 32041df745..c3f8edf8ae 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -27,7 +27,6 @@
     <bool name="config_enable_bigram_suggestions_option">true</bool>
     <!-- TODO: Disable the following configuration for production. -->
     <bool name="config_enable_usability_study_mode_option">true</bool>
-    <bool name="config_digit_more_keys_enabled">true</bool>
     <!-- Whether or not Popup on key press is enabled by default -->
     <bool name="config_default_popup_preview">true</bool>
     <!-- Default value for bigram suggestion: while showing suggestions for a word should we weigh
diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml
index ce1538131a..07f4bf38b2 100644
--- a/java/res/values/donottranslate-more-keys.xml
+++ b/java/res/values/donottranslate-more-keys.xml
@@ -19,24 +19,21 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_a"></string>
-    <string name="more_keys_for_e">3</string>
-    <string name="more_keys_for_i">8</string>
-    <string name="more_keys_for_o">9</string>
-    <string name="more_keys_for_u">7</string>
+    <string name="more_keys_for_e"></string>
+    <string name="more_keys_for_i"></string>
+    <string name="more_keys_for_o"></string>
+    <string name="more_keys_for_u"></string>
     <string name="more_keys_for_s"></string>
     <string name="more_keys_for_n"></string>
     <string name="more_keys_for_c"></string>
-    <string name="more_keys_for_y">6</string>
-    <string name="more_keys_for_q">1</string>
-    <string name="more_keys_for_w">2</string>
+    <string name="more_keys_for_y"></string>
     <string name="more_keys_for_d"></string>
-    <string name="more_keys_for_r">4</string>
-    <string name="more_keys_for_t">5</string>
+    <string name="more_keys_for_r"></string>
+    <string name="more_keys_for_t"></string>
     <string name="more_keys_for_z"></string>
     <string name="more_keys_for_k"></string>
     <string name="more_keys_for_l"></string>
     <string name="more_keys_for_g"></string>
-    <string name="more_keys_for_p">0</string>
     <string name="more_keys_for_v"></string>
     <string name="keylabel_for_scandinavia_row1_11"></string>
     <string name="keylabel_for_scandinavia_row2_10"></string>
@@ -46,9 +43,9 @@
     <string name="keylabel_for_slavic_shcha">щ</string>
     <string name="keylabel_for_slavic_yery">Ñ‹</string>
     <string name="keylabel_for_slavic_i">и</string>
-    <string name="more_keys_for_slavic_u">3</string>
-    <string name="more_keys_for_slavic_ye">5</string>
-    <string name="more_keys_for_slavic_en">6</string>
+    <string name="more_keys_for_slavic_u"></string>
+    <string name="more_keys_for_slavic_ye"></string>
+    <string name="more_keys_for_slavic_en"></string>
     <string name="more_keys_for_slavic_ha">ÑŠ</string>
     <string name="more_keys_for_slavic_yery"></string>
     <string name="more_keys_for_slavic_o"></string>
@@ -74,6 +71,16 @@
     <string name="keylabel_for_symbols_8">8</string>
     <string name="keylabel_for_symbols_9">9</string>
     <string name="keylabel_for_symbols_0">0</string>
+    <string name="additional_more_keys_for_symbols_1"></string>
+    <string name="additional_more_keys_for_symbols_2"></string>
+    <string name="additional_more_keys_for_symbols_3"></string>
+    <string name="additional_more_keys_for_symbols_4"></string>
+    <string name="additional_more_keys_for_symbols_5"></string>
+    <string name="additional_more_keys_for_symbols_6"></string>
+    <string name="additional_more_keys_for_symbols_7"></string>
+    <string name="additional_more_keys_for_symbols_8"></string>
+    <string name="additional_more_keys_for_symbols_9"></string>
+    <string name="additional_more_keys_for_symbols_0"></string>
     <string name="more_keys_for_symbols_1">¹,½,⅓,¼,⅛</string>
     <string name="more_keys_for_symbols_2">²,⅔</string>
     <string name="more_keys_for_symbols_3">³,¾,⅜</string>
diff --git a/java/res/xml-sw600dp/row_qwerty1.xml b/java/res/xml-sw600dp/row_qwerty1.xml
index 07d8e22967..3d3a1a8ff2 100644
--- a/java/res/xml-sw600dp/row_qwerty1.xml
+++ b/java/res/xml-sw600dp/row_qwerty1.xml
@@ -25,11 +25,9 @@
         latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="e"
             latin:moreKeys="@string/more_keys_for_e" />
@@ -52,8 +50,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyXPos="-10.0%p"
diff --git a/java/res/xml-sw600dp/rows_azerty.xml b/java/res/xml-sw600dp/rows_azerty.xml
index c9a9dab065..c29d291ea2 100644
--- a/java/res/xml-sw600dp/rows_azerty.xml
+++ b/java/res/xml-sw600dp/rows_azerty.xml
@@ -54,8 +54,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyXPos="-10.0%p"
@@ -66,7 +65,6 @@
     >
         <Key
             latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q"
             latin:keyXPos="5.0%p" />
         <Key
             latin:keyLabel="s"
@@ -103,8 +101,7 @@
             latin:keyStyle="shiftKeyStyle"
             latin:keyWidth="10.0%p" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="x" />
         <Key
diff --git a/java/res/xml-sw600dp/rows_qwertz.xml b/java/res/xml-sw600dp/rows_qwertz.xml
index fe93a705e2..6912f1c6d4 100644
--- a/java/res/xml-sw600dp/rows_qwertz.xml
+++ b/java/res/xml-sw600dp/rows_qwertz.xml
@@ -27,11 +27,9 @@
         latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="e"
             latin:moreKeys="@string/more_keys_for_e" />
@@ -54,8 +52,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyXPos="-10.0%p"
diff --git a/java/res/xml-sw600dp/rows_scandinavian.xml b/java/res/xml-sw600dp/rows_scandinavian.xml
index f334f8b5e6..5ecb7d2428 100644
--- a/java/res/xml-sw600dp/rows_scandinavian.xml
+++ b/java/res/xml-sw600dp/rows_scandinavian.xml
@@ -27,11 +27,9 @@
         latin:keyWidth="7.9%p"
     >
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="e"
             latin:moreKeys="@string/more_keys_for_e" />
@@ -54,8 +52,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyLabel="@string/keylabel_for_scandinavia_row1_11" />
         <Key
diff --git a/java/res/xml-sw600dp/rows_symbols.xml b/java/res/xml-sw600dp/rows_symbols.xml
index e345a23f7c..701c35470f 100644
--- a/java/res/xml-sw600dp/rows_symbols.xml
+++ b/java/res/xml-sw600dp/rows_symbols.xml
@@ -30,33 +30,43 @@
     >
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_1"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_1"
             latin:moreKeys="@string/more_keys_for_symbols_1" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_2"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_2"
             latin:moreKeys="@string/more_keys_for_symbols_2" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_3"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_3"
             latin:moreKeys="@string/more_keys_for_symbols_3" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_4"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_4"
             latin:moreKeys="@string/more_keys_for_symbols_4" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_5"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_5"
             latin:moreKeys="@string/more_keys_for_symbols_5" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_6"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_6"
             latin:moreKeys="@string/more_keys_for_symbols_6" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_7"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_7"
             latin:moreKeys="@string/more_keys_for_symbols_7" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_8"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_8"
             latin:moreKeys="@string/more_keys_for_symbols_8" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_9"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_9"
             latin:moreKeys="@string/more_keys_for_symbols_9" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_0"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_0"
             latin:moreKeys="@string/more_keys_for_symbols_0" />
         <Key
             latin:keyStyle="deleteKeyStyle"
diff --git a/java/res/xml-sw768dp/row_qwerty1.xml b/java/res/xml-sw768dp/row_qwerty1.xml
index de91013319..f6600ad032 100644
--- a/java/res/xml-sw768dp/row_qwerty1.xml
+++ b/java/res/xml-sw768dp/row_qwerty1.xml
@@ -29,11 +29,9 @@
             latin:keyLabelFlags="alignLeft"
             latin:keyWidth="7.969%p" />
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="e"
             latin:moreKeys="@string/more_keys_for_e" />
@@ -56,8 +54,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyXPos="-9.219%p"
diff --git a/java/res/xml-sw768dp/rows_azerty.xml b/java/res/xml-sw768dp/rows_azerty.xml
index c97ac40894..066778c87b 100644
--- a/java/res/xml-sw768dp/rows_azerty.xml
+++ b/java/res/xml-sw768dp/rows_azerty.xml
@@ -58,8 +58,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyXPos="-9.219%p"
@@ -73,8 +72,7 @@
             latin:keyLabelFlags="alignLeft"
             latin:keyWidth="10.167%p" />
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
             latin:keyLabel="s"
             latin:moreKeys="@string/more_keys_for_s" />
@@ -110,8 +108,7 @@
             latin:keyStyle="shiftKeyStyle"
             latin:keyWidth="13.829%p" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="x" />
         <Key
diff --git a/java/res/xml-sw768dp/rows_qwertz.xml b/java/res/xml-sw768dp/rows_qwertz.xml
index 05a2a9c035..7056a94ea7 100644
--- a/java/res/xml-sw768dp/rows_qwertz.xml
+++ b/java/res/xml-sw768dp/rows_qwertz.xml
@@ -31,11 +31,9 @@
             latin:keyLabelFlags="alignLeft"
             latin:keyWidth="7.969%p" />
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="e"
             latin:moreKeys="@string/more_keys_for_e" />
@@ -58,8 +56,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyXPos="-9.219%p"
diff --git a/java/res/xml-sw768dp/rows_scandinavian.xml b/java/res/xml-sw768dp/rows_scandinavian.xml
index 373617bfc4..9e5ad148fb 100644
--- a/java/res/xml-sw768dp/rows_scandinavian.xml
+++ b/java/res/xml-sw768dp/rows_scandinavian.xml
@@ -31,11 +31,9 @@
             latin:keyLabelFlags="alignLeft"
             latin:keyWidth="7.500%p" />
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="e"
             latin:moreKeys="@string/more_keys_for_e" />
@@ -58,8 +56,7 @@
             latin:keyLabel="o"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
-            latin:keyLabel="p"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:keyLabel="p" />
         <Key
             latin:keyLabel="@string/keylabel_for_scandinavia_row1_11" />
         <Key
diff --git a/java/res/xml-sw768dp/rows_symbols.xml b/java/res/xml-sw768dp/rows_symbols.xml
index 820e5f7d22..7458b366a1 100644
--- a/java/res/xml-sw768dp/rows_symbols.xml
+++ b/java/res/xml-sw768dp/rows_symbols.xml
@@ -34,33 +34,43 @@
             latin:keyWidth="7.969%p" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_1"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_1"
             latin:moreKeys="@string/more_keys_for_symbols_1" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_2"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_2"
             latin:moreKeys="@string/more_keys_for_symbols_2" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_3"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_3"
             latin:moreKeys="@string/more_keys_for_symbols_3" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_4"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_4"
             latin:moreKeys="@string/more_keys_for_symbols_4" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_5"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_5"
             latin:moreKeys="@string/more_keys_for_symbols_5" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_6"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_6"
             latin:moreKeys="@string/more_keys_for_symbols_6" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_7"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_7"
             latin:moreKeys="@string/more_keys_for_symbols_7" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_8"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_8"
             latin:moreKeys="@string/more_keys_for_symbols_8" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_9"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_9"
             latin:moreKeys="@string/more_keys_for_symbols_9" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_0"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_0"
             latin:moreKeys="@string/more_keys_for_symbols_0" />
         <Key
             latin:keyStyle="deleteKeyStyle"
diff --git a/java/res/xml/row_qwerty1.xml b/java/res/xml/row_qwerty1.xml
index e8e8d1b463..cb1f4d297f 100644
--- a/java/res/xml/row_qwerty1.xml
+++ b/java/res/xml/row_qwerty1.xml
@@ -27,43 +27,50 @@
         <Key
             latin:keyLabel="q"
             latin:keyHintLabel="1"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:additionalMoreKeys="1" />
         <Key
             latin:keyLabel="w"
             latin:keyHintLabel="2"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:additionalMoreKeys="2" />
         <Key
             latin:keyLabel="e"
             latin:keyHintLabel="3"
+            latin:additionalMoreKeys="3"
             latin:moreKeys="@string/more_keys_for_e" />
         <Key
             latin:keyLabel="r"
             latin:keyHintLabel="4"
+            latin:additionalMoreKeys="4"
             latin:moreKeys="@string/more_keys_for_r" />
         <Key
             latin:keyLabel="t"
             latin:keyHintLabel="5"
+            latin:additionalMoreKeys="5"
             latin:moreKeys="@string/more_keys_for_t" />
         <Key
             latin:keyLabel="y"
             latin:keyHintLabel="6"
+            latin:additionalMoreKeys="6"
             latin:moreKeys="@string/more_keys_for_y" />
         <Key
             latin:keyLabel="u"
             latin:keyHintLabel="7"
+            latin:additionalMoreKeys="7"
             latin:moreKeys="@string/more_keys_for_u" />
         <Key
             latin:keyLabel="i"
             latin:keyHintLabel="8"
+            latin:additionalMoreKeys="8"
             latin:moreKeys="@string/more_keys_for_i" />
         <Key
             latin:keyLabel="o"
             latin:keyHintLabel="9"
+            latin:additionalMoreKeys="9"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
             latin:keyLabel="p"
             latin:keyHintLabel="0"
-            latin:moreKeys="@string/more_keys_for_p"
+            latin:additionalMoreKeys="0"
             latin:keyWidth="fillRight" />
     </Row>
 </merge>
diff --git a/java/res/xml/rows_arabic.xml b/java/res/xml/rows_arabic.xml
index dcee10ef55..2dcd831c2f 100644
--- a/java/res/xml/rows_arabic.xml
+++ b/java/res/xml/rows_arabic.xml
@@ -30,18 +30,19 @@
         <Key
             latin:keyLabel="ض"
             latin:keyHintLabel="1"
-            latin:moreKeys="1,Ù¡" />
+            latin:additionalMoreKeys="1,Ù¡" />
         <!-- \u0635: ARABIC LETTER SAD -->
         <Key
             latin:keyLabel="ص"
             latin:keyHintLabel="2"
-            latin:moreKeys="2,Ù¢" />
+            latin:additionalMoreKeys="2,Ù¢" />
         <!-- \u0642: ARABIC LETTER QAF
              \u06a8: ARABIC LETTER QAF WITH THREE DOTS ABOVE -->
         <Key
             latin:keyLabel="Ù‚"
             latin:keyHintLabel="3"
-            latin:moreKeys="3,Ù£,\u06a8" />
+            latin:additionalMoreKeys="3,Ù£"
+            latin:moreKeys="\u06a8" />
         <!-- \u0641: ARABIC LETTER FEH
              \u06a4: ARABIC LETTER VEH
              \u06a2: ARABIC LETTER FEH WITH DOT MOVED BELOW
@@ -49,40 +50,43 @@
         <Key
             latin:keyLabel="ف"
             latin:keyHintLabel="4"
-            latin:moreKeys="4,Ù¤,\u06a4,\u06a2,\u06a5" />
+            latin:additionalMoreKeys="4,Ù¤"
+            latin:moreKeys="\u06a4,\u06a2,\u06a5" />
         <!-- \u063a: ARABIC LETTER GHAIN -->
         <Key
             latin:keyLabel="غ"
             latin:keyHintLabel="5"
-            latin:moreKeys="5,Ù¥" />
+            latin:additionalMoreKeys="5,Ù¥" />
         <!-- \u0639: ARABIC LETTER AIN -->
         <Key
             latin:keyLabel="ع"
             latin:keyHintLabel="6"
-            latin:moreKeys="6,Ù¦" />
+            latin:additionalMoreKeys="6,Ù¦" />
         <!-- \u0647: ARABIC LETTER HEH
              \ufeeb: ARABIC LETTER HEH INITIAL FORM
              \u0647\u0640: ARABIC LETTER HEH + Zero width joiner -->
         <Key
             latin:keyLabel="Ù‡"
             latin:keyHintLabel="7"
-            latin:moreKeys="7,Ù§,\ufeeb|\u0647\u200D" />
+            latin:additionalMoreKeys="7,Ù§"
+            latin:moreKeys="\ufeeb|\u0647\u200D" />
         <!-- \u062e: ARABIC LETTER KHAH -->
         <Key
             latin:keyLabel="Ø®"
             latin:keyHintLabel="8"
-            latin:moreKeys="8,Ù¨" />
+            latin:additionalMoreKeys="8,Ù¨" />
         <!-- \u062d: ARABIC LETTER HAH -->
         <Key
             latin:keyLabel="Ø­"
             latin:keyHintLabel="9"
-            latin:moreKeys="9,Ù©" />
+            latin:additionalMoreKeys="9,Ù©" />
         <!-- \u062c: ARABIC LETTER JEEM
              \u0686: ARABIC LETTER TCHEH -->
         <Key
             latin:keyLabel="ج"
             latin:keyHintLabel="0"
-            latin:moreKeys="0,Ù ,\u0686"
+            latin:additionalMoreKeys="0,Ù "
+            latin:moreKeys="\u0686"
             latin:keyWidth="fillRight" />
     </Row>
     <Row
diff --git a/java/res/xml/rows_azerty.xml b/java/res/xml/rows_azerty.xml
index b7a0936b45..142ebc0a69 100644
--- a/java/res/xml/rows_azerty.xml
+++ b/java/res/xml/rows_azerty.xml
@@ -29,51 +29,59 @@
         <Key
             latin:keyLabel="a"
             latin:keyHintLabel="1"
+            latin:additionalMoreKeys="1"
             latin:moreKeys="@string/more_keys_for_a" />
         <Key
             latin:keyLabel="z"
             latin:keyHintLabel="2"
+            latin:additionalMoreKeys="2"
             latin:moreKeys="@string/more_keys_for_z" />
         <Key
             latin:keyLabel="e"
             latin:keyHintLabel="3"
+            latin:additionalMoreKeys="3"
             latin:moreKeys="@string/more_keys_for_e" />
         <Key
             latin:keyLabel="r"
             latin:keyHintLabel="4"
+            latin:additionalMoreKeys="4"
             latin:moreKeys="@string/more_keys_for_r" />
         <Key
             latin:keyLabel="t"
             latin:keyHintLabel="5"
+            latin:additionalMoreKeys="5"
             latin:moreKeys="@string/more_keys_for_t" />
         <Key
             latin:keyLabel="y"
             latin:keyHintLabel="6"
+            latin:additionalMoreKeys="6"
             latin:moreKeys="@string/more_keys_for_y" />
         <Key
             latin:keyLabel="u"
             latin:keyHintLabel="7"
+            latin:additionalMoreKeys="7"
             latin:moreKeys="@string/more_keys_for_u" />
         <Key
             latin:keyLabel="i"
             latin:keyHintLabel="8"
+            latin:additionalMoreKeys="8"
             latin:moreKeys="@string/more_keys_for_i" />
         <Key
             latin:keyLabel="o"
             latin:keyHintLabel="9"
+            latin:additionalMoreKeys="9"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
             latin:keyLabel="p"
             latin:keyHintLabel="0"
-            latin:moreKeys="@string/more_keys_for_p"
+            latin:additionalMoreKeys="0"
             latin:keyWidth="fillRight" />
     </Row>
     <Row
         latin:keyWidth="10%p"
     >
         <Key
-            latin:keyLabel="q"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:keyLabel="q" />
         <Key
             latin:keyLabel="s"
             latin:moreKeys="@string/more_keys_for_s" />
@@ -107,8 +115,7 @@
             latin:keyWidth="15%p"
             latin:visualInsetsRight="1%p" />
         <Key
-            latin:keyLabel="w"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:keyLabel="w" />
         <Key
             latin:keyLabel="x" />
         <Key
diff --git a/java/res/xml/rows_bulgarian.xml b/java/res/xml/rows_bulgarian.xml
index 9b5a5e6cfa..2eac93a7e7 100644
--- a/java/res/xml/rows_bulgarian.xml
+++ b/java/res/xml/rows_bulgarian.xml
@@ -29,43 +29,44 @@
         <Key
             latin:keyLabel="ч"
             latin:keyHintLabel="1"
-            latin:moreKeys="1" />
+            latin:additionalMoreKeys="1" />
         <Key
             latin:keyLabel="ш"
             latin:keyHintLabel="2"
-            latin:moreKeys="2" />
+            latin:additionalMoreKeys="2" />
         <Key
             latin:keyLabel="е"
             latin:keyHintLabel="3"
-            latin:moreKeys="3" />
+            latin:additionalMoreKeys="3" />
         <Key
             latin:keyLabel="Ñ€"
             latin:keyHintLabel="4"
-            latin:moreKeys="4" />
+            latin:additionalMoreKeys="4" />
         <Key
             latin:keyLabel="Ñ‚"
             latin:keyHintLabel="5"
-            latin:moreKeys="5" />
+            latin:additionalMoreKeys="5" />
         <Key
             latin:keyLabel="ÑŠ"
             latin:keyHintLabel="6"
-            latin:moreKeys="6" />
+            latin:additionalMoreKeys="6" />
         <Key
             latin:keyLabel="у"
             latin:keyHintLabel="7"
-            latin:moreKeys="7" />
+            latin:additionalMoreKeys="7" />
         <Key
             latin:keyLabel="и"
             latin:keyHintLabel="8"
-            latin:moreKeys="8,ѝ" />
+            latin:additionalMoreKeys="8"
+            latin:moreKeys="ѝ" />
         <Key
             latin:keyLabel="о"
             latin:keyHintLabel="9"
-            latin:moreKeys="9" />
+            latin:additionalMoreKeys="9" />
         <Key
             latin:keyLabel="п"
             latin:keyHintLabel="0"
-            latin:moreKeys="0" />
+            latin:additionalMoreKeys="0" />
         <Key
             latin:keyLabel="я"
             latin:keyWidth="fillRight" />
diff --git a/java/res/xml/rows_qwertz.xml b/java/res/xml/rows_qwertz.xml
index e578f9aaa7..11fd9332cd 100644
--- a/java/res/xml/rows_qwertz.xml
+++ b/java/res/xml/rows_qwertz.xml
@@ -29,43 +29,50 @@
         <Key
             latin:keyLabel="q"
             latin:keyHintLabel="1"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:additionalMoreKeys="1" />
         <Key
             latin:keyLabel="w"
             latin:keyHintLabel="2"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:additionalMoreKeys="2" />
         <Key
             latin:keyLabel="e"
             latin:keyHintLabel="3"
+            latin:additionalMoreKeys="3"
             latin:moreKeys="@string/more_keys_for_e" />
         <Key
             latin:keyLabel="r"
             latin:keyHintLabel="4"
+            latin:additionalMoreKeys="4"
             latin:moreKeys="@string/more_keys_for_r" />
         <Key
             latin:keyLabel="t"
             latin:keyHintLabel="5"
+            latin:additionalMoreKeys="5"
             latin:moreKeys="@string/more_keys_for_t" />
         <Key
             latin:keyLabel="z"
             latin:keyHintLabel="6"
+            latin:additionalMoreKeys="6"
             latin:moreKeys="@string/more_keys_for_z" />
         <Key
             latin:keyLabel="u"
             latin:keyHintLabel="7"
+            latin:additionalMoreKeys="7"
             latin:moreKeys="@string/more_keys_for_u" />
         <Key
             latin:keyLabel="i"
             latin:keyHintLabel="8"
+            latin:additionalMoreKeys="8"
             latin:moreKeys="@string/more_keys_for_i" />
         <Key
             latin:keyLabel="o"
             latin:keyHintLabel="9"
+            latin:additionalMoreKeys="9"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
             latin:keyLabel="p"
             latin:keyHintLabel="0"
-            latin:moreKeys="@string/more_keys_for_p"
+            latin:additionalMoreKeys="0"
             latin:keyWidth="fillRight" />
     </Row>
     <include
diff --git a/java/res/xml/rows_scandinavian.xml b/java/res/xml/rows_scandinavian.xml
index 2bd246b45d..f5ba96c27e 100644
--- a/java/res/xml/rows_scandinavian.xml
+++ b/java/res/xml/rows_scandinavian.xml
@@ -29,43 +29,50 @@
         <Key
             latin:keyLabel="q"
             latin:keyHintLabel="1"
-            latin:moreKeys="@string/more_keys_for_q" />
+            latin:additionalMoreKeys="1" />
         <Key
             latin:keyLabel="w"
             latin:keyHintLabel="2"
-            latin:moreKeys="@string/more_keys_for_w" />
+            latin:additionalMoreKeys="2" />
         <Key
             latin:keyLabel="e"
             latin:keyHintLabel="3"
+            latin:additionalMoreKeys="3"
             latin:moreKeys="@string/more_keys_for_e" />
         <Key
             latin:keyLabel="r"
             latin:keyHintLabel="4"
+            latin:additionalMoreKeys="4"
             latin:moreKeys="@string/more_keys_for_r" />
         <Key
             latin:keyLabel="t"
             latin:keyHintLabel="5"
+            latin:additionalMoreKeys="5"
             latin:moreKeys="@string/more_keys_for_t" />
         <Key
             latin:keyLabel="y"
             latin:keyHintLabel="6"
+            latin:additionalMoreKeys="6"
             latin:moreKeys="@string/more_keys_for_y" />
         <Key
             latin:keyLabel="u"
             latin:keyHintLabel="7"
+            latin:additionalMoreKeys="7"
             latin:moreKeys="@string/more_keys_for_u" />
         <Key
             latin:keyLabel="i"
             latin:keyHintLabel="8"
+            latin:additionalMoreKeys="8"
             latin:moreKeys="@string/more_keys_for_i" />
         <Key
             latin:keyLabel="o"
             latin:keyHintLabel="9"
+            latin:additionalMoreKeys="9"
             latin:moreKeys="@string/more_keys_for_o" />
         <Key
             latin:keyLabel="p"
             latin:keyHintLabel="0"
-            latin:moreKeys="@string/more_keys_for_p" />
+            latin:additionalMoreKeys="0" />
         <Key
             latin:keyLabel="@string/keylabel_for_scandinavia_row1_11"
             latin:keyWidth="fillRight" />
diff --git a/java/res/xml/rows_serbian.xml b/java/res/xml/rows_serbian.xml
index beb04d5245..d2203ce9cb 100644
--- a/java/res/xml/rows_serbian.xml
+++ b/java/res/xml/rows_serbian.xml
@@ -29,43 +29,43 @@
         <Key
             latin:keyLabel="Ñ™"
             latin:keyHintLabel="1"
-            latin:moreKeys="1" />
+            latin:additionalMoreKeys="1" />
         <Key
             latin:keyLabel="Ñš"
             latin:keyHintLabel="2"
-            latin:moreKeys="2" />
+            latin:additionalMoreKeys="2" />
         <Key
             latin:keyLabel="е"
             latin:keyHintLabel="3"
-            latin:moreKeys="3" />
+            latin:additionalMoreKeys="3" />
         <Key
             latin:keyLabel="Ñ€"
             latin:keyHintLabel="4"
-            latin:moreKeys="4" />
+            latin:additionalMoreKeys="4" />
         <Key
             latin:keyLabel="Ñ‚"
             latin:keyHintLabel="5"
-            latin:moreKeys="5" />
+            latin:additionalMoreKeys="5" />
         <Key
             latin:keyLabel="з"
             latin:keyHintLabel="6"
-            latin:moreKeys="6" />
+            latin:additionalMoreKeys="6" />
         <Key
             latin:keyLabel="у"
             latin:keyHintLabel="7"
-            latin:moreKeys="7" />
+            latin:additionalMoreKeys="7" />
         <Key
             latin:keyLabel="и"
             latin:keyHintLabel="8"
-            latin:moreKeys="8" />
+            latin:additionalMoreKeys="8" />
         <Key
             latin:keyLabel="о"
             latin:keyHintLabel="9"
-            latin:moreKeys="9" />
+            latin:additionalMoreKeys="9" />
         <Key
             latin:keyLabel="п"
             latin:keyHintLabel="0"
-            latin:moreKeys="0" />
+            latin:additionalMoreKeys="0" />
         <Key
             latin:keyLabel="ш"
             latin:keyWidth="fillRight" />
diff --git a/java/res/xml/rows_slavic.xml b/java/res/xml/rows_slavic.xml
index 52f5af4c91..71e442c7cd 100644
--- a/java/res/xml/rows_slavic.xml
+++ b/java/res/xml/rows_slavic.xml
@@ -29,43 +29,46 @@
         <Key
             latin:keyLabel="й"
             latin:keyHintLabel="1"
-            latin:moreKeys="1" />
+            latin:additionalMoreKeys="1" />
         <Key
             latin:keyLabel="ц"
             latin:keyHintLabel="2"
-            latin:moreKeys="2" />
+            latin:additionalMoreKeys="2" />
         <Key
             latin:keyLabel="у"
             latin:keyHintLabel="3"
+            latin:additionalMoreKeys="3"
             latin:moreKeys="@string/more_keys_for_slavic_u" />
         <Key
             latin:keyLabel="к"
             latin:keyHintLabel="4"
-            latin:moreKeys="4" />
+            latin:additionalMoreKeys="4" />
         <Key
             latin:keyLabel="е"
             latin:keyHintLabel="5"
+            latin:additionalMoreKeys="5"
             latin:moreKeys="@string/more_keys_for_slavic_ye" />
         <Key
             latin:keyLabel="н"
             latin:keyHintLabel="6"
+            latin:additionalMoreKeys="6"
             latin:moreKeys="@string/more_keys_for_slavic_en" />
         <Key
             latin:keyLabel="г"
             latin:keyHintLabel="7"
-            latin:moreKeys="7" />
+            latin:additionalMoreKeys="7" />
         <Key
             latin:keyLabel="ш"
             latin:keyHintLabel="8"
-            latin:moreKeys="8" />
+            latin:additionalMoreKeys="8" />
         <Key
             latin:keyLabel="@string/keylabel_for_slavic_shcha"
             latin:keyHintLabel="9"
-            latin:moreKeys="9" />
+            latin:additionalMoreKeys="9" />
         <Key
             latin:keyLabel="з"
             latin:keyHintLabel="0"
-            latin:moreKeys="0" />
+            latin:additionalMoreKeys="0" />
         <Key
             latin:keyLabel="Ñ…"
             latin:moreKeys="@string/more_keys_for_slavic_ha"
diff --git a/java/res/xml/rows_symbols.xml b/java/res/xml/rows_symbols.xml
index fe9efbbc60..d0d0edbc85 100644
--- a/java/res/xml/rows_symbols.xml
+++ b/java/res/xml/rows_symbols.xml
@@ -30,33 +30,43 @@
     >
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_1"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_1"
             latin:moreKeys="@string/more_keys_for_symbols_1" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_2"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_2"
             latin:moreKeys="@string/more_keys_for_symbols_2" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_3"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_3"
             latin:moreKeys="@string/more_keys_for_symbols_3" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_4"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_4"
             latin:moreKeys="@string/more_keys_for_symbols_4" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_5"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_5"
             latin:moreKeys="@string/more_keys_for_symbols_5" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_6"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_6"
             latin:moreKeys="@string/more_keys_for_symbols_6" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_7"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_7"
             latin:moreKeys="@string/more_keys_for_symbols_7" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_8"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_8"
             latin:moreKeys="@string/more_keys_for_symbols_8" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_9"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_9"
             latin:moreKeys="@string/more_keys_for_symbols_9" />
         <Key
             latin:keyLabel="@string/keylabel_for_symbols_0"
+            latin:additionalMoreKeys="@string/additional_more_keys_for_symbols_0"
             latin:moreKeys="@string/more_keys_for_symbols_0"
             latin:keyWidth="fillRight" />
     </Row>
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index bb90653c16..a2d379643e 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -285,22 +285,17 @@ public class Key {
         mLabelFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags, 0);
         final boolean preserveCase = (mLabelFlags & LABEL_FLAGS_PRESERVE_CASE) != 0;
 
-        final String[] moreKeys = style.getStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
+        final String[] additionalMoreKeys = style.getStringArray(
+                keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
+        final String[] moreKeys = MoreKeySpecParser.insertAddtionalMoreKeys(style.getStringArray(
+                keyAttr, R.styleable.Keyboard_Key_moreKeys), additionalMoreKeys);
         if (moreKeys != null) {
             for (int i = 0; i < moreKeys.length; i++) {
                 moreKeys[i] = adjustCaseOfStringForKeyboardId(
                         moreKeys[i], preserveCase, params.mId);
             }
         }
-        // TODO: Add new key label flag to control this.
-        // In Arabic symbol layouts, we'd like to keep digits in more keys regardless of
-        // config_digit_more_keys_enabled.
-        if (params.mId.isAlphabetKeyboard()
-                && !res.getBoolean(R.bool.config_digit_more_keys_enabled)) {
-            mMoreKeys = MoreKeySpecParser.filterOut(res, moreKeys, MoreKeySpecParser.DIGIT_FILTER);
-        } else {
-            mMoreKeys = moreKeys;
-        }
+        mMoreKeys = moreKeys;
         mMaxMoreKeysColumn = style.getInt(keyAttr,
                 R.styleable.Keyboard_Key_maxMoreKeysColumn, params.mMaxMiniKeyboardColumn);
 
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index b7215ec1ba..1450192b25 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -173,6 +173,7 @@ public class KeyStyles {
             readString(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
             readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
             readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
+            readStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
             readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags);
             readInt(keyAttr, R.styleable.Keyboard_Key_keyIcon);
             readInt(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java
index 16777733e1..abebfec012 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java
@@ -20,10 +20,12 @@ import android.content.res.Resources;
 import android.text.TextUtils;
 
 import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.Utils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 
 /**
  * String parser of moreKeys attribute of Key.
@@ -38,9 +40,11 @@ import java.util.ArrayList;
  * See {@link KeyboardIconsSet} about icon_number.
  */
 public class MoreKeySpecParser {
+    private static final boolean DEBUG = LatinImeLogger.sDBG;
     private static final char LABEL_END = '|';
     private static final String PREFIX_ICON = Utils.PREFIX_AT + "icon" + Utils.SUFFIX_SLASH;
     private static final String PREFIX_CODE = Utils.PREFIX_AT + "integer" + Utils.SUFFIX_SLASH;
+    private static final String ADDITIONAL_MORE_KEY_MARKER = "%";
 
     private MoreKeySpecParser() {
         // Intentional empty constructor for utility class.
@@ -173,51 +177,80 @@ public class MoreKeySpecParser {
         return KeyboardIconsSet.ICON_UNDEFINED;
     }
 
-    @SuppressWarnings("serial")
-    public static class MoreKeySpecParserError extends RuntimeException {
-        public MoreKeySpecParserError(String message) {
-            super(message);
-        }
-    }
-
-    public interface CodeFilter {
-        public boolean shouldFilterOut(int code);
-    }
-
-    public static final CodeFilter DIGIT_FILTER = new CodeFilter() {
-        @Override
-        public boolean shouldFilterOut(int code) {
-            return Character.isDigit(code);
-        }
-    };
-
-    public static String[] filterOut(Resources res, String[] moreKeys, CodeFilter filter) {
-        if (moreKeys == null || moreKeys.length < 1) {
-            return null;
-        }
-        if (moreKeys.length == 1 && filter.shouldFilterOut(getCode(res, moreKeys[0]))) {
-            return null;
-        }
-        ArrayList<String> filtered = null;
-        for (int i = 0; i < moreKeys.length; i++) {
-            final String moreKeySpec = moreKeys[i];
-            if (filter.shouldFilterOut(getCode(res, moreKeySpec))) {
-                if (filtered == null) {
-                    filtered = new ArrayList<String>();
-                    for (int j = 0; j < i; j++) {
-                        filtered.add(moreKeys[j]);
+    public static String[] insertAddtionalMoreKeys(String[] moreKeys, String[] additionalMoreKeys) {
+        final int moreKeysCount = (moreKeys != null) ? moreKeys.length : 0;
+        final int additionalCount = (additionalMoreKeys != null) ? additionalMoreKeys.length : 0;
+        ArrayList<String> out = null;
+        int additionalIndex = 0;
+        for (int moreKeyIndex = 0; moreKeyIndex < moreKeysCount; moreKeyIndex++) {
+            final String moreKeySpec = moreKeys[moreKeyIndex];
+            if (moreKeySpec.equals(ADDITIONAL_MORE_KEY_MARKER)) {
+                if (additionalIndex < additionalCount) {
+                    // Replace '%' marker with additional more key specification.
+                    final String additionalMoreKey = additionalMoreKeys[additionalIndex];
+                    if (out != null) {
+                        out.add(additionalMoreKey);
+                    } else {
+                        moreKeys[moreKeyIndex] = additionalMoreKey;
+                    }
+                    additionalIndex++;
+                } else {
+                    // Filter out excessive '%' marker.
+                    if (out == null) {
+                        out = new ArrayList<String>(moreKeyIndex);
+                        for (int i = 0; i < moreKeyIndex; i++) {
+                            out.add(moreKeys[i]);
+                        }
                     }
                 }
-            } else if (filtered != null) {
-                filtered.add(moreKeySpec);
+            } else {
+                if (out != null) {
+                    out.add(moreKeySpec);
+                }
+            }
+        }
+        if (additionalCount > 0 && additionalIndex == 0) {
+            // No '%' marker is found in more keys.
+            // Insert all additional more keys to the head of more keys.
+            if (DEBUG && out != null) {
+                throw new RuntimeException("Internal logic error:"
+                        + " moreKeys=" + Arrays.toString(moreKeys)
+                        + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys));
+            }
+            out = new ArrayList<String>(additionalCount + moreKeysCount);
+            for (int i = additionalIndex; i < additionalCount; i++) {
+                out.add(additionalMoreKeys[i]);
+            }
+            for (int i = 0; i < moreKeysCount; i++) {
+                out.add(moreKeys[i]);
+            }
+        } else if (additionalIndex < additionalCount) {
+            // The number of '%' markers are less than additional more keys.
+            // Append remained additional more keys to the tail of more keys.
+            if (DEBUG && out != null) {
+                throw new RuntimeException("Internal logic error:"
+                        + " moreKeys=" + Arrays.toString(moreKeys)
+                        + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys));
+            }
+            out = new ArrayList<String>(moreKeysCount);
+            for (int i = 0; i < moreKeysCount; i++) {
+                out.add(moreKeys[i]);
+            }
+            for (int i = additionalIndex; i < additionalCount; i++) {
+                out.add(additionalMoreKeys[additionalIndex]);
             }
         }
-        if (filtered == null) {
+        if (out != null) {
+            return out.size() > 0 ? out.toArray(new String[out.size()]) : null;
+        } else {
             return moreKeys;
         }
-        if (filtered.size() == 0) {
-            return null;
+    }
+
+    @SuppressWarnings("serial")
+    public static class MoreKeySpecParserError extends RuntimeException {
+        public MoreKeySpecParserError(String message) {
+            super(message);
         }
-        return filtered.toArray(new String[filtered.size()]);
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java
index 74aaf9af8b..bc38cc16cc 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java
@@ -22,6 +22,8 @@ import android.test.AndroidTestCase;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.latin.R;
 
+import java.util.Arrays;
+
 public class MoreKeySpecParserTests extends AndroidTestCase {
     private Resources mRes;
 
@@ -217,4 +219,212 @@ public class MoreKeySpecParserTests extends AndroidTestCase {
                 ICON_SETTINGS + "|" + CODE_SETTINGS + "|c",
                 null, null, ICON_SETTINGS_KEY, mCodeSettings);
     }
+
+    private void assertMoreKeys(String message, String[] moreKeys, String[] additionalMoreKeys,
+            String[] expected) {
+        final String[] actual = MoreKeySpecParser.insertAddtionalMoreKeys(
+                moreKeys, additionalMoreKeys);
+        if (expected == null && actual == null) {
+            return;
+        }
+        if (expected == null || actual == null) {
+            assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
+        } else {
+            if (expected.length != actual.length) {
+                assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
+            }
+            for (int i = 0; i < expected.length; i++) {
+                if (!actual[i].equals(expected[i])) {
+                    assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
+                }
+            }
+        }
+    }
+
+    public void testInsertAdditionalMoreKeys() {
+        // Escaped marker.
+        assertMoreKeys("escaped marker",
+                new String[] { "\\%", "%-)" },
+                new String[] { "1", "2" },
+                new String[] { "1", "2", "\\%", "%-)" });
+
+        // 0 more key.
+        assertMoreKeys("null & null", null, null, null);
+        assertMoreKeys("null & 1 additional",
+                null,
+                new String[] { "1" },
+                new String[] { "1" });
+        assertMoreKeys("null & 2 additionals",
+                null,
+                new String[] { "1", "2" },
+                new String[] { "1", "2" });
+
+        // 0 additional more key.
+        assertMoreKeys("1 more key & null",
+                new String[] { "A" },
+                null,
+                new String[] { "A" });
+        assertMoreKeys("2 more keys & null",
+                new String[] { "A", "B" },
+                null,
+                new String[] { "A", "B" });
+
+        // No marker.
+        assertMoreKeys("1 more key & 1 addtional & no marker",
+                new String[] { "A" },
+                new String[] { "1" },
+                new String[] { "1", "A" });
+        assertMoreKeys("1 more key & 2 addtionals & no marker",
+                new String[] { "A" },
+                new String[] { "1", "2" },
+                new String[] { "1", "2", "A" });
+        assertMoreKeys("2 more keys & 1 addtional & no marker",
+                new String[] { "A", "B" },
+                new String[] { "1" },
+                new String[] { "1", "A", "B" });
+        assertMoreKeys("2 more keys & 2 addtionals & no marker",
+                new String[] { "A", "B" },
+                new String[] { "1", "2" },
+                new String[] { "1", "2", "A", "B" });
+
+        // 1 marker.
+        assertMoreKeys("1 more key & 1 additional & marker at head",
+                new String[] { "%", "A" },
+                new String[] { "1" },
+                new String[] { "1", "A" });
+        assertMoreKeys("1 more key & 1 additional & marker at tail",
+                new String[] { "A", "%" },
+                new String[] { "1" },
+                new String[] { "A", "1" });
+        assertMoreKeys("2 more keys & 1 additional & marker at middle",
+                new String[] { "A", "%", "B" },
+                new String[] { "1" },
+                new String[] { "A", "1", "B" });
+
+        // 1 marker & excess additional more keys.
+        assertMoreKeys("1 more key & 2 additionals & marker at head",
+                new String[] { "%", "A", "B" },
+                new String[] { "1", "2" },
+                new String[] { "1", "A", "B", "2" });
+        assertMoreKeys("1 more key & 2 additionals & marker at tail",
+                new String[] { "A", "B", "%" },
+                new String[] { "1", "2" },
+                new String[] { "A", "B", "1", "2" });
+        assertMoreKeys("2 more keys & 2 additionals & marker at middle",
+                new String[] { "A", "%", "B" },
+                new String[] { "1", "2" },
+                new String[] { "A", "1", "B", "2" });
+
+        // 2 markers.
+        assertMoreKeys("0 more key & 2 addtional & 2 markers",
+                new String[] { "%", "%" },
+                new String[] { "1", "2" },
+                new String[] { "1", "2" });
+        assertMoreKeys("1 more key & 2 addtional & 2 markers at head",
+                new String[] { "%", "%", "A" },
+                new String[] { "1", "2" },
+                new String[] { "1", "2", "A" });
+        assertMoreKeys("1 more key & 2 addtional & 2 markers at tail",
+                new String[] { "A", "%", "%" },
+                new String[] { "1", "2" },
+                new String[] { "A", "1", "2" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle",
+                new String[] { "A", "%", "%", "B" },
+                new String[] { "1", "2" },
+                new String[] { "A", "1", "2", "B" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & middle",
+                new String[] { "%", "A", "%", "B" },
+                new String[] { "1", "2" },
+                new String[] { "1", "A", "2", "B" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & tail",
+                new String[] { "%", "A", "B", "%" },
+                new String[] { "1", "2" },
+                new String[] { "1", "A", "B", "2" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle & tail",
+                new String[] { "A", "%", "B", "%" },
+                new String[] { "1", "2" },
+                new String[] { "A", "1", "B", "2" });
+
+        // 2 markers & excess additional keys.
+        assertMoreKeys("0 more key & 2 addtional & 2 markers",
+                new String[] { "%", "%" },
+                new String[] { "1", "2", "3" },
+                new String[] { "1", "2", "3" });
+        assertMoreKeys("1 more key & 2 addtional & 2 markers at head",
+                new String[] { "%", "%", "A" },
+                new String[] { "1", "2", "3" },
+                new String[] { "1", "2", "A", "3" });
+        assertMoreKeys("1 more key & 2 addtional & 2 markers at tail",
+                new String[] { "A", "%", "%" },
+                new String[] { "1", "2", "3" },
+                new String[] { "A", "1", "2", "3" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle",
+                new String[] { "A", "%", "%", "B" },
+                new String[] { "1", "2", "3" },
+                new String[] { "A", "1", "2", "B", "3" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & middle",
+                new String[] { "%", "A", "%", "B" },
+                new String[] { "1", "2", "3" },
+                new String[] { "1", "A", "2", "B", "3" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & tail",
+                new String[] { "%", "A", "B", "%" },
+                new String[] { "1", "2", "3" },
+                new String[] { "1", "A", "B", "2", "3" });
+        assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle & tail",
+                new String[] { "A", "%", "B", "%" },
+                new String[] { "1", "2", "3" },
+                new String[] { "A", "1", "B", "2", "3" });
+
+        // 0 addtional more key and excess markers.
+        assertMoreKeys("0 more key & null & excess marker",
+                new String[] { "%" },
+                null,
+                null);
+        assertMoreKeys("1 more key & null & excess marker at head",
+                new String[] { "%", "A" },
+                null,
+                new String[] { "A" });
+        assertMoreKeys("1 more key & null & excess marker at tail",
+                new String[] { "A", "%" },
+                null,
+                new String[] { "A" });
+        assertMoreKeys("2 more keys & null & excess marker at middle",
+                new String[] { "A", "%", "B" },
+                null,
+                new String[] { "A", "B" });
+        assertMoreKeys("2 more keys & null & excess markers",
+                new String[] { "%", "A", "%", "B", "%" },
+                null,
+                new String[] { "A", "B" });
+
+        // Excess markers.
+        assertMoreKeys("0 more key & 1 addtional & excess marker",
+                new String[] { "%", "%" },
+                new String[] { "1" },
+                new String[] { "1" });
+        assertMoreKeys("1 more key & 1 addtional & excess marker at head",
+                new String[] { "%", "%", "A" },
+                new String[] { "1" },
+                new String[] { "1", "A" });
+        assertMoreKeys("1 more key & 1 addtional & excess marker at tail",
+                new String[] { "A", "%", "%" },
+                new String[] { "1" },
+                new String[] { "A", "1" });
+        assertMoreKeys("2 more keys & 1 addtional & excess marker at middle",
+                new String[] { "A", "%", "%", "B" },
+                new String[] { "1" },
+                new String[] { "A", "1", "B" });
+        assertMoreKeys("2 more keys & 1 addtional & excess markers",
+                new String[] { "%", "A", "%", "B", "%" },
+                new String[] { "1" },
+                new String[] { "1", "A", "B" });
+        assertMoreKeys("2 more keys & 2 addtionals & excess markers",
+                new String[] { "%", "A", "%", "B", "%" },
+                new String[] { "1", "2" },
+                new String[] { "1", "A", "2", "B" });
+        assertMoreKeys("2 more keys & 3 addtionals & excess markers",
+                new String[] { "%", "A", "%", "%", "B", "%" },
+                new String[] { "1", "2", "3" },
+                new String[] { "1", "A", "2", "3", "B" });
+    }
 }
-- 
GitLab