diff --git a/android/Tests/KeyboardHarness/app/src/main/assets/code2001.ttf b/android/Tests/KeyboardHarness/app/src/main/assets/code2001.ttf
new file mode 100644
index 0000000000..77abaa4d74
Binary files /dev/null and b/android/Tests/KeyboardHarness/app/src/main/assets/code2001.ttf differ
diff --git a/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kmp b/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kmp
index 07666de4a9..b434d78835 100644
Binary files a/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kmp and b/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kmp differ
diff --git a/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kpj b/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kpj
new file mode 100644
index 0000000000..c7fa5c530c
--- /dev/null
+++ b/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kpj
@@ -0,0 +1,56 @@
+
+
+
+ $PROJECTPATH
+ True
+ True
+ True
+ lexicalmodel
+
+
+
+ id_165fd1598b940efe4a973aeb6eb61aba
+ keyboardharness.kps
+ keyboardharness.kps
+ 1.0
+ .kps
+
+ keyboardharness
+ ©2020 SIL International
+ 1.0
+
+
+
+ id_f9b1213d4e83cb32ce1ead1ee852d618
+ chirality.js
+ ..\..\..\..\..\..\..\web\testing\chirality\chirality.js
+
+ .js
+ id_165fd1598b940efe4a973aeb6eb61aba
+
+
+ id_e01841691fa129428aea555142873f69
+ platformtest.js
+ ..\..\..\..\..\..\..\web\testing\platform\platformtest.js
+
+ .js
+ id_165fd1598b940efe4a973aeb6eb61aba
+
+
+ id_03df89bb84a1aa6cab40dfebf3a04c5b
+ code2001.ttf
+ code2001.ttf
+
+ .ttf
+ id_165fd1598b940efe4a973aeb6eb61aba
+
+
+ id_2d07bd2b8c94e9600ac1a920c8cb9e0a
+ longpress.js
+ longpress.js
+
+ .js
+ id_165fd1598b940efe4a973aeb6eb61aba
+
+
+
diff --git a/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kps b/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kps
new file mode 100644
index 0000000000..28e1436f70
--- /dev/null
+++ b/android/Tests/KeyboardHarness/app/src/main/assets/keyboardharness.kps
@@ -0,0 +1,76 @@
+
+
+
+ 14.0.24.0
+ 7.0
+
+
+
+
+
+
+
+
+
+
+
+ keyboardharness
+ 1.0
+ ©2020 SIL International
+
+
+
+ ..\..\..\..\..\..\..\web\testing\chirality\chirality.js
+ File chirality.js
+ 0
+ .js
+
+
+ ..\..\..\..\..\..\..\web\testing\platform\platformtest.js
+ File platformtest.js
+ 0
+ .js
+
+
+ code2001.ttf
+ Font Code2001
+ 0
+ .ttf
+
+
+ longpress.js
+ File longpress.js
+ 0
+ .js
+
+
+
+
+ Development Chirality Test Keyboard
+ chirality
+
+
+ English
+
+
+
+ PlatformTest
+ platformtest
+ 1.0
+
+ English
+
+
+
+ longpress
+ longpress
+ 1.0
+ code2001.ttf
+ code2001.ttf
+
+ English
+
+
+
+
+
diff --git a/android/Tests/KeyboardHarness/app/src/main/assets/longpress.js b/android/Tests/KeyboardHarness/app/src/main/assets/longpress.js
new file mode 100644
index 0000000000..1f146f8f92
--- /dev/null
+++ b/android/Tests/KeyboardHarness/app/src/main/assets/longpress.js
@@ -0,0 +1,1049 @@
+KeymanWeb.KR(new Keyboard_longpress());
+
+function Keyboard_longpress() {
+ this.KI = "Keyboard_longpress";
+ this.KN = "longpress";
+ this.KV = null;
+ this.KH = '';
+ this.KM = 0;
+ this.KBVER = "1.0";
+ this.KMBM = 0x0000;
+ this.KVKL = {
+ "tablet": {
+ "font": "code2001",
+ "layer": [{
+ "id": "default",
+ "row": [{
+ "id": 1,
+ "key": [{
+ "id": "U_10481",
+ "text": "\uD801\uDC81"
+ }, {
+ "id": "K_W",
+ "text": "w"
+ }, {
+ "id": "K_E",
+ "text": "e"
+ }, {
+ "id": "K_R",
+ "text": "r"
+ }, {
+ "id": "K_T",
+ "text": "t"
+ }, {
+ "id": "K_Y",
+ "text": "y"
+ }, {
+ "id": "K_U",
+ "text": "u"
+ }, {
+ "id": "K_I",
+ "text": "i"
+ }, {
+ "id": "K_O",
+ "text": "o"
+ }, {
+ "id": "K_P",
+ "text": "p"
+ }]
+ }, {
+ "id": 2,
+ "key": [{
+ "id": "K_A",
+ "text": "a",
+ "pad": 70
+ }, {
+ "id": "K_S",
+ "text": "s"
+ }, {
+ "id": "K_D",
+ "text": "d"
+ }, {
+ "id": "K_F",
+ "text": "f"
+ }, {
+ "id": "K_G",
+ "text": "g"
+ }, {
+ "id": "K_H",
+ "text": "h"
+ }, {
+ "id": "K_J",
+ "text": "j"
+ }, {
+ "id": "K_K",
+ "text": "k"
+ }, {
+ "id": "K_L",
+ "text": "l"
+ }, {
+ "id": "T_new_20",
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }]
+ }, {
+ "id": 3,
+ "key": [{
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": "110",
+ "sp": "1",
+ "nextlayer": "shift"
+ }, {
+ "id": "K_Z",
+ "text": "z"
+ }, {
+ "id": "K_X",
+ "text": "x"
+ }, {
+ "id": "K_C",
+ "text": "c"
+ }, {
+ "id": "K_V",
+ "text": "v"
+ }, {
+ "id": "K_B",
+ "text": "b"
+ }, {
+ "id": "K_N",
+ "text": "n"
+ }, {
+ "id": "K_M",
+ "text": "m"
+ }, {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [{
+ "text": ",",
+ "id": "K_COMMA"
+ }, {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ }, {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ }, {
+ "text": "'",
+ "id": "K_QUOTE"
+ }, {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ }, {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ }, {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ }, {
+ "text": ";",
+ "id": "K_COLON"
+ }]
+ }, {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "90",
+ "sp": "1"
+ }]
+ }, {
+ "id": 4,
+ "key": [{
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "140",
+ "sp": "1",
+ "nextlayer": "numeric"
+ }, {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ }, {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "630",
+ "sp": "0"
+ }, {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "140",
+ "sp": "1"
+ }]
+ }]
+ }, {
+ "id": "shift",
+ "row": [{
+ "id": 1,
+ "key": [{
+ "id": "K_Q",
+ "text": "Q"
+ }, {
+ "id": "K_W",
+ "text": "W"
+ }, {
+ "id": "K_E",
+ "text": "E"
+ }, {
+ "id": "K_R",
+ "text": "R"
+ }, {
+ "id": "K_T",
+ "text": "T"
+ }, {
+ "id": "K_Y",
+ "text": "Y"
+ }, {
+ "id": "K_U",
+ "text": "U"
+ }, {
+ "id": "K_I",
+ "text": "I"
+ }, {
+ "id": "K_O",
+ "text": "O"
+ }, {
+ "id": "K_P",
+ "text": "P"
+ }]
+ }, {
+ "id": 2,
+ "key": [{
+ "id": "K_A",
+ "pad": 70,
+ "text": "A"
+ }, {
+ "id": "K_S",
+ "text": "S"
+ }, {
+ "id": "K_D",
+ "text": "D"
+ }, {
+ "id": "K_F",
+ "text": "F"
+ }, {
+ "id": "K_G",
+ "text": "G"
+ }, {
+ "id": "K_H",
+ "text": "H"
+ }, {
+ "id": "K_J",
+ "text": "J"
+ }, {
+ "id": "K_K",
+ "text": "K"
+ }, {
+ "id": "K_L",
+ "text": "L"
+ }, {
+ "sp": "10",
+ "width": "10"
+ }]
+ }, {
+ "id": 3,
+ "key": [{
+ "id": "K_SHIFT",
+ "width": "110",
+ "sp": "2",
+ "nextlayer": "default",
+ "text": "*Shift*"
+ }, {
+ "id": "K_Z",
+ "text": "Z"
+ }, {
+ "id": "K_X",
+ "text": "X"
+ }, {
+ "id": "K_C",
+ "text": "C"
+ }, {
+ "id": "K_V",
+ "text": "V"
+ }, {
+ "id": "K_B",
+ "text": "B"
+ }, {
+ "id": "K_N",
+ "text": "N"
+ }, {
+ "id": "K_M",
+ "text": "M"
+ }, {
+ "id": "K_PERIOD",
+ "sk": [{
+ "text": ",",
+ "id": "K_COMMA",
+ "layer": "default"
+ }, {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ }, {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ }, {
+ "text": "'",
+ "id": "K_QUOTE",
+ "layer": "default"
+ }, {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ }, {
+ "text": "\\",
+ "id": "K_BKSLASH",
+ "layer": "default"
+ }, {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ }, {
+ "text": ";",
+ "id": "K_COLON",
+ "layer": "default"
+ }],
+ "text": "."
+ }, {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "90",
+ "sp": "1"
+ }]
+ }, {
+ "id": 4,
+ "key": [{
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "140",
+ "sp": "1",
+ "nextlayer": "numeric"
+ }, {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ }, {
+ "id": "K_SPACE",
+ "width": "630",
+ "sp": "0",
+ "text": ""
+ }, {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "140",
+ "sp": "1"
+ }]
+ }]
+ }, {
+ "id": "numeric",
+ "row": [{
+ "id": 1,
+ "key": [{
+ "id": "K_1",
+ "text": "1"
+ }, {
+ "id": "K_2",
+ "text": "2"
+ }, {
+ "id": "K_3",
+ "text": "3"
+ }, {
+ "id": "K_4",
+ "text": "4"
+ }, {
+ "id": "K_5",
+ "text": "5"
+ }, {
+ "id": "K_6",
+ "text": "6"
+ }, {
+ "id": "K_7",
+ "text": "7"
+ }, {
+ "id": "K_8",
+ "text": "8"
+ }, {
+ "id": "K_9",
+ "text": "9"
+ }, {
+ "id": "K_0",
+ "text": "0"
+ }]
+ }, {
+ "id": 2,
+ "key": [{
+ "id": "K_4",
+ "layer": "shift",
+ "pad": 70,
+ "text": "$"
+ }, {
+ "id": "K_2",
+ "layer": "shift",
+ "text": "@"
+ }, {
+ "id": "K_3",
+ "layer": "shift",
+ "text": "#"
+ }, {
+ "id": "K_5",
+ "layer": "shift",
+ "text": "%"
+ }, {
+ "id": "K_7",
+ "layer": "shift",
+ "text": "&"
+ }, {
+ "id": "K_HYPHEN",
+ "layer": "shift",
+ "text": "_"
+ }, {
+ "id": "K_EQUAL",
+ "layer": "default",
+ "text": "="
+ }, {
+ "id": "K_BKSLASH",
+ "layer": "shift",
+ "text": "|"
+ }, {
+ "id": "K_BKSLASH",
+ "layer": "default",
+ "text": "\\"
+ }, {
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }]
+ }, {
+ "id": 3,
+ "key": [{
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": "110",
+ "sp": "1"
+ }, {
+ "id": "K_LBRKT",
+ "sk": [{
+ "id": "U_00AB",
+ "text": "\u00AB"
+ }, {
+ "id": "K_COMMA",
+ "text": "<",
+ "layer": "shift"
+ }, {
+ "id": "K_LBRKT",
+ "text": "{",
+ "layer": "shift"
+ }],
+ "text": "["
+ }, {
+ "id": "K_9",
+ "layer": "shift",
+ "text": "("
+ }, {
+ "id": "K_0",
+ "layer": "shift",
+ "text": ")"
+ }, {
+ "id": "K_RBRKT",
+ "sk": [{
+ "id": "U_00BB",
+ "text": "\u00BB"
+ }, {
+ "id": "K_PERIOD",
+ "text": ">",
+ "layer": "shift"
+ }, {
+ "id": "K_RBRKT",
+ "text": "}",
+ "layer": "shift"
+ }],
+ "text": "]"
+ }, {
+ "id": "K_EQUAL",
+ "layer": "shift",
+ "text": "+"
+ }, {
+ "id": "K_HYPHEN",
+ "layer": "default",
+ "text": "-"
+ }, {
+ "id": "K_8",
+ "layer": "shift",
+ "text": "*"
+ }, {
+ "id": "K_SLASH",
+ "layer": "default",
+ "text": "\/"
+ }, {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "90",
+ "sp": "1"
+ }]
+ }, {
+ "id": 4,
+ "key": [{
+ "id": "K_LOWER",
+ "text": "*abc*",
+ "width": "140",
+ "sp": "1",
+ "nextlayer": "default"
+ }, {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ }, {
+ "id": "K_SPACE",
+ "width": "630",
+ "sp": "0",
+ "text": ""
+ }, {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "140",
+ "sp": "1"
+ }]
+ }]
+ }]
+ },
+ "phone": {
+ "font": "Code2001",
+ "layer": [{
+ "id": "default",
+ "row": [{
+ "id": 1,
+ "key": [{
+ "id": "U_10481",
+ "text": "\uD801\uDC81"
+ }, {
+ "id": "K_W",
+ "text": "w"
+ }, {
+ "id": "K_E",
+ "text": "e"
+ }, {
+ "id": "K_R",
+ "text": "r"
+ }, {
+ "id": "K_T",
+ "text": "t"
+ }, {
+ "id": "K_Y",
+ "text": "y"
+ }, {
+ "id": "K_U",
+ "text": "u"
+ }, {
+ "id": "K_I",
+ "text": "i"
+ }, {
+ "id": "K_O",
+ "text": "o"
+ }, {
+ "id": "K_P",
+ "text": "p"
+ }]
+ }, {
+ "id": 2,
+ "key": [{
+ "id": "K_A",
+ "text": "a",
+ "pad": "50"
+ }, {
+ "id": "K_S",
+ "text": "s"
+ }, {
+ "id": "K_D",
+ "text": "d"
+ }, {
+ "id": "K_F",
+ "text": "f"
+ }, {
+ "id": "K_G",
+ "text": "g"
+ }, {
+ "id": "K_H",
+ "text": "h"
+ }, {
+ "id": "K_J",
+ "text": "j"
+ }, {
+ "id": "K_K",
+ "text": "k"
+ }, {
+ "id": "K_L",
+ "text": "l"
+ }, {
+ "id": "T_new_54",
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }]
+ }, {
+ "id": 3,
+ "key": [{
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": "1",
+ "nextlayer": "shift"
+ }, {
+ "id": "K_Z",
+ "text": "z"
+ }, {
+ "id": "K_X",
+ "text": "x"
+ }, {
+ "id": "K_C",
+ "text": "c",
+ "sk": [{
+ "text": "\u00E7",
+ "id": "U_00E7"
+ }]
+ }, {
+ "id": "K_V",
+ "text": "v"
+ }, {
+ "id": "K_B",
+ "text": "b"
+ }, {
+ "id": "K_N",
+ "text": "n"
+ }, {
+ "id": "K_M",
+ "text": "m"
+ }, {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [{
+ "text": ",",
+ "id": "K_COMMA"
+ }, {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ }, {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ }, {
+ "text": "'",
+ "id": "K_QUOTE"
+ }, {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ }, {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ }, {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ }, {
+ "text": ";",
+ "id": "K_COLON"
+ }]
+ }, {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "100",
+ "sp": "1"
+ }]
+ }, {
+ "id": 4,
+ "key": [{
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "150",
+ "sp": "1",
+ "nextlayer": "numeric"
+ }, {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ }, {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "610",
+ "sp": "0",
+ "sk": [{
+ // Unicode C0 Control Codes U_0000 to U_001F suppressed
+ "text": "00",
+ "id": "U_0000"
+ }, {
+ "text": "1F",
+ "id": "U_001F"
+ }, {
+ "text": "20",
+ "id": "U_0020"
+ }, {
+ "text": "7F",
+ "id": "U_007F"
+ }, {
+ // Unicode C1 Control Codes U_0080 to U_009F suppressed
+ "text": "80",
+ "id": "U_0080"
+ }, {
+ "text": "9F",
+ "id": "U_009F"
+ }, {
+ "text": "A0",
+ "id": "U_00A0"
+ }]
+ }, {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "150",
+ "sp": "1"
+ }]
+ }]
+ }, {
+ "id": "shift",
+ "row": [{
+ "id": 1,
+ "key": [{
+ "id": "K_Q",
+ "text": "Q"
+ }, {
+ "id": "K_W",
+ "text": "W"
+ }, {
+ "id": "K_E",
+ "text": "E"
+ }, {
+ "id": "K_R",
+ "text": "R"
+ }, {
+ "id": "K_T",
+ "text": "T"
+ }, {
+ "id": "K_Y",
+ "text": "Y"
+ }, {
+ "id": "K_U",
+ "text": "U"
+ }, {
+ "id": "K_I",
+ "text": "I"
+ }, {
+ "id": "K_O",
+ "text": "O"
+ }, {
+ "id": "K_P",
+ "text": "P"
+ }]
+ }, {
+ "id": 2,
+ "key": [{
+ "id": "K_A",
+ "pad": "50",
+ "text": "A"
+ }, {
+ "id": "K_S",
+ "text": "S"
+ }, {
+ "id": "K_D",
+ "text": "D"
+ }, {
+ "id": "K_F",
+ "text": "F"
+ }, {
+ "id": "K_G",
+ "text": "G"
+ }, {
+ "id": "K_H",
+ "text": "H"
+ }, {
+ "id": "K_J",
+ "text": "J"
+ }, {
+ "id": "K_K",
+ "text": "K"
+ }, {
+ "id": "K_L",
+ "text": "L"
+ }, {
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }]
+ }, {
+ "id": 3,
+ "key": [{
+ "id": "K_SHIFT",
+ "sp": "2",
+ "nextlayer": "default",
+ "text": "*Shift*"
+ }, {
+ "id": "K_Z",
+ "text": "Z"
+ }, {
+ "id": "K_X",
+ "text": "X"
+ }, {
+ "id": "K_C",
+ "text": "C"
+ }, {
+ "id": "K_V",
+ "text": "V"
+ }, {
+ "id": "K_B",
+ "text": "B"
+ }, {
+ "id": "K_N",
+ "text": "N"
+ }, {
+ "id": "K_M",
+ "text": "M"
+ }, {
+ "id": "K_PERIOD",
+ "sk": [{
+ "text": ",",
+ "id": "K_COMMA",
+ "layer": "default"
+ }, {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ }, {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ }, {
+ "text": "'",
+ "id": "K_QUOTE",
+ "layer": "default"
+ }, {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ }, {
+ "text": "\\",
+ "id": "K_BKSLASH",
+ "layer": "default"
+ }, {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ }, {
+ "text": ";",
+ "id": "K_COLON",
+ "layer": "default"
+ }],
+ "text": "."
+ }, {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "sp": "1"
+ }]
+ }, {
+ "id": 4,
+ "key": [{
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "150",
+ "sp": "1",
+ "nextlayer": "numeric"
+ }, {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ }, {
+ "id": "K_SPACE",
+ "width": "610",
+ "sp": "0",
+ "text": ""
+ }, {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "150",
+ "sp": "1"
+ }]
+ }]
+ }, {
+ "id": "numeric",
+ "row": [{
+ "id": 1,
+ "key": [{
+ "id": "K_1",
+ "text": "1"
+ }, {
+ "id": "K_2",
+ "text": "2"
+ }, {
+ "id": "K_3",
+ "text": "3"
+ }, {
+ "id": "K_4",
+ "text": "4"
+ }, {
+ "id": "K_5",
+ "text": "5"
+ }, {
+ "id": "K_6",
+ "text": "6"
+ }, {
+ "id": "K_7",
+ "text": "7"
+ }, {
+ "id": "K_8",
+ "text": "8"
+ }, {
+ "id": "K_9",
+ "text": "9"
+ }, {
+ "id": "K_0",
+ "text": "0"
+ }]
+ }, {
+ "id": 2,
+ "key": [{
+ "id": "K_4",
+ "layer": "shift",
+ "pad": "50",
+ "text": "$"
+ }, {
+ "id": "K_2",
+ "layer": "shift",
+ "text": "@"
+ }, {
+ "id": "K_3",
+ "layer": "shift",
+ "text": "#"
+ }, {
+ "id": "K_5",
+ "layer": "shift",
+ "text": "%"
+ }, {
+ "id": "K_6",
+ "layer": "shift",
+ "text": "&"
+ }, {
+ "id": "K_HYPHEN",
+ "layer": "shift",
+ "text": "_"
+ }, {
+ "id": "K_EQUAL",
+ "layer": "default",
+ "text": "="
+ }, {
+ "id": "K_BKSLASH",
+ "layer": "shift",
+ "text": "|"
+ }, {
+ "id": "K_BKSLASH",
+ "layer": "default",
+ "text": "\\"
+ }, {
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }]
+ }, {
+ "id": 3,
+ "key": [{
+ "id": "K_LBRKT",
+ "pad": "110",
+ "sk": [{
+ "id": "U_00AB",
+ "text": "\u00AB"
+ }, {
+ "id": "K_COMMA",
+ "text": "<",
+ "layer": "shift"
+ }, {
+ "id": "K_LBRKT",
+ "text": "{",
+ "layer": "shift"
+ }],
+ "text": "["
+ }, {
+ "id": "K_9",
+ "layer": "shift",
+ "text": "("
+ }, {
+ "id": "K_0",
+ "layer": "shift",
+ "text": ")"
+ }, {
+ "id": "K_RBRKT",
+ "sk": [{
+ "id": "U_00BB",
+ "text": "\u00BB"
+ }, {
+ "id": "K_PERIOD",
+ "text": ">",
+ "layer": "shift"
+ }, {
+ "id": "K_RBRKT",
+ "text": "}",
+ "layer": "shift"
+ }],
+ "text": "]"
+ }, {
+ "id": "K_EQUAL",
+ "layer": "shift",
+ "text": "+"
+ }, {
+ "id": "K_HYPHEN",
+ "text": "-"
+ }, {
+ "id": "K_8",
+ "layer": "shift",
+ "text": "*"
+ }, {
+ "id": "K_SLASH",
+ "text": "\/"
+ }, {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "100",
+ "sp": "1"
+ }]
+ }, {
+ "id": 4,
+ "key": [{
+ "id": "K_LOWER",
+ "text": "*abc*",
+ "width": "150",
+ "sp": "1",
+ "nextlayer": "default"
+ }, {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ }, {
+ "id": "K_SPACE",
+ "width": "610",
+ "sp": "0",
+ "text": ""
+ }, {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "150",
+ "sp": "1"
+ }]
+ }]
+ }]
+ }
+ };
+ this.KVER = "10.0.955.0";
+ this.gs = function(t, e) {
+ return this.g0(t, e);
+ };
+ this.g0 = function(t, e) {
+ var k = KeymanWeb,
+ r = 0,
+ m = 0;
+ return r;
+ };
+}
\ No newline at end of file
diff --git a/android/Tests/KeyboardHarness/readme.md b/android/Tests/KeyboardHarness/readme.md
index aa04c0edc2..549d3f8b40 100644
--- a/android/Tests/KeyboardHarness/readme.md
+++ b/android/Tests/KeyboardHarness/readme.md
@@ -2,6 +2,14 @@
This app is is based on Samples/KMSample1 and targets keyboard functionality and reproducing bugs with keyboards rather than integration functionality. Use as system keyboard is currently not supported.
+### keyboardharness package source
+The path is ./app/src/main/assets/keyboardharness.kps
+
+and consists of these engineering keyboards:
+* android/Tests/KeyboardHarness/app/src/main/assets/longpress.js
+* web/testing/chirality/chirality.js
+* web/testing/platform/platformtest.js
+
## Version History ##
## 2017-09-26 1.0