Merge "Add noexcept to move constructors and assignment operators." am: 61d3a1d39b am: 587239f195
am: 9c58fe67f0

Change-Id: I926433188e61eef7f4947167e51b1afae407d9fc
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..037fe92
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+# Gradle
+.externalNativeBuild/
+.gradle/
+.idea/
+LatinIME.iml
+build/
+local.properties
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..ee5b7e6
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,110 @@
+buildscript {
+    repositories {
+        google()
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.2.0-beta03'
+    }
+}
+
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 28
+    buildToolsVersion '28.0.0'
+
+    // Required if using classes in android.test.runner
+    useLibrary 'android.test.runner'
+
+    // Required if using classes in android.test.base
+    useLibrary 'android.test.base'
+
+    // Required if using classes in android.test.mock
+    useLibrary 'android.test.mock'
+
+    defaultConfig {
+        minSdkVersion 18
+        targetSdkVersion 23
+        versionName "1.0"
+
+        applicationId 'com.android.inputmethod.latin'
+        testApplicationId 'com.android.inputmethod.latin.tests'
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        vectorDrawables.useSupportLibrary = false
+
+        signingConfig signingConfigs.debug
+    }
+
+    signingConfigs {
+        debug {
+            storeFile file("java/shared.keystore")
+        }
+    }
+
+    buildTypes {
+        debug {
+            minifyEnabled false
+        }
+        release {
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.flags'
+        }
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    flavorDimensions "default"
+
+    sourceSets {
+        main {
+            res.srcDirs = ['java/res']
+            java.srcDirs = ['common/src', 'java/src']
+            manifest.srcFile 'java/AndroidManifest.xml'
+        }
+
+        androidTest {
+            res.srcDirs = ['tests/res']
+            java.srcDirs = ['tests/src']
+            manifest.srcFile "tests/AndroidManifest.xml"
+        }
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+    }
+
+    aaptOptions {
+        noCompress 'dict'
+    }
+
+    externalNativeBuild {
+        ndkBuild {
+            path 'native/jni/Android.mk'
+        }
+    }
+}
+
+repositories {
+    maven { url "../../../prebuilts/fullsdk-darwin/extras/android/m2repository" }
+    maven { url "../../../prebuilts/fullsdk-linux/extras/android/m2repository" }
+    mavenCentral()
+    google()
+    jcenter()
+}
+
+dependencies {
+    implementation 'androidx.legacy:legacy-support-v4:+'
+    implementation 'com.google.code.findbugs:jsr305:3.0.2'
+
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation "org.mockito:mockito-core:1.9.5"
+    androidTestImplementation 'com.google.dexmaker:dexmaker:1.2'
+    androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test:rules:1.0.2'
+    androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
+    androidTestImplementation "com.android.support:support-annotations:27.1.1"
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..33c5632
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sat Jun 23 15:45:27 PDT 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..9d82f78
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windowz variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+if "%@eval[2+2]" == "4" goto 4NT_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+goto execute

+

+:4NT_args

+@rem Get arguments from the 4NT Shell from JP Software

+set CMD_LINE_ARGS=%$

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/java/Android.mk b/java/Android.mk
index 154f3a2..875aad4 100644
--- a/java/Android.mk
+++ b/java/Android.mk
@@ -17,19 +17,23 @@
 
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src ../java-overridable/src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := LatinIME
 
 LOCAL_CERTIFICATE := shared
 
+LOCAL_FULL_LIBS_MANIFEST_FILES := \
+    $(LOCAL_PATH)/AndroidManifest.xml \
+    $(LOCAL_PATH)/AndroidManifest_SdkVersion.xml
+
 LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime
 
 LOCAL_STATIC_JAVA_LIBRARIES := \
-        android-common inputmethod-common jsr305 latinime-common
+        android-common jsr305 latinime-common
 
 LOCAL_STATIC_ANDROID_LIBRARIES := \
-        android-support-v4
+        androidx.legacy_legacy-support-v4
 
 LOCAL_USE_AAPT2 := true
 
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index dedece5..5127c10 100644
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -16,9 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         coreApp="true"
-        package="com.android.inputmethod.latin">
-
-    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
+        package="com.android.inputmethod.latin"
+        android:versionCode="28">
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
diff --git a/java/AndroidManifest_SdkVersion.xml b/java/AndroidManifest_SdkVersion.xml
new file mode 100644
index 0000000..3dfeede
--- /dev/null
+++ b/java/AndroidManifest_SdkVersion.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.inputmethod.latin">
+    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
+</manifest>
diff --git a/java/res/layout/emoji_palettes_view.xml b/java/res/layout/emoji_palettes_view.xml
index 26cc042..7c5f6c0 100644
--- a/java/res/layout/emoji_palettes_view.xml
+++ b/java/res/layout/emoji_palettes_view.xml
@@ -71,7 +71,7 @@
             android:soundEffectsEnabled="false"
             android:contentDescription="@string/spoken_description_delete" />
     </LinearLayout>
-    <android.support.v4.view.ViewPager
+    <androidx.viewpager.widget.ViewPager
         android:id="@+id/emoji_keyboard_pager"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
diff --git a/java/res/layout/user_dictionary_add_word.xml b/java/res/layout/user_dictionary_add_word.xml
deleted file mode 100644
index 615fde5..0000000
--- a/java/res/layout/user_dictionary_add_word.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
-  -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/user_dict_settings_add_dialog_top"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical" >
-
-        <com.android.internal.widget.DialogTitle
-            style="?android:attr/windowTitleStyle"
-            android:layout_width="match_parent"
-            android:layout_height="64dip"
-            android:layout_marginEnd="16dip"
-            android:layout_marginStart="16dip"
-            android:ellipsize="end"
-            android:gravity="center_vertical|start"
-            android:singleLine="true"
-            android:text="@string/user_dict_settings_add_dialog_title" />
-
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="2dip"
-            android:background="@android:color/holo_blue_light" />
-    </LinearLayout>
-
-    <EditText
-        android:id="@+id/user_dictionary_add_word_text"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_gravity="fill_horizontal|center_vertical"
-        android:layout_marginBottom="8dip"
-        android:layout_marginStart="8dip"
-        android:layout_marginTop="8dip"
-        android:hint="@string/user_dict_settings_add_word_hint"
-        android:imeOptions="flagNoFullscreen"
-        android:inputType="textNoSuggestions"
-        android:maxLength="@integer/config_user_dictionary_max_word_length" >
-
-        <requestFocus />
-    </EditText>
-
-    <LinearLayout
-        style="?android:attr/buttonBarStyle"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:measureWithLargestChild="true"
-        android:orientation="horizontal" >
-
-        <Button
-            style="?android:attr/buttonBarButtonStyle"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_gravity="start"
-            android:layout_weight="1"
-            android:maxLines="2"
-            android:onClick="onClickCancel"
-            android:text="@string/cancel"
-            android:textSize="14sp" />
-
-        <Button
-            style="?android:attr/buttonBarButtonStyle"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_gravity="end"
-            android:layout_weight="1"
-            android:maxLines="2"
-            android:onClick="onClickConfirm"
-            android:text="@string/user_dict_settings_add_dialog_confirm"
-            android:textSize="14sp" />
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/java/res/values-ar/strings-talkback-descriptions.xml b/java/res/values-ar/strings-talkback-descriptions.xml
index a17f340..e5bc479 100644
--- a/java/res/values-ar/strings-talkback-descriptions.xml
+++ b/java/res/values-ar/strings-talkback-descriptions.xml
@@ -47,8 +47,8 @@
     <string name="spoken_description_language_switch" msgid="6818666779313544553">"تبديل اللغة"</string>
     <string name="spoken_description_action_next" msgid="431761808119616962">"التالي"</string>
     <string name="spoken_description_action_previous" msgid="2919072174697865110">"السابق"</string>
-    <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"‏تم تمكين Shift"</string>
-    <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"‏تم تمكين Caps lock"</string>
+    <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"‏تم تفعيل Shift"</string>
+    <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"‏تم تفعيل Caps lock"</string>
     <string name="spoken_description_mode_symbol" msgid="111186851131446691">"وضع الرموز"</string>
     <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"المزيد من وضع الرموز"</string>
     <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"وضع الأحرف"</string>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index bab2b7b..8b76c51 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -33,7 +33,7 @@
     <string name="settings_screen_correction" msgid="1616818407747682955">"تصحيح النص"</string>
     <string name="settings_screen_advanced" msgid="7472408607625972994">"الإعدادات المتقدمة"</string>
     <string name="settings_screen_theme" msgid="2137262503543943871">"المظهر"</string>
-    <string name="enable_split_keyboard" msgid="4177264923999493614">"هل تريد تمكين لوحة المفاتيح المقسمة"</string>
+    <string name="enable_split_keyboard" msgid="4177264923999493614">"هل تريد تفعيل لوحة المفاتيح المقسمة"</string>
     <string name="cloud_sync_title" msgid="8579271074443847055">"‏مزامنة لوحة مفاتيح Google"</string>
     <string name="cloud_sync_summary" msgid="7684887161145650857">"تم تشغيل المزامنة"</string>
     <string name="cloud_sync_summary_disabled" msgid="4553338970382825796">"يمكنك مزامنة قاموسك الشخصي على جميع الأجهزة"</string>
@@ -49,18 +49,18 @@
     <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"التبديل إلى أسلوب إدخال آخر"</string>
     <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"يغطي مفتاح تبديل اللغات أساليب الإدخال الأخرى أيضًا"</string>
     <string name="show_language_switch_key" msgid="5915478828318774384">"مفتاح تبديل اللغة"</string>
-    <string name="show_language_switch_key_summary" msgid="7343403647474265713">"يظهر عندما يتم تمكين لغات الإدخال متعددة"</string>
+    <string name="show_language_switch_key_summary" msgid="7343403647474265713">"يظهر عندما يتم تفعيل لغات الإدخال متعددة"</string>
     <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"تأخير إزالة النافذة المنبثقة الأساسية"</string>
     <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"بلا تأخير"</string>
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"تلقائي"</string>
     <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> مللي ثانية"</string>
-    <string name="settings_system_default" msgid="6268225104743331821">"الإعداد الافتراضي للنظام"</string>
+    <string name="settings_system_default" msgid="6268225104743331821">"الإعداد التلقائي للنظام"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"اقتراح أسماء جهات الاتصال"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"استخدام الأسماء من جهات الاتصال للاقتراحات والتصحيحات"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"اقتراحات مخصصة"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"تحسين <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"نقطة المسافة المزدوجة"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"يؤدي النقر نقرًا مزدوجًا على مفتاح المسافة إلى إدخال نقطة متبوعة بمسافة"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"يؤدي النقر مرّتين على مفتاح المسافة إلى إدخال نقطة متبوعة بمسافة"</string>
     <string name="auto_cap" msgid="1719746674854628252">"أحرف كبيرة تلقائيًا"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"كتابة الحرف الأول من كل جملة بحرف كبير."</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"القاموس الشخصي"</string>
@@ -78,7 +78,7 @@
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"شديد الصرامة"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"اقتراحات الكلمات التالية"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"استخدام الكلمة السابقة في تقديم الاقتراحات"</string>
-    <string name="gesture_input" msgid="826951152254563827">"تمكين الكتابة بالإيماءة"</string>
+    <string name="gesture_input" msgid="826951152254563827">"تفعيل الكتابة بالإيماءة"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"إدخال كلمة من خلال التمرير على الأحرف"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"عرض مسار الإيماءة"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"معاينة نصوص متحركة ديناميكية"</string>
@@ -86,7 +86,7 @@
     <string name="gesture_space_aware" msgid="2078291600664682496">"عبارة الإيماء"</string>
     <string name="gesture_space_aware_summary" msgid="4371385818348528538">"إدخال مسافات خلال الإيماءات من خلال تمرير مفتاح المسافة"</string>
     <string name="voice_input" msgid="3583258583521397548">"مفتاح الإدخال الصوتي"</string>
-    <string name="voice_input_disabled_summary" msgid="6323489602945135165">"لم يتم تمكين أي أساليب إدخال صوتي. تحقق من إعدادات اللغات والإدخال."</string>
+    <string name="voice_input_disabled_summary" msgid="6323489602945135165">"لم يتم تفعيل أي أساليب إدخال صوتي. تحقق من إعدادات اللغات والإدخال."</string>
     <string name="configure_input_method" msgid="373356270290742459">"تهيئة طرق الإدخال"</string>
     <string name="language_selection_title" msgid="3666971864764478269">"اللغات"</string>
     <string name="help_and_feedback" msgid="5328219371839879161">"المساعدة والتعليقات"</string>
@@ -130,25 +130,25 @@
     <string name="save" msgid="7646738597196767214">"حفظ"</string>
     <string name="subtype_locale" msgid="8576443440738143764">"اللغة"</string>
     <string name="keyboard_layout_set" msgid="4309233698194565609">"التخطيط"</string>
-    <string name="custom_input_style_note_message" msgid="8826731320846363423">"يجب تمكين نمط الإدخال المخصص قبل استخدامه. هل تريد تمكينه الآن؟"</string>
-    <string name="enable" msgid="5031294444630523247">"تمكين"</string>
+    <string name="custom_input_style_note_message" msgid="8826731320846363423">"يجب تفعيل نمط الإدخال المخصص قبل استخدامه. هل تريد تفعيله الآن؟"</string>
+    <string name="enable" msgid="5031294444630523247">"تفعيل"</string>
     <string name="not_now" msgid="6172462888202790482">"ليس الآن"</string>
     <string name="custom_input_style_already_exists" msgid="8008728952215449707">"نمط الإدخال ذاته موجود من قبل: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
     <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"مدة اهتزاز الضغط على المفاتيح"</string>
     <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"مستوى صوت الضغط على المفاتيح"</string>
-    <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"تأخير الضغط الطويل للمفاتيح"</string>
+    <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"مهلة الضغط الطويل على المفاتيح"</string>
     <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"الرموز التعبيرية للوحة مفاتيح فعلية"</string>
     <string name="prefs_enable_emoji_alt_physical_key_summary" msgid="5259484820941627827">"‏مفتاح Alt الفعلي يعرض لوحة الرموز التعبيرية"</string>
-    <string name="button_default" msgid="3988017840431881491">"الافتراضية"</string>
+    <string name="button_default" msgid="3988017840431881491">"التلقائية"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"أهلاً بك في <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"مع الكتابة بالإشارة"</string>
     <string name="setup_start_action" msgid="8936036460897347708">"بدء الاستخدام"</string>
     <string name="setup_next_action" msgid="371821437915144603">"الخطوة التالية"</string>
     <string name="setup_steps_title" msgid="6400373034871816182">"إعداد <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
-    <string name="setup_step1_title" msgid="3147967630253462315">"تمكين <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+    <string name="setup_step1_title" msgid="3147967630253462315">"تفعيل <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_step1_instruction" msgid="4295448056733329661">"يُرجى تحديد \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" من خلال إعدادات اللغات والإدخال؛ وذلك للسماح بتشغيل هذا التطبيق على جهازك."</string>
-    <string name="setup_step1_finished_instruction" msgid="8701441895377434947">"تم تمكين <xliff:g id="APPLICATION_NAME">%s</xliff:g> من قبل في إعدادات اللغات والإدخال، وبالتالي هذه الخطوة مكتملة. انتقل إلى الخطوة التالية."</string>
-    <string name="setup_step1_action" msgid="4366513534999901728">"تمكين في الإعدادات"</string>
+    <string name="setup_step1_finished_instruction" msgid="8701441895377434947">"تم تفعيل <xliff:g id="APPLICATION_NAME">%s</xliff:g> من قبل في إعدادات اللغات والإدخال، وبالتالي هذه الخطوة مكتملة. انتقل إلى الخطوة التالية."</string>
+    <string name="setup_step1_action" msgid="4366513534999901728">"تفعيل في الإعدادات"</string>
     <string name="setup_step2_title" msgid="6860725447906690594">"التبديل إلى <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
     <string name="setup_step2_instruction" msgid="9141481964870023336">"بعد ذلك، حدد \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" باعتباره أسلوب إدخال النص النشط."</string>
     <string name="setup_step2_action" msgid="1660330307159824337">"تبديل أساليب الإدخال"</string>
@@ -170,7 +170,7 @@
     <string name="dictionary_available" msgid="4728975345815214218">"القاموس متاح"</string>
     <string name="dictionary_downloading" msgid="2982650524622620983">"يتم حاليًا التنزيل"</string>
     <string name="dictionary_installed" msgid="8081558343559342962">"تم التثبيت"</string>
-    <string name="dictionary_disabled" msgid="8950383219564621762">"مثبت، معطل"</string>
+    <string name="dictionary_disabled" msgid="8950383219564621762">"مثبت، غير مفعّل"</string>
     <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"مشكلة في الاتصال بخدمة القاموس"</string>
     <string name="no_dictionaries_available" msgid="8039920716566132611">"لا تتوفر أي قواميس"</string>
     <string name="check_for_updates_now" msgid="8087688440916388581">"تحديث"</string>
@@ -204,7 +204,7 @@
     <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"تعديل كلمة"</string>
     <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"تعديل"</string>
     <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"حذف"</string>
-    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"لا تتوفر أي كلمات في قاموس المستخدم، ولإضافة كلمة، انقر على زر الإضافة (+)."</string>
+    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"ليس هناك أي كلمات في قاموس المستخدم. لإضافة كلمة، انقر على زر الإضافة (+)."</string>
     <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"لجميع اللغات"</string>
     <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"مزيد من اللغات..."</string>
     <string name="user_dict_settings_delete" msgid="110413335187193859">"حذف"</string>
diff --git a/java/res/values-as/strings-action-keys.xml b/java/res/values-as/strings-action-keys.xml
new file mode 100644
index 0000000..af96ea8
--- /dev/null
+++ b/java/res/values-as/strings-action-keys.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="label_go_key" msgid="4033615332628671065">"যাওক"</string>
+    <string name="label_next_key" msgid="5586407279258592635">"পৰৱৰ্তী"</string>
+    <string name="label_previous_key" msgid="1421141755779895275">"আগৰ"</string>
+    <string name="label_done_key" msgid="7564866296502630852">"হ\'ল"</string>
+    <string name="label_send_key" msgid="482252074224462163">"পঠিয়াওক"</string>
+    <string name="label_search_key" msgid="7965186050435796642">"সন্ধান"</string>
+    <string name="label_pause_key" msgid="2225922926459730642">"পজ কৰক"</string>
+    <string name="label_wait_key" msgid="5891247853595466039">"ৰ\'ব"</string>
+</resources>
diff --git a/java/res/values-as/strings-appname.xml b/java/res/values-as/strings-appname.xml
new file mode 100644
index 0000000..8874600
--- /dev/null
+++ b/java/res/values-as/strings-appname.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_name" msgid="5940510615957428904">"Android কীব\'ৰ্ড (AOSP)"</string>
+    <string name="spell_checker_service_name" msgid="1254221805440242662">"Android বানান পৰীক্ষক (AOSP)"</string>
+    <string name="english_ime_settings" msgid="5760361067176802794">"Android কীব\'ৰ্ডৰ ছেটিংসমূহ (AOSP)"</string>
+    <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android বানান পৰীক্ষকৰ ছেটিংসমূহ (AOSP)"</string>
+</resources>
diff --git a/java/res/values-as/strings-config-important-notice.xml b/java/res/values-as/strings-config-important-notice.xml
new file mode 100644
index 0000000..3af48f3
--- /dev/null
+++ b/java/res/values-as/strings-config-important-notice.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="use_personalized_dicts_summary" msgid="590432261305469627">"পৰামৰ্শাৱলী উন্নত কৰিবলৈ যোগাযোগ পদ্ধতিসমূহৰ পৰা আৰু টাইপ কৰা ডেটাৰ পৰা শিকক"</string>
+</resources>
diff --git a/java/res/values-as/strings-emoji-descriptions.xml b/java/res/values-as/strings-emoji-descriptions.xml
new file mode 100644
index 0000000..a844c46
--- /dev/null
+++ b/java/res/values-as/strings-emoji-descriptions.xml
@@ -0,0 +1,1756 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These Emoji symbols are unsupported by TTS.
+    TODO: Remove this file when TTS/TalkBack support these Emoji symbols.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_emoji_00A9" msgid="2859822817116803638">"স্বত্বাধিকাৰৰ চিহ্ন"</string>
+    <string name="spoken_emoji_00AE" msgid="7708335454134589027">"পঞ্জীকৃত চিহ্ন"</string>
+    <string name="spoken_emoji_203C" msgid="153340916701508663">"দ্বৈত ভাৱবোধক চিহ্ন"</string>
+    <string name="spoken_emoji_2049" msgid="4877256448299555371">"ভাৱবোধক আৰু প্ৰশ্নবোধক চিহ্ন"</string>
+    <string name="spoken_emoji_2122" msgid="9188440722954720429">"ট্ৰেড মাৰ্কৰ চিহ্ন"</string>
+    <string name="spoken_emoji_2139" msgid="9114342638917304327">"তথ্যৰ উৎস"</string>
+    <string name="spoken_emoji_2194" msgid="8055202727034946680">"সোঁ আৰু বাওঁ উভয় দিশ নির্দেশ কৰা কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_2195" msgid="8028122253301087407">"ওপৰ তল উভয় দিশ নিদের্শ কৰা কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_2196" msgid="4019164898967854363">"উত্তৰ-পশ্চিমমুৱা কাঁড়"</string>
+    <string name="spoken_emoji_2197" msgid="4255723717709017801">"উত্তৰ-পূবমুৱা কাঁড়"</string>
+    <string name="spoken_emoji_2198" msgid="1452063451313622090">"দক্ষিণ-পূবমুৱা কাঁড়"</string>
+    <string name="spoken_emoji_2199" msgid="6942722693368807849">"দক্ষিণ-পশ্চিমমুৱা কাঁড়"</string>
+    <string name="spoken_emoji_21A9" msgid="5204750172335111188">"হুক সহ বাওঁমুৱা কাঁড়"</string>
+    <string name="spoken_emoji_21AA" msgid="3950259884359247006">"সোঁফালে নির্দেশ কৰা হুক থকা কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_231A" msgid="6751448803233874993">"হাতঘড়ী"</string>
+    <string name="spoken_emoji_231B" msgid="5956428809948426182">"বালি-ঘড়ী"</string>
+    <!-- no translation found for spoken_emoji_2328 (8004906090359197446) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_23CF (8619437871899719070) -->
+    <skip />
+    <string name="spoken_emoji_23E9" msgid="4022497733535162237">"ক\'লা ৰঙৰ সোঁফালে নিৰ্দেশ কৰা দ্বৈত ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_23EA" msgid="2251396938087774944">"ক\'লা ৰঙৰ বাওঁফালে নিৰ্দেশ কৰা দ্বৈত ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_23EB" msgid="3746885195641491865">"ক\'লা ৰঙৰ ওপৰফালে নিৰ্দেশ কৰা দ্বৈত ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_23EC" msgid="7852372752901163416">"ক\'লা ৰঙৰ তলফালে নিৰ্দেশ কৰা দ্বৈত ত্ৰিভুজ"</string>
+    <!-- no translation found for spoken_emoji_23ED (4064850193044573080) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_23EE (9014449600450857793) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_23EF (3823680845887006998) -->
+    <skip />
+    <string name="spoken_emoji_23F0" msgid="8474219588750627870">"এলাৰ্ম ঘড়ী"</string>
+    <!-- no translation found for spoken_emoji_23F1 (2303619241672210658) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_23F2 (2178084138229786936) -->
+    <skip />
+    <string name="spoken_emoji_23F3" msgid="166900119581024371">"সৰি পৰি থকা বালিৰে বালি-ঘড়ী"</string>
+    <!-- no translation found for spoken_emoji_23F8 (1924914079210161141) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_23F9 (1268967989320035023) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_23FA (3359902126862990795) -->
+    <skip />
+    <string name="spoken_emoji_24C2" msgid="3948348737566038470">"বৃত্তৰ ভিতৰত থকা লেটিন বৰফলা বৰ্ণ \'m\'"</string>
+    <string name="spoken_emoji_25AA" msgid="7865181015100227349">"ক\'লা ৰঙৰ সৰু বৰ্গ"</string>
+    <string name="spoken_emoji_25AB" msgid="6446532820937381457">"বগা ৰঙৰ সৰু বর্গ"</string>
+    <string name="spoken_emoji_25B6" msgid="2423897708496040947">"ক\'লা ৰঙৰ সোঁফালে নিৰ্দেশ কৰা ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_25C0" msgid="3595083440074484934">"ক\'লা ৰঙৰ বাওঁফালে নিৰ্দেশ কৰা ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_25FB" msgid="4838691986881215419">"বগা ৰঙৰ মজলীয়া আকাৰৰ বর্গ"</string>
+    <string name="spoken_emoji_25FC" msgid="7008859564991191050">"ক\'লা ৰঙৰ মজলীয়া আকাৰৰ বর্গ"</string>
+    <string name="spoken_emoji_25FD" msgid="7673439755069217479">"বগা ৰঙৰ মজলীয়া আকাৰৰ সৰু বর্গ"</string>
+    <string name="spoken_emoji_25FE" msgid="6782214109919768923">"ক\'লা ৰঙৰ মধ্যমীয়া সৰু বৰ্গ"</string>
+    <string name="spoken_emoji_2600" msgid="2272722634618990413">"ৰশ্মিসহ ক\'লা সূৰ্য"</string>
+    <string name="spoken_emoji_2601" msgid="6205136889311537150">"ডাৱৰ"</string>
+    <!-- no translation found for spoken_emoji_2602 (6293136501817877234) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2603 (7285313121103197207) -->
+    <skip />
+    <string name="spoken_emoji_2604" msgid="8632808648689048735">"ধূমকেতু"</string>
+    <string name="spoken_emoji_260E" msgid="8670395193046424238">"ক\'লা ৰঙৰ টেলিফ\'ন"</string>
+    <string name="spoken_emoji_2611" msgid="4530550203347054611">"শুদ্ধ চিনযুক্ত বেলট বাকচ"</string>
+    <string name="spoken_emoji_2614" msgid="1612791247861229500">"বৰষুণৰ টোপাল পৰা ছাতি"</string>
+    <string name="spoken_emoji_2615" msgid="3320562382424018588">"গৰম পানীয়"</string>
+    <!-- no translation found for spoken_emoji_2618 (5581533965699965354) -->
+    <skip />
+    <string name="spoken_emoji_261D" msgid="4690554173549768467">"ওপৰলৈ নির্দেশ কৰি থকা তর্জনী আঙুলিৰ চিহ্ন"</string>
+    <!-- no translation found for spoken_emoji_2620 (4434290857196023657) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2622 (2534880989000210921) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2623 (141484483765762677) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2626 (2857954123507187408) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_262A (6726891928565290372) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_262E (3189887039765290178) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_262F (7138150472623738307) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2638 (9073003565602256277) -->
+    <skip />
+    <string name="spoken_emoji_2639" msgid="6128305824180156835">"খঙাল মুখমণ্ডল"</string>
+    <string name="spoken_emoji_263A" msgid="3170094381521989300">"হাঁহি থকা শুভ্ৰ মুখ"</string>
+    <string name="spoken_emoji_2648" msgid="4621241062667020673">"মেষ ৰাশি"</string>
+    <string name="spoken_emoji_2649" msgid="7694461245947059086">"বৃষ ৰাশি"</string>
+    <string name="spoken_emoji_264A" msgid="1258074605878705030">"মিথুন ৰাশি"</string>
+    <string name="spoken_emoji_264B" msgid="4409219914377810956">"কৰ্কট ৰাশি"</string>
+    <string name="spoken_emoji_264C" msgid="6520255367817054163">"সিংহ ৰাশি"</string>
+    <string name="spoken_emoji_264D" msgid="1504758945499854018">"কন্যা ৰাশি"</string>
+    <string name="spoken_emoji_264E" msgid="2354847104530633519">"তুলা ৰাশি"</string>
+    <string name="spoken_emoji_264F" msgid="5822933280406416112">"বৃশ্চিক ৰাশি"</string>
+    <string name="spoken_emoji_2650" msgid="4832481156714796163">"ধনু ৰাশি"</string>
+    <string name="spoken_emoji_2651" msgid="840953134601595090">"মকৰ ৰাশি"</string>
+    <string name="spoken_emoji_2652" msgid="3586925968718775281">"কুম্ভ ৰাশি"</string>
+    <string name="spoken_emoji_2653" msgid="8420547731496254492">"মীন ৰাশি"</string>
+    <string name="spoken_emoji_2660" msgid="4541170554542412536">"ক\'লা ইস্কাপন"</string>
+    <string name="spoken_emoji_2663" msgid="3669352721942285724">"ক\'লা চিৰিতন"</string>
+    <string name="spoken_emoji_2665" msgid="6347941599683765843">"ক\'লা ৰহিতন"</string>
+    <string name="spoken_emoji_2666" msgid="8296769213401115999">"ক\'লা ৰোহিতন"</string>
+    <string name="spoken_emoji_2668" msgid="7063148281053820386">"গৰম পানী উহ"</string>
+    <string name="spoken_emoji_267B" msgid="21716857176812762">"ক\'লা ৰঙৰ নৱীকৰণযোগ্য সামগ্ৰীৰ চিহ্ন"</string>
+    <string name="spoken_emoji_267F" msgid="8833496533226475443">"হুইলচ্চেয়াৰৰ প্ৰতীক"</string>
+    <!-- no translation found for spoken_emoji_2692 (633276166375803852) -->
+    <skip />
+    <string name="spoken_emoji_2693" msgid="7443148847598433088">"লংগৰ"</string>
+    <!-- no translation found for spoken_emoji_2694 (4114117110598973648) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2696 (7920282042498350920) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2697 (7576307101162421601) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2699 (8525225054232323125) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_269B (9146644473418235977) -->
+    <skip />
+    <string name="spoken_emoji_269C" msgid="1883421369883009835">"ফ্লাৰ-দ্য-লি"</string>
+    <string name="spoken_emoji_26A0" msgid="6272635532992727510">"সতৰ্কবাণীৰ চিন"</string>
+    <string name="spoken_emoji_26A1" msgid="5604749644693339145">"উচ্চ ক্ষমতাসম্পন্ন বৈদ্যুতিক সামগ্ৰীৰ চিহ্ন"</string>
+    <string name="spoken_emoji_26AA" msgid="8005748091690377153">"বগা ৰঙৰ মধ্যমীয়া বৃত্ত"</string>
+    <string name="spoken_emoji_26AB" msgid="1655910278422753244">"মধ্যমীয়া ক\'লা বৃত্ত"</string>
+    <!-- no translation found for spoken_emoji_26B0 (5742048235215593821) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_26B1 (2096529437455909562) -->
+    <skip />
+    <string name="spoken_emoji_26BD" msgid="1545218197938889737">"ফুটবল"</string>
+    <string name="spoken_emoji_26BE" msgid="8959760533076498209">"বে\'ছবল"</string>
+    <string name="spoken_emoji_26C4" msgid="3045791757044255626">"তুষাৰ অবিহনে তুষাৰ মানৱ"</string>
+    <string name="spoken_emoji_26C5" msgid="5580129409712578639">"ডাৱৰৰ পিছফালে সূর্য থকা দৃশ্য"</string>
+    <!-- no translation found for spoken_emoji_26C8 (4641925705576445058) -->
+    <skip />
+    <string name="spoken_emoji_26CE" msgid="8963656417276062998">"অ\'ফিউচাছ"</string>
+    <!-- no translation found for spoken_emoji_26CF (1048987245528185548) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_26D1 (5122253261153603676) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_26D3 (7567590167882104907) -->
+    <skip />
+    <string name="spoken_emoji_26D4" msgid="2231451988209604130">"প্ৰৱেশ নিষেধ"</string>
+    <!-- no translation found for spoken_emoji_26E9 (5219739268764945756) -->
+    <skip />
+    <string name="spoken_emoji_26EA" msgid="7513319636103804907">"গীৰ্জা"</string>
+    <!-- no translation found for spoken_emoji_26F0 (8690606275240650121) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_26F1 (7617840615623596077) -->
+    <skip />
+    <string name="spoken_emoji_26F2" msgid="7134115206158891037">"পানীৰ ফোৱাৰা"</string>
+    <string name="spoken_emoji_26F3" msgid="4912302210162075465">"গ\'ল্ফ খেলৰ গাঁতত পুতি ৰখা পতাকা"</string>
+    <!-- no translation found for spoken_emoji_26F4 (8296597141413923967) -->
+    <skip />
+    <string name="spoken_emoji_26F5" msgid="4766328116769075217">"ডিঙা"</string>
+    <!-- no translation found for spoken_emoji_26F7 (5002838791562917075) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_26F8 (2326041972852924376) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_26F9 (1588803158145064802) -->
+    <skip />
+    <string name="spoken_emoji_26FA" msgid="5888017494809199037">"তম্বু"</string>
+    <string name="spoken_emoji_26FD" msgid="2417060622927453534">"তেলৰ পাম্প"</string>
+    <string name="spoken_emoji_2702" msgid="4005741160717451912">"ক\'লা কেঁচী"</string>
+    <string name="spoken_emoji_2705" msgid="164605766946697759">"ডাঠ বগা ৰঙৰ শুদ্ধ চিন"</string>
+    <string name="spoken_emoji_2708" msgid="7153840886849268988">"এয়াৰপ্লেইন"</string>
+    <string name="spoken_emoji_2709" msgid="2217319160724311369">"খাম"</string>
+    <string name="spoken_emoji_270A" msgid="508347232762319473">"উত্থিত মুষ্টি"</string>
+    <string name="spoken_emoji_270B" msgid="6640562128327753423">"হাত দাঙি সঁহাৰি জনোৱা"</string>
+    <string name="spoken_emoji_270C" msgid="1344288035704944581">"বিজয়ী হাত"</string>
+    <!-- no translation found for spoken_emoji_270D (8850355355131892496) -->
+    <skip />
+    <string name="spoken_emoji_270F" msgid="6108251586067318718">"পেন্সিল"</string>
+    <string name="spoken_emoji_2712" msgid="6320544535087710482">"ক\'লা ৰঙৰ নিব্"</string>
+    <string name="spoken_emoji_2714" msgid="1968242800064001654">"গাঢ় শুদ্ধ চিহ্ন"</string>
+    <string name="spoken_emoji_2716" msgid="511941294762977228">"গাঢ় পুৰণ চিহ্ন"</string>
+    <!-- no translation found for spoken_emoji_271D (2367275551961395862) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_2721 (4150694777322944905) -->
+    <skip />
+    <string name="spoken_emoji_2728" msgid="5650330815808691881">"তিৰবিৰণি"</string>
+    <string name="spoken_emoji_2733" msgid="8915809595141157327">"আঠডাল দণ্ডৰে তাৰকা চিহ্ন"</string>
+    <string name="spoken_emoji_2734" msgid="4846583547980754332">"আঠ কোণীয়া ক\'লা তৰা"</string>
+    <string name="spoken_emoji_2744" msgid="4350636647760161042">"তুষাৰকণা"</string>
+    <string name="spoken_emoji_2747" msgid="3718282973916474455">"তিৰবিৰনি"</string>
+    <string name="spoken_emoji_274C" msgid="2752145886733295314">"কটা চিন"</string>
+    <string name="spoken_emoji_274E" msgid="4262918689871098338">"ঋণাত্মক বৰ্গাকৃতিৰ ক্ৰছ চিন"</string>
+    <string name="spoken_emoji_2753" msgid="6935897159942119808">"গাঢ় ক\'লা ৰঙৰ প্ৰশ্নবোধক চিহ্ন"</string>
+    <string name="spoken_emoji_2754" msgid="7277504915105532954">"গাঢ় বগা ৰঙৰ প্ৰশ্নবোধক চিহ্ন"</string>
+    <string name="spoken_emoji_2755" msgid="6853076969826960210">"বগা ভাৱবোধক চিনৰ অলংকাৰ"</string>
+    <string name="spoken_emoji_2757" msgid="3707907828776912174">"ডাঠ ভাৱবোধক চিনৰ প্ৰতীক"</string>
+    <!-- no translation found for spoken_emoji_2763 (3255858123691890971) -->
+    <skip />
+    <string name="spoken_emoji_2764" msgid="4214257843609432167">"গাঢ় ক\'লা ৰঙৰ হৃদয় আকৃতি"</string>
+    <string name="spoken_emoji_2795" msgid="6563954833786162168">"গাঢ় যোগ চিহ্ন"</string>
+    <string name="spoken_emoji_2796" msgid="5990926508250772777">"ডাঠ বিয়োগ চিহ্ন"</string>
+    <string name="spoken_emoji_2797" msgid="24694184172879174">"ডাঠ হৰণ চিন"</string>
+    <string name="spoken_emoji_27A1" msgid="3513434778263100580">"সোঁফালে নির্দেশ কৰা ক\'লা ৰঙৰ কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_27B0" msgid="203395646864662198">"ক\'লা ৰঙৰ পকোৱা চিন"</string>
+    <string name="spoken_emoji_27BF" msgid="4940514642375640510">"দ্বৈত ক\'লা ৰঙৰ পকোৱা চিন"</string>
+    <string name="spoken_emoji_2934" msgid="9062130477982973457">"সোঁফাল নির্দেশ কৰা ঊর্ধ্বমুখী কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_2935" msgid="6198710960720232074">"সোঁফালে নির্দেশ কৰি পিছত বেঁকা হৈ তলফালে মুখ কৰা কাঁড়"</string>
+    <string name="spoken_emoji_2B05" msgid="4813405635410707690">"বাওঁমুৱা ক\'লা কাঁড়"</string>
+    <string name="spoken_emoji_2B06" msgid="1223172079106250748">"ঊর্ধ্বমুখী ক\'লা কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_2B07" msgid="1599124424746596150">"নিম্নমুখী ক\'লা কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"ক\'লা ৰঙৰ ডাঙৰ বৰ্গ"</string>
+    <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"বগা ৰঙৰ বিশাল বৰ্গ"</string>
+    <string name="spoken_emoji_2B50" msgid="3850845519526950524">"বগা মধ্যমীয়া তৰা চিহ্ন"</string>
+    <string name="spoken_emoji_2B55" msgid="9137882158811541824">"ডাঠ তৰপৰ ডাঙৰ বৃত্ত"</string>
+    <string name="spoken_emoji_3030" msgid="4609172241893565639">"ৰঙা ৰঙৰ ঢৌ খেলোৱা ডেশ্ব"</string>
+    <string name="spoken_emoji_303D" msgid="2545833934975907505">"গায়কে গাবলগীয়া অংশৰ আৰম্ভণি সূচোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_3297" msgid="928912923628973800">"বৃত্তাকাৰ আইডিঅ\'গ্ৰাফৰ অভিনন্দন সূচক চিহ্ন"</string>
+    <string name="spoken_emoji_3299" msgid="3930347573693668426">"বৃত্তাকাৰ আইডিঅ\'গ্ৰাফৰ গোপন চিহ্ন"</string>
+    <string name="spoken_emoji_1F004" msgid="1705216181345894600">"মাহজং টাইলৰ ৰঙা ড্ৰেগন"</string>
+    <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"তাঁচ পাতৰ ক\'লা জ\'কৰ"</string>
+    <string name="spoken_emoji_1F170" msgid="3817698686602826773">"তেজৰ গ্ৰুপ A"</string>
+    <string name="spoken_emoji_1F171" msgid="3684218589626650242">"তেজৰ গ্ৰুপ B"</string>
+    <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"তেজৰ গ্ৰুপ O"</string>
+    <string name="spoken_emoji_1F17F" msgid="463634348668462040">"পার্কিঙৰ ঠাই"</string>
+    <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"তেজৰ প্ৰকাৰ AB"</string>
+    <string name="spoken_emoji_1F191" msgid="5386969264431429221">"\'CL\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F192" msgid="8324226436829162496">"\'কুল\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F193" msgid="4731758603321515364">"বিনামূলীয়া লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ভিতৰত ID লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F195" msgid="1433142500411060924">"\'নতুন\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F196" msgid="8825160701159634202">"N G লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F197" msgid="7841079241554176535">"অ\'কে লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F198" msgid="7020298909426960622">"\'SOS\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F199" msgid="5971252667136235630">"ভাববোধক চিনসহ \'আপ\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"\'vs\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F201" msgid="7000490044681139002">"ইয়াত লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F202" msgid="8560906958695043947">"সেৱা লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"মাচুলবিহীন সূচোৱা আইডিঅ\'গ্ৰাফযুক্ত বর্গ"</string>
+    <string name="spoken_emoji_1F22F" msgid="609797148862445402">"সংৰক্ষিত আসন সূচোৱা আইডিঅ\'গ্ৰাফযুক্ত বর্গ"</string>
+    <string name="spoken_emoji_1F232" msgid="8125716331632035820">"নিষেধ সূচোৱা আইডিঅ\'গ্ৰাফযুক্ত বর্গ"</string>
+    <string name="spoken_emoji_1F233" msgid="8749401090457355028">"খালী ঠাই সূচোৱা আইডিঅ\'গ্ৰাফযুক্ত বর্গ"</string>
+    <string name="spoken_emoji_1F234" msgid="3546951604285970768">"গ্ৰহণ কৰা সূচোৱা আইডিঅ\'গ্ৰাফযুক্ত বর্গ"</string>
+    <string name="spoken_emoji_1F235" msgid="5320186982841793711">"ভৰ্তি বুজোৱা বর্গাকাৰ আইডিঅ\'গ্ৰাফ"</string>
+    <string name="spoken_emoji_1F236" msgid="879755752069393034">"পৰিশোধ হ\'ল বুজোৱা বর্গাকাৰ আইডিঅ\'গ্ৰাফ"</string>
+    <string name="spoken_emoji_1F237" msgid="6741807001205851437">"মাহিলী বুজোৱা বর্গাকাৰ আইডিঅ\'গ্ৰাফ"</string>
+    <string name="spoken_emoji_1F238" msgid="5504414186438196912">"আইডিঅ\'গ্ৰাফ এপ্লিকেশ্বন লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F239" msgid="1634067311597618959">"ৰেহাই বুজোৱা বর্গাকাৰ আইডিঅ\'গ্ৰাফ"</string>
+    <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"ব্যৱসায়ত আছে বুজোৱা বর্গাকাৰ আইডিঅ\'গ্ৰাফ"</string>
+    <string name="spoken_emoji_1F250" msgid="6586943922806727907">"বৃত্তৰ ভিতৰত থকা সুবিধা সূচোৱা আইডিঅ\'গ্ৰাফ"</string>
+    <string name="spoken_emoji_1F251" msgid="9099032855993346948">"গ্ৰহণ কৰা সূচোৱা আইডিঅ\'গ্ৰাফযুক্ত বর্গ"</string>
+    <string name="spoken_emoji_1F300" msgid="4720098285295840383">"ঘূৰ্ণীবায়ু"</string>
+    <string name="spoken_emoji_1F301" msgid="3601962477653752974">"কুঁৱলীময়"</string>
+    <string name="spoken_emoji_1F302" msgid="3404357123421753593">"জপাই থোৱা ছাতি"</string>
+    <string name="spoken_emoji_1F303" msgid="3899301321538188206">"আকাশত তৰা থকা নিশাৰ দৃশ্য"</string>
+    <string name="spoken_emoji_1F304" msgid="2767148930689050040">"পর্বতৰ শিখৰত সূর্য্য উদয় হোৱা দৃশ্য"</string>
+    <string name="spoken_emoji_1F305" msgid="9165812924292061196">"সূৰ্যোদয়"</string>
+    <string name="spoken_emoji_1F306" msgid="5889294736109193104">"গধূলি সময়ৰ চহৰৰ দৃশ্য"</string>
+    <string name="spoken_emoji_1F307" msgid="2714290867291163713">"অট্টালিকাসমূহৰ পিছফালে বেলি মাৰ যোৱাৰ দৃশ্য"</string>
+    <string name="spoken_emoji_1F308" msgid="688704703985173377">"ৰামধেনু"</string>
+    <string name="spoken_emoji_1F309" msgid="6217981957992313528">"নিশাৰ দলঙৰ দৃশ্য"</string>
+    <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"পানীৰ ঢৌ"</string>
+    <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"আগ্নেয়গিৰি"</string>
+    <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"হাতীপটি"</string>
+    <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"ইউৰোপ আৰু আফ্ৰিকাৰ মেপ থকা গোলক"</string>
+    <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"উত্তৰ আৰু দক্ষিণ আমেৰিকাৰ মেপ থকা গোলক"</string>
+    <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"এছিয়া আৰু অষ্ট্ৰেলিয়াৰ মানচিত্ৰ থকা গোলক"</string>
+    <string name="spoken_emoji_1F310" msgid="2959618582975247601">"অক্ষৰেখা আৰু দ্ৰাঘিমাৰেখাৰ সৈতে গোলক"</string>
+    <string name="spoken_emoji_1F311" msgid="623906380914895542">"ন জোনৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F312" msgid="4458575672576125401">"বৰ্ধমান অৰ্ধচন্দ্ৰৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F313" msgid="7599181787989497294">"প্ৰথম এক চতুৰ্থাংশ বিশিষ্ট চন্দ্ৰৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F314" msgid="4898293184964365413">"বৰ্ধমান স্ফীত চন্দ্ৰৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F315" msgid="3218117051779496309">"পূৰ্ণ চন্দ্ৰৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F316" msgid="2061317145777689569">"কলাক্ষয় জোনৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F317" msgid="2721090687319539049">"অন্তিম এক চতুৰ্থাংশ বিশিষ্ট চন্দ্ৰৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F318" msgid="3814091755648887570">"কমি অহা অৰ্ধচন্দ্ৰৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F319" msgid="4074299824890459465">"অৰ্ধচন্দ্ৰ"</string>
+    <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"মুখমণ্ডলৰ সৈতে ন জোন"</string>
+    <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"মুখৰ সৈতে প্ৰথম এক চতুৰ্থাংশ জোন"</string>
+    <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"মুখৰ সৈতে অন্তিম এক চতুৰ্থাংশ জোন"</string>
+    <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"মুখমণ্ডল থকা পূর্ণ চন্দ্ৰৰ দৃশ্য"</string>
+    <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"মুখৰ সৈতে সূৰ্য"</string>
+    <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"জিকমিক তৰাৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F320" msgid="5450591979068216115">"উল্কা"</string>
+    <!-- no translation found for spoken_emoji_1F321 (581288529301493075) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F324 (2930891297836314896) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F325 (5282092301688177705) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F326 (165046788529872891) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F327 (4384791469343260600) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F328 (1991614733939171872) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F329 (6016235695016510649) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F32A (5889026615334911758) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F32B (3223192457131343118) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F32C (3479270390051226956) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F32D (8869598854109228966) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F32E (6077879860650582531) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F32F (6730078269862769637) -->
+    <skip />
+    <string name="spoken_emoji_1F330" msgid="3115760035618051575">"কাঠবাদাম"</string>
+    <string name="spoken_emoji_1F331" msgid="5658888205290008691">"অংকুৰ"</string>
+    <string name="spoken_emoji_1F332" msgid="2935650450421165938">"চিৰসেউজ গছ"</string>
+    <string name="spoken_emoji_1F333" msgid="5898847427062482675">"পৰ্ণপাতী গছ"</string>
+    <string name="spoken_emoji_1F334" msgid="6183375224678417894">"পাম গছ"</string>
+    <string name="spoken_emoji_1F335" msgid="5352418412103584941">"কেকটাছ গছ"</string>
+    <!-- no translation found for spoken_emoji_1F336 (5912660172314184275) -->
+    <skip />
+    <string name="spoken_emoji_1F337" msgid="3839107352363566289">"টিউলিপ ফুল"</string>
+    <string name="spoken_emoji_1F338" msgid="6389970364260468490">"প্ৰস্ফুতিত চেৰি ফুল"</string>
+    <string name="spoken_emoji_1F339" msgid="9128891447985256151">"গোলাপ ফুল"</string>
+    <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"জবা ফুল"</string>
+    <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"সূৰ্যমুখী ফুল"</string>
+    <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"প্ৰস্ফুতিত"</string>
+    <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"গোমধান"</string>
+    <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"ধানৰ থোক"</string>
+    <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"বনৌষধি"</string>
+    <string name="spoken_emoji_1F340" msgid="3494255459156499305">"চাৰিটা পাতযুক্ত উদ্ভিদ"</string>
+    <string name="spoken_emoji_1F341" msgid="4581959481754990158">"মেপলৰ পাত"</string>
+    <string name="spoken_emoji_1F342" msgid="3119068426871821222">"সৰা পাত"</string>
+    <string name="spoken_emoji_1F343" msgid="2663317495805149004">"বতাহত উৰি ফুৰা পাত"</string>
+    <string name="spoken_emoji_1F344" msgid="2738517881678722159">"কাঠফুলা"</string>
+    <string name="spoken_emoji_1F345" msgid="6135288642349085554">"বিলাহী"</string>
+    <string name="spoken_emoji_1F346" msgid="2075395322785406367">"বেঙেনা"</string>
+    <string name="spoken_emoji_1F347" msgid="7753453754963890571">"আঙুৰ"</string>
+    <string name="spoken_emoji_1F348" msgid="1247076837284932788">"তৰমুজ"</string>
+    <string name="spoken_emoji_1F349" msgid="5563054555180611086">"তৰমুজ"</string>
+    <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"টেঞ্জাৰিন"</string>
+    <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"নেমু"</string>
+    <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"কল"</string>
+    <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"আনাৰস"</string>
+    <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"ৰঙা আপেল"</string>
+    <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"সেউজীয়া আপেল"</string>
+    <string name="spoken_emoji_1F350" msgid="625802980159197701">"নাচপতি"</string>
+    <string name="spoken_emoji_1F351" msgid="4269460120610911895">"নৰা বগৰী"</string>
+    <string name="spoken_emoji_1F352" msgid="965600953360182635">"চেৰি"</string>
+    <string name="spoken_emoji_1F353" msgid="7068623879906925592">"ষ্ট্ৰ\'বেৰী"</string>
+    <string name="spoken_emoji_1F354" msgid="45162285238888494">"হেমবাৰ্গাৰ"</string>
+    <string name="spoken_emoji_1F355" msgid="9157587635526433283">"পিৎছাৰ টুকুৰা"</string>
+    <string name="spoken_emoji_1F356" msgid="2667196119149852244">"হাঁড় থকা মঙহ"</string>
+    <string name="spoken_emoji_1F357" msgid="8022817413851052256">"কুকুৰাৰ ঠেং"</string>
+    <string name="spoken_emoji_1F358" msgid="3042693264748036476">"চাউলৰ পৰা তৈয়াৰী পিঠা"</string>
+    <string name="spoken_emoji_1F359" msgid="3988148661730121958">"ৰাইচ বল"</string>
+    <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"ভাত"</string>
+    <string name="spoken_emoji_1F35B" msgid="62530406745717835">"তৰকাৰী আৰু ভাত"</string>
+    <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"তপত আহাৰৰ সৈতে বাটি"</string>
+    <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"স্পেঘেটী"</string>
+    <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"ব্ৰেড"</string>
+    <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"ফ্ৰেন্স ফ্ৰাই"</string>
+    <string name="spoken_emoji_1F360" msgid="4094659855684686801">"পোৰা মিঠা আলু"</string>
+    <string name="spoken_emoji_1F361" msgid="6475486395784096109">"ডাঙগ\' মিঠাই"</string>
+    <string name="spoken_emoji_1F362" msgid="5004692577661076275">"অ\'ডেন"</string>
+    <string name="spoken_emoji_1F363" msgid="1606603765717743806">"ছুশ্বি"</string>
+    <string name="spoken_emoji_1F364" msgid="6550457766169570811">"ভজা মিছামাছ"</string>
+    <string name="spoken_emoji_1F365" msgid="4963815540953316307">"চাকনৈয়াৰ নক্সাসহ মাছেৰে তৈয়াৰী কেইক"</string>
+    <string name="spoken_emoji_1F366" msgid="7862401745277049404">"কোমল আইচক্ৰীম"</string>
+    <string name="spoken_emoji_1F367" msgid="7447972978281980414">"বৰফ গুড়ি"</string>
+    <string name="spoken_emoji_1F368" msgid="7790003146142724913">"আইচক্ৰীম"</string>
+    <string name="spoken_emoji_1F369" msgid="7383712944084857350">"ড\'নাট"</string>
+    <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"কুকি"</string>
+    <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"চকলেট"</string>
+    <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"কেণ্ডী"</string>
+    <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"ল\'লিপ\'প"</string>
+    <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"কাষ্টাৰ্ড"</string>
+    <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"মৌ-জোল ৰখা পাত্ৰ"</string>
+    <string name="spoken_emoji_1F370" msgid="7243244547866114951">"শ্বৰ্টকেইক"</string>
+    <string name="spoken_emoji_1F371" msgid="6731527040552916358">"বেণ্টো বক্স"</string>
+    <string name="spoken_emoji_1F372" msgid="1635035323832181733">"খাদ্যৰ পাত্ৰ"</string>
+    <string name="spoken_emoji_1F373" msgid="7799289534289221045">"ৰন্ধন"</string>
+    <string name="spoken_emoji_1F374" msgid="5973820884987069131">"কাঁটাচামুচ আৰু ছুৰী কটাৰী"</string>
+    <string name="spoken_emoji_1F375" msgid="1074832087699617700">"হেণ্ডেলবিহীন চাহৰ কাপ"</string>
+    <string name="spoken_emoji_1F376" msgid="6499274685584852067">"ছাকেৰ বটল আৰু কাপ"</string>
+    <string name="spoken_emoji_1F377" msgid="1762398562314172075">"সুৰাৰ গিলাছ"</string>
+    <string name="spoken_emoji_1F378" msgid="5528234560590117516">"ক\'কটেইল গিলাছ"</string>
+    <string name="spoken_emoji_1F379" msgid="790581290787943325">"গ্ৰীষ্মমণ্ডলীয় অঞ্চলৰ পানীয়"</string>
+    <string name="spoken_emoji_1F37A" msgid="391966822450619516">"বিয়েৰৰ মগ"</string>
+    <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"যুঁজা লগোৱা দুটা বিয়েৰৰ মগ"</string>
+    <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"কেঁচুৱাক দুগ্ধপান কৰোৱা গিলাছ"</string>
+    <!-- no translation found for spoken_emoji_1F37D (8887228479219886429) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F37E (37593222775513943) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F37F (4196704853559909123) -->
+    <skip />
+    <string name="spoken_emoji_1F380" msgid="3487363857092458827">"ফিটা"</string>
+    <string name="spoken_emoji_1F381" msgid="614180683680675444">"ৰঙীণ কাগজেৰে বন্ধা উপহাৰৰ বাকচ"</string>
+    <string name="spoken_emoji_1F382" msgid="4720497171946687501">"জন্মদিনৰ কেইক"</string>
+    <string name="spoken_emoji_1F383" msgid="3536505941578757623">"জেক-অ\'-লেনটাৰ্ণ"</string>
+    <string name="spoken_emoji_1F384" msgid="1797870204479059004">"খ্ৰীষ্টমাছ ট্ৰী"</string>
+    <string name="spoken_emoji_1F385" msgid="1754174063483626367">"ছাণ্টাক্লজ"</string>
+    <string name="spoken_emoji_1F386" msgid="2130445450758114746">"আতচ-বাজী"</string>
+    <string name="spoken_emoji_1F387" msgid="3403182563117999933">"ফিৰফিৰি"</string>
+    <string name="spoken_emoji_1F388" msgid="2903047203723251804">"বেলুন"</string>
+    <string name="spoken_emoji_1F389" msgid="2352830665883549388">"পাৰ্টী প\'পাৰ"</string>
+    <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"ক\'নফেট্টি বল"</string>
+    <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"টানাবাটা গছ"</string>
+    <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"পূৰণ চিনৰ আকৃতিত ৰখা দুখন পতাকা"</string>
+    <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"পাইন গছৰ সজ্জা"</string>
+    <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"জাপানী পুতলা"</string>
+    <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"কাৰ্প ষ্ট্ৰীমাৰ"</string>
+    <string name="spoken_emoji_1F390" msgid="8903307048095431374">"ৱিণ্ড চ্চাইম"</string>
+    <string name="spoken_emoji_1F391" msgid="2134952069191911841">"জোন চোৱা পর্ব"</string>
+    <string name="spoken_emoji_1F392" msgid="6380405493914304737">"স্কুলীয়া বেগ"</string>
+    <string name="spoken_emoji_1F393" msgid="6947890064872470996">"স্নাতক ডিগ্ৰী লাভ কৰোঁতে পিন্ধা টুপি"</string>
+    <!-- no translation found for spoken_emoji_1F396 (8356140738000265647) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F397 (5249863289838097468) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F399 (6087019010423147017) -->
+    <skip />
+    <string name="spoken_emoji_1F39A" msgid="1627914548345466924">"লেভেল শ্লাইডাৰ"</string>
+    <!-- no translation found for spoken_emoji_1F39B (648039433701743585) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F39E (2918731924907952534) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F39F (2427606024950432412) -->
+    <skip />
+    <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"পুতলা ঘোঁৰা"</string>
+    <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"ফেৰিছ চকৰী"</string>
+    <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"ৰ\'লাৰ ক\'ষ্টাৰ"</string>
+    <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"বৰশী ডাঁৰিকী আৰু মাছ"</string>
+    <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"মাইক্ৰ\'ফ\'ন"</string>
+    <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"বোলছবি নির্মাণৰ কেমেৰা"</string>
+    <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"বোলছবি"</string>
+    <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"হেডফ\'ন"</string>
+    <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"চিত্ৰশিল্পীৰ পেলেট"</string>
+    <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"ওখ টুপি"</string>
+    <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"চাৰ্কাছৰ তম্বু"</string>
+    <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"টিকেট"</string>
+    <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"ক্লেপাৰ ব\'ৰ্ড"</string>
+    <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"পৰিৱেশ্য কলা"</string>
+    <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"ভিডিঅ\' গেইম"</string>
+    <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"পোনপটীয়াকৈ লক্ষ্যভেদ কৰা"</string>
+    <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"শ্ল’ট মেচিন"</string>
+    <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"বিলিয়াৰ্ড"</string>
+    <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"লুডু খেলৰ গুটি"</string>
+    <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"ব\'লিং খেল"</string>
+    <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"ফুলৰ ছবি থকা তাচপাত"</string>
+    <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"সাংগীতিক স্বৰ"</string>
+    <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"একাধিক সাংগীতিক স্বৰ"</string>
+    <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"ছেক্স\'ফ\'ন"</string>
+    <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"গিটাৰ"</string>
+    <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"সাংগীতিক কীব\'ৰ্ড"</string>
+    <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"শিঙা"</string>
+    <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"বেহেলা"</string>
+    <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"গানৰ কলি লিখি থোৱা পত্ৰ"</string>
+    <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"দৌৰোতে পিন্ধা ফিটা লগা চোলা"</string>
+    <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"টেনিছ ৰেকেট আৰু বল"</string>
+    <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"স্কি আৰু স্কি খেলত পিন্ধা জোতা"</string>
+    <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"বাস্কেটবল আৰু হুপ"</string>
+    <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"ক\'লা-বগা বৰ্গাকৃতিৰ ঘৰযুক্ত পতাকা"</string>
+    <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"স্ন\'ব\'ৰ্ডাৰ"</string>
+    <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"দৌৰবিদ"</string>
+    <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"ছাৰ্ফ কৰোঁতা"</string>
+    <!-- no translation found for spoken_emoji_1F3C5 (3256434181486954695) -->
+    <skip />
+    <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"ট্ৰ\'ফী"</string>
+    <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"ঘোঁৰাদৌৰ"</string>
+    <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"আমেৰিকান ফুটবল"</string>
+    <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"ৰাগবী ফুটবল"</string>
+    <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"সাঁতোৰবিদ"</string>
+    <!-- no translation found for spoken_emoji_1F3CB (6201404884476413631) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3CC (5773930948380166403) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3CD (3174865701360723287) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3CE (298990178863007728) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3CF (220014996836173720) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D0 (1515966148588308407) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D1 (9065400886436849028) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D2 (9113415091165206322) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D3 (5392602379011857837) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D4 (5682806162641888464) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D5 (485622019934191893) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D6 (8056487018845189239) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D7 (9200931466909972688) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D8 (4060224387880105443) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3D9 (5239036983837296458) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3DA (4479002058414881869) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3DB (5481092245291634716) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3DC (7540751465637885253) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3DD (2957722522033693226) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3DE (8767730963119889199) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3DF (360348087882746758) -->
+    <skip />
+    <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"নিৰ্মাণৰত ঘৰ"</string>
+    <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"বাগিছাৰ সৈতে ঘৰ"</string>
+    <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"কাৰ্যালয়ৰ ভৱন"</string>
+    <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"জাপানী ডাকঘৰ"</string>
+    <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"ইউৰোপীয়ান ডাকঘৰ"</string>
+    <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"চিকিৎসালয়"</string>
+    <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"বেংক"</string>
+    <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"অট\'মেটেড টেলাৰ মেচিন"</string>
+    <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"হোটেল"</string>
+    <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"ল\'ভ হোটেল"</string>
+    <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"ঘৰত দৈনন্দিন ব্যৱহৃত সামগ্ৰীসমূহৰ দোকান"</string>
+    <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"বিদ্যালয়"</string>
+    <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"ডিপার্টমেণ্টেল ষ্ট\'ৰ"</string>
+    <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"কাৰখানা"</string>
+    <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"ইজাকায়া লেম"</string>
+    <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"জাপানী দুৰ্গ"</string>
+    <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"ইউৰোপীয় দুৰ্গ"</string>
+    <!-- no translation found for spoken_emoji_1F3F3 (6471977885401554862) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3F4 (6634164537580574234) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3F5 (5247950040998935573) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3F7 (5140855387008703511) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3F8 (7061216387824058281) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3F9 (1287386031701875351) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3FA (972388608151034163) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3FB (2482905976407635663) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3FC (2438230702000819552) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3FD (8205610118230779658) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3FE (2707903021796601195) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F3FF (12056714027518795) -->
+    <skip />
+    <string name="spoken_emoji_1F400" msgid="2063034795679578294">"এন্দুৰ"</string>
+    <string name="spoken_emoji_1F401" msgid="6736421616217369594">"নিগনি"</string>
+    <string name="spoken_emoji_1F402" msgid="7276670995895485604">"ষাঁড়গৰু"</string>
+    <string name="spoken_emoji_1F403" msgid="8045709541897118928">"ম\'হ"</string>
+    <string name="spoken_emoji_1F404" msgid="5240777285676662335">"গাই গৰু"</string>
+    <!-- no translation found for spoken_emoji_1F405 (4304847753343143926) -->
+    <skip />
+    <string name="spoken_emoji_1F406" msgid="5163461930159540018">"নাহফুটুকী বাঘ"</string>
+    <string name="spoken_emoji_1F407" msgid="6905370221172708160">"শহা"</string>
+    <string name="spoken_emoji_1F408" msgid="1362164550508207284">"মেকুৰী"</string>
+    <string name="spoken_emoji_1F409" msgid="8476130983168866013">"ড্ৰেগন"</string>
+    <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"ঘঁৰিয়াল"</string>
+    <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"তিমি"</string>
+    <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"শামুক"</string>
+    <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"সাপ"</string>
+    <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"ঘোঁৰা"</string>
+    <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"ৰামছাগলী"</string>
+    <string name="spoken_emoji_1F410" msgid="8686765722255775031">"ছাগলী"</string>
+    <string name="spoken_emoji_1F411" msgid="3585715397876383525">"ভেড়া"</string>
+    <string name="spoken_emoji_1F412" msgid="4924794582980077838">"বান্দৰ"</string>
+    <string name="spoken_emoji_1F413" msgid="1460475310405677377">"মতা কুকুৰা"</string>
+    <string name="spoken_emoji_1F414" msgid="5857296282631892219">"কুকুৰাৰ পোৱালী"</string>
+    <string name="spoken_emoji_1F415" msgid="5920041074892949527">"কুকুৰ"</string>
+    <string name="spoken_emoji_1F416" msgid="4362403392912540286">"গাহৰি"</string>
+    <string name="spoken_emoji_1F417" msgid="6836978415840795128">"বন গাহৰি"</string>
+    <string name="spoken_emoji_1F418" msgid="7926161463897783691">"হাতী"</string>
+    <string name="spoken_emoji_1F419" msgid="1055233959755784186">"অক্টোপাছ"</string>
+    <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"শামুকৰ খোলা"</string>
+    <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"পোক"</string>
+    <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"পৰুৱা"</string>
+    <string name="spoken_emoji_1F41D" msgid="718579308764058851">"মৌ-মাখি"</string>
+    <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"সোণপৰুৱা"</string>
+    <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"মাছ"</string>
+    <string name="spoken_emoji_1F420" msgid="1041145003133609221">"গ্ৰীষ্মমণ্ডলীয় অঞ্চলৰ মাছ"</string>
+    <string name="spoken_emoji_1F421" msgid="1748378324417438751">"ব্ল\'ফিশ্ব"</string>
+    <string name="spoken_emoji_1F422" msgid="4106724877523329148">"কাছ"</string>
+    <string name="spoken_emoji_1F423" msgid="4077407945958691907">"কণী ফুটি ওলোৱা কুকুৰাৰ পোৱালি"</string>
+    <string name="spoken_emoji_1F424" msgid="6911326019270172283">"কুকুৰা পোৱালী"</string>
+    <string name="spoken_emoji_1F425" msgid="5466514196557885577">"সন্মুখলৈ চাই থকা কুকুৰা পোৱালি"</string>
+    <string name="spoken_emoji_1F426" msgid="2163979138772892755">"চৰাই"</string>
+    <string name="spoken_emoji_1F427" msgid="3585670324511212961">"পেংগুইন"</string>
+    <string name="spoken_emoji_1F428" msgid="7955440808647898579">"কোৱালা"</string>
+    <string name="spoken_emoji_1F429" msgid="5028269352809819035">"পোডল"</string>
+    <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"এটা কুঁজৰ উট"</string>
+    <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"দুটা কুঁজ থকা উট"</string>
+    <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"ড\'লফিন"</string>
+    <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"নিগনিৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"গৰুৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"বাঘৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F430" msgid="525492897063150160">"শহাৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F431" msgid="6051358666235016851">"মেকুৰীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F432" msgid="7698001871193018305">"ড্ৰেগনৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F433" msgid="3762356053512899326">"স্পাউটিং তিমি"</string>
+    <string name="spoken_emoji_1F434" msgid="3619943222159943226">"ঘোঁৰাৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F435" msgid="59199202683252958">"বান্দৰৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F436" msgid="340544719369009828">"কুকুৰৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F437" msgid="1219818379784982585">"গাহৰিৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F438" msgid="9128124743321008210">"ভেকুলীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F439" msgid="1424161319554642266">"হেমষ্টাৰৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"কুকুৰনেচীয়া বাঘৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"ভালুকৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"পাণ্ডাৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"গাহৰিৰ নাক"</string>
+    <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"হাতোৰাৰ ছাপ"</string>
+    <!-- no translation found for spoken_emoji_1F43F (84025195766364970) -->
+    <skip />
+    <string name="spoken_emoji_1F440" msgid="7144338258163384433">"চকু"</string>
+    <!-- no translation found for spoken_emoji_1F441 (5716781405495001412) -->
+    <skip />
+    <string name="spoken_emoji_1F442" msgid="1905515392292676124">"কাণ"</string>
+    <string name="spoken_emoji_1F443" msgid="1491504447758933115">"নাক"</string>
+    <string name="spoken_emoji_1F444" msgid="3654613047946080332">"মুখ"</string>
+    <string name="spoken_emoji_1F445" msgid="7024905244040509204">"জিভা"</string>
+    <string name="spoken_emoji_1F446" msgid="2150365643636471745">"বগা পৃষ্ঠপটত ঊৰ্ধ্বমুখী তর্জনী আঙুলিৰ সৈতে হাতৰ পিছফাল"</string>
+    <string name="spoken_emoji_1F447" msgid="8794022344940891388">"তলফালে নিৰ্দেশ কৰা তৰ্জনী আঙুলি"</string>
+    <string name="spoken_emoji_1F448" msgid="3261812959215550650">"বগা পৃষ্ঠপটত বাওঁফালে নির্দেশ কৰা তর্জনী আঙুলিৰ সৈতে হাতৰ পিছফাল"</string>
+    <string name="spoken_emoji_1F449" msgid="4764447975177805991">"সোঁফালে নিৰ্দেশ কৰা তৰ্জনী আঙুলি"</string>
+    <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"হাতৰ মুঠিৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"হাত-বাউলি দি থকা ভংগী"</string>
+    <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"সকলো ঠিক আছে বুজোৱা হাতৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"উৎসাহব্যঞ্জক ভংগি"</string>
+    <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"বুঢ়া আঙুলি তললৈ নির্দেশ কৰি অসন্মতি সূচোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"হাত-চাপৰি বজোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F450" msgid="1012021072085157054">"খোলা মুঠি বুজোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F451" msgid="8257466714629051320">"ৰাজমুকুট"</string>
+    <string name="spoken_emoji_1F452" msgid="4567394011149905466">"মহিলাসকলে পিন্ধা টুপী"</string>
+    <string name="spoken_emoji_1F453" msgid="5978410551173163010">"চশমা"</string>
+    <string name="spoken_emoji_1F454" msgid="348469036193323252">"নে\'ক-টাই"</string>
+    <string name="spoken_emoji_1F455" msgid="5665118831861433578">"টি-শ্বাৰ্ট"</string>
+    <string name="spoken_emoji_1F456" msgid="1890991330923356408">"জিনছ্"</string>
+    <string name="spoken_emoji_1F457" msgid="3904310482655702620">"পোছাক"</string>
+    <string name="spoken_emoji_1F458" msgid="5704243858031107692">"কিম\'ন\'"</string>
+    <string name="spoken_emoji_1F459" msgid="3553148747050035251">"বিকিনি"</string>
+    <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"মহিলাৰ পোছাক"</string>
+    <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"পাৰ্চ"</string>
+    <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"হেণ্ডবেগ"</string>
+    <string name="spoken_emoji_1F45D" msgid="812176504300064819">"সৰু বেগ"</string>
+    <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"পুৰুষৰ জোতা"</string>
+    <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"ক্ৰীড়াবিদে পিন্ধা জোতা"</string>
+    <string name="spoken_emoji_1F460" msgid="305863879170420855">"ওখ খুৰাযুক্ত জোতা"</string>
+    <string name="spoken_emoji_1F461" msgid="5160493217831417630">"মহিলাৰ ছেণ্ডেল"</string>
+    <string name="spoken_emoji_1F462" msgid="1722897795554863734">"মহিলাৰ বুট জোতা"</string>
+    <string name="spoken_emoji_1F463" msgid="5850772903593010699">"পদচিহ্ন"</string>
+    <string name="spoken_emoji_1F464" msgid="1228335905487734913">"আবক্ষ প্ৰতিমাৰ ছাঁয়ামূৰ্তি"</string>
+    <string name="spoken_emoji_1F465" msgid="4461307702499679879">"দুজন ব্যক্তিৰ আবক্ষমূৰ্তি"</string>
+    <string name="spoken_emoji_1F466" msgid="1938873085514108889">"ল\'ৰা"</string>
+    <string name="spoken_emoji_1F467" msgid="8237080594860144998">"ছোৱালী"</string>
+    <string name="spoken_emoji_1F468" msgid="6081300722526675382">"পুৰুষ"</string>
+    <string name="spoken_emoji_1F469" msgid="1090140923076108158">"মহিলা"</string>
+    <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"পৰিয়াল"</string>
+    <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"হাতে হাত ধৰা পুৰুষ-মহিলা"</string>
+    <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"দুজন মানুহে হাতে-হাত ধৰি থকা ছবি"</string>
+    <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"দুগৰাকী মহিলাই হাতে হাত ধৰি থকা ভংগী"</string>
+    <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"আৰক্ষী বিষয়া"</string>
+    <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"পুতলা শহাপহুৰ কাণ পিন্ধা মহিলা"</string>
+    <string name="spoken_emoji_1F470" msgid="6409995400510338892">"ওৰণি লোৱা কইনা"</string>
+    <string name="spoken_emoji_1F471" msgid="3058247860441670806">"সোণালী ৰঙৰ চুলিৰ ব্যক্তি"</string>
+    <string name="spoken_emoji_1F472" msgid="3928854667819339142">"চীনা টুপী পৰিহিত মানুহ"</string>
+    <string name="spoken_emoji_1F473" msgid="5921952095808988381">"পাগুৰি পৰিহিত মানুহ"</string>
+    <string name="spoken_emoji_1F474" msgid="1082237499496725183">"বয়সীয়াল মানুহ"</string>
+    <string name="spoken_emoji_1F475" msgid="7280323988642212761">"বয়সস্থ মহিলা"</string>
+    <string name="spoken_emoji_1F476" msgid="4713322657821088296">"কেঁচুৱা"</string>
+    <string name="spoken_emoji_1F477" msgid="2197036131029221370">"নিৰ্মাণ কার্যত জড়িত শ্ৰমিক"</string>
+    <string name="spoken_emoji_1F478" msgid="7245521193493488875">"ৰাজকুমাৰী"</string>
+    <string name="spoken_emoji_1F479" msgid="6876475321015553972">"জাপানী দানৱ"</string>
+    <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"জাপানী গ\'বলিন"</string>
+    <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"ভূত"</string>
+    <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"শিশু দেৱদূত"</string>
+    <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"বহিৰ্জাগতিক প্ৰাণী"</string>
+    <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"বহিৰ্গ্ৰহৰ দানৱ"</string>
+    <string name="spoken_emoji_1F47F" msgid="441605977269926252">"দুষ্ট ভূত পোৱালী"</string>
+    <string name="spoken_emoji_1F480" msgid="3696253485164878739">"লাওখোলা"</string>
+    <string name="spoken_emoji_1F481" msgid="320408708521966893">"তথ্য যোগান ধৰা ডেস্কত থকা লোক"</string>
+    <string name="spoken_emoji_1F482" msgid="3424354860245608949">"ৰখীয়া"</string>
+    <string name="spoken_emoji_1F483" msgid="3221113594843849083">"নৰ্তকী"</string>
+    <string name="spoken_emoji_1F484" msgid="7348014979080444885">"লিপষ্টিক"</string>
+    <string name="spoken_emoji_1F485" msgid="6133507975565116339">"নেইল প\'লিশ্ব"</string>
+    <string name="spoken_emoji_1F486" msgid="9085459968247394155">"মুখমণ্ডল মালিছ কৰা"</string>
+    <string name="spoken_emoji_1F487" msgid="1479113637259592150">"চুলি কটোৱা"</string>
+    <string name="spoken_emoji_1F488" msgid="6922559285234100252">"নাপিতৰ খুঁটি"</string>
+    <string name="spoken_emoji_1F489" msgid="8114863680950147305">"ছিৰিঞ্জ"</string>
+    <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"পিল"</string>
+    <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"চুম্বনৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"প্ৰেমপত্ৰ"</string>
+    <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"আঙঠি"</string>
+    <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"ৰত্ন পাথৰ"</string>
+    <string name="spoken_emoji_1F48F" msgid="741593675183677907">"চুম্বন"</string>
+    <string name="spoken_emoji_1F490" msgid="4482549128959806736">"ফুলৰ থোপা"</string>
+    <string name="spoken_emoji_1F491" msgid="2305245307882441500">"হৃদয় চিহ্নৰ সৈতে পুৰুষ আৰু মহিলা"</string>
+    <string name="spoken_emoji_1F492" msgid="3884119934804475732">"বিবাহ"</string>
+    <string name="spoken_emoji_1F493" msgid="1208828371565525121">"স্পন্দিত হৃদয়"</string>
+    <string name="spoken_emoji_1F494" msgid="6198876398509338718">"ভঙা হৃদয়"</string>
+    <string name="spoken_emoji_1F495" msgid="9206202744967130919">"দুখন হৃদয়"</string>
+    <string name="spoken_emoji_1F496" msgid="5436953041732207775">"চিকমিকাই থকা হৃদয়"</string>
+    <string name="spoken_emoji_1F497" msgid="7285142863951448473">"বৰ্ধমান হৃদয়"</string>
+    <string name="spoken_emoji_1F498" msgid="7940131245037575715">"হৃদয় আৰু কাঁড়"</string>
+    <string name="spoken_emoji_1F499" msgid="4453235040265550009">"নীলা ৰঙৰ হৃদয়"</string>
+    <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"সেউজীয়া ৰঙৰ হৃদয়"</string>
+    <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"হালধীয়া ৰঙৰ হৃদয়"</string>
+    <string name="spoken_emoji_1F49C" msgid="453829540120898698">"বেঙুনীয়া ৰঙৰ হৃদয়ৰ ছবি"</string>
+    <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"ফিটাৰ সৈতে হৃদয়"</string>
+    <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"আৱৰ্তন কৰি থকা হৃদয়"</string>
+    <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"হৃদয় প্ৰতীকৰ সৈতে সজোৱা কাৰ্য"</string>
+    <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"ভিতৰত এটা বিন্দু থকা হীৰাৰ আকৃতি"</string>
+    <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"বৈদ্যুতিক বাতি"</string>
+    <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"খঙৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"বোমা"</string>
+    <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"নিদ্ৰাৰত অৱস্থাৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"সংঘৰ্ষৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"ঘাম ওলোৱা বুজোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"টোপাল"</string>
+    <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"প্ৰচণ্ড বেগেৰে গতি কৰাৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"এদ\'ম বিষ্ঠা"</string>
+    <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"ফুলোৱা বাইচেপ"</string>
+    <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"মূৰ ঘূৰোৱাৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"সংলাপ বুজোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"চিন্তা-ভাবনাৰ বেলুন"</string>
+    <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"বগা ফুল"</string>
+    <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"এশ পইণ্ট বুজোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"মানি বেগ"</string>
+    <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"মুদ্ৰাৰ বিনিময়"</string>
+    <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"ডাঠকৈ অংকিত ড\'লাৰৰ চিন"</string>
+    <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"ক্ৰেডিট কাৰ্ড"</string>
+    <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"য়েন চিনযুক্ত বেংকনোটৰ ছবি"</string>
+    <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"ডলাৰ চিহ্ন থকা বেংক ন\'ট বুজোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"ইউৰ\' চিনযুক্ত বেংকনোটৰ ছবি"</string>
+    <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"পাউণ্ড চিনযুক্ত বেংকনোটৰ ছবি"</string>
+    <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"পাখী লগা পইচা"</string>
+    <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"ঊৰ্ধ্বমুখী প্ৰৱণতাৰ সৈতে চ্চাৰ্ট আৰু য়েনৰ চিন"</string>
+    <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"আসন"</string>
+    <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"ব্যক্তিগত কম্পিউটাৰ"</string>
+    <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"ব্ৰিফকেছ"</string>
+    <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"সৰু ডিস্ক"</string>
+    <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"ফ্ল\'পী ডিস্ক"</string>
+    <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"অপ্টিকেল ডিস্ক"</string>
+    <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"ডি. ভি. ডি."</string>
+    <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"ফাইলৰ ফ\'ল্ডাৰ"</string>
+    <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"খোলা ফাইলৰ ফ\'ল্ডাৰ"</string>
+    <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"চুক মেৰখাই থকা পৃষ্ঠা"</string>
+    <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"সোঁফালটো মুখৰফালে পাক খাই থকা পৃষ্ঠা"</string>
+    <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"কেলেণ্ডাৰ"</string>
+    <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"বেৰত ওলমাই থোৱা কেলেণ্ডাৰ"</string>
+    <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"কাৰ্ড ইণ্ডেক্স"</string>
+    <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"ঊৰ্ধ্বমুখী প্ৰৱণতাৰ সৈতে চ্চাৰ্ট"</string>
+    <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"অধোগামী প্ৰৱণতাৰ সৈতে চ্চাৰ্ট"</string>
+    <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"দণ্ড চিত্ৰ"</string>
+    <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"ক্লিপব\'ৰ্ড"</string>
+    <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"পুশ্বপিন"</string>
+    <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"ওপৰৰ অংশ গোলাকাৰ আকৃতিৰ হেঁচি দিলে সোমোৱা গজাল"</string>
+    <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"পেপাৰক্লিপ"</string>
+    <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"পোন ৰুলাৰ"</string>
+    <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"ত্ৰিকোণাকাৰ ৰুলাৰ"</string>
+    <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"বুকমার্কৰ টেব"</string>
+    <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"লেজাৰ"</string>
+    <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"টোকাবহী"</string>
+    <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"সুন্দৰকৈ সজোৱা ক\'ভাৰৰ টোকাবহী"</string>
+    <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"বন্ধ কিতাপ"</string>
+    <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"খোলা কিতাপ"</string>
+    <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"সেউজীয়া ৰঙৰ কিতাপ"</string>
+    <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"নীলা ৰঙৰ কিতাপ"</string>
+    <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"কমলা ৰঙৰ কিতাপ"</string>
+    <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"কিতাপ"</string>
+    <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"নাম লিখা বেজ"</string>
+    <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"স্ক্ৰ\'ল"</string>
+    <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"মেম\'"</string>
+    <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"টেলিফ\'ন ৰিচিভাৰ"</string>
+    <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"পেজাৰ"</string>
+    <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"ফেক্স মেচিন"</string>
+    <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"উপগ্ৰহৰ পৰা তথ্য আহৰণ কৰা এণ্টেনা"</string>
+    <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"ৰাইজক উদ্দেশ্য কৰি ব্যৱহৃত লাউডস্পীকাৰ"</string>
+    <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"হৰ্ষধ্বনিৰ কাৰণে মেগাফ\'ন"</string>
+    <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"আউটবক্স ট্ৰে\'"</string>
+    <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"ইনবক্স ট্ৰে\'"</string>
+    <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"টোপোলা"</string>
+    <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"ই-মেইলৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"অন্তৰ্গামী লেফাফা"</string>
+    <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"ওপৰত অধোগামী কাঁড় চিহ্ন থকা খাম"</string>
+    <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"নিম্নগামী পতাকাযুক্ত বন্ধ চিঠিৰ বাকচ"</string>
+    <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"উত্তোলিত পতাকাযুক্ত বন্ধ চিঠিৰ বাকচ"</string>
+    <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"উত্তোলিত পতাকাযুক্ত খোলা চিঠিৰ বাকচ"</string>
+    <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"নিম্নগামী পতাকাযুক্ত খোলা চিঠিৰ বাকচ"</string>
+    <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"প\'ষ্টবাকচ"</string>
+    <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"ডাক পেঁপা"</string>
+    <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"বাতৰিকাকত"</string>
+    <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"ম\'বাইল ফ\'ন"</string>
+    <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"বাওঁফালে স্থিত সোঁফালে নিদের্শ কৰা কাঁড়ৰ চিহ্নসহ ম\'বাইল ফ\'ন"</string>
+    <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"কম্পন ম\'ড"</string>
+    <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"অফ হৈ থকা ম\'বাইল ফ\'ন"</string>
+    <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"ম\'বাইল ফ\'নৰ ব্যৱহাৰ নিষিদ্ধ"</string>
+    <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"ছিংগনেলৰ দণ্ডৰ সৈতে এণ্টেনা"</string>
+    <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"কেমেৰা"</string>
+    <!-- no translation found for spoken_emoji_1F4F8 (6874216216317936645) -->
+    <skip />
+    <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"ভিডিঅ\' কেমেৰা"</string>
+    <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"দূৰদৰ্শন"</string>
+    <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"ৰেডিঅ’"</string>
+    <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"ভিডিঅ\' কেছেট"</string>
+    <!-- no translation found for spoken_emoji_1F4FD (992184090920043081) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F4FF (6566102135671766103) -->
+    <skip />
+    <string name="spoken_emoji_1F500" msgid="2389947994502144547">"পাকখোৱা সোঁফালে নির্দেশ কৰা দুডাল কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F501" msgid="2132188352433347009">"ঘড়ীৰ কাটাৰ দিশত থকা সোঁফালে আৰু বাওঁফালে নির্দেশ কৰা দুডাল পৃথক কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F502" msgid="2361976580513178391">"ঘড়ীৰ কাটাৰ দিশত সোঁফালে আৰু বাওঁফালে বৃত্তাকৃতিৰ আৱৰণেৰে খোলা মুখৰ চক্ৰাকাৰ কাঁড়"</string>
+    <string name="spoken_emoji_1F503" msgid="8936283551917858793">"ঘড়ীৰ কাটাৰ দিশত নিম্নমুখী আৰু ঊৰ্ধ্বমুখী চক্ৰাকাৰ কাঁড়ৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F504" msgid="708290317843535943">"ঘড়ীৰ কাটাৰ বিপৰীত দিশত তলমুৱা আৰু ওপৰমুৱা খোলা মুখৰ চক্ৰাকাৰ কাঁড়"</string>
+    <string name="spoken_emoji_1F505" msgid="6348909939004951860">"কম উজ্জ্বলতাৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F506" msgid="4449609297521280173">"অত্যন্ত উজ্জ্বল সূচোৱা প্ৰতীক"</string>
+    <string name="spoken_emoji_1F507" msgid="7136386694923708448">"শব্দ নিৰৱ কৰা চিহ্ন থকা স্পীকাৰ"</string>
+    <string name="spoken_emoji_1F508" msgid="5063567689831527865">"স্পীকাৰ"</string>
+    <string name="spoken_emoji_1F509" msgid="3948050077992370791">"এটা ধ্বনি তৰংগৰ সৈতে স্পীকাৰ"</string>
+    <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"তিনিডাল শব্দ ধ্বনিৰ চিহ্ন থকা স্পীকাৰ"</string>
+    <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"বেটাৰি"</string>
+    <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"বৈদ্যুতিক প্লাগ"</string>
+    <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"বাওঁফালে নিৰ্দেশ কৰা আতচী কাচ"</string>
+    <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"সোঁফালে নিৰ্দেশ কৰা আতচী কাচ"</string>
+    <string name="spoken_emoji_1F50F" msgid="915079280472199605">"তলা আৰু চিঁয়াহী কলম"</string>
+    <string name="spoken_emoji_1F510" msgid="7658381761691758318">"চাবিৰ সৈতে বন্ধ তলা"</string>
+    <string name="spoken_emoji_1F511" msgid="262319867774655688">"চাবি"</string>
+    <string name="spoken_emoji_1F512" msgid="5628688337255115175">"তলা"</string>
+    <string name="spoken_emoji_1F513" msgid="8579201846619420981">"খোল খাই থকা তলা"</string>
+    <string name="spoken_emoji_1F514" msgid="7027268683047322521">"ঘণ্টা"</string>
+    <string name="spoken_emoji_1F515" msgid="8903179856036069242">"কোনোধৰণৰ শব্দ কৰা নিষেধ"</string>
+    <string name="spoken_emoji_1F516" msgid="108097933937925381">"বুকমার্ক"</string>
+    <string name="spoken_emoji_1F517" msgid="2450846665734313397">"শিকলিৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F518" msgid="7028220286841437832">"ৰেডিঅ\' বুটাম"</string>
+    <string name="spoken_emoji_1F519" msgid="8211189165075445687">"ওপৰত বাওঁফালে নিদের্শ কৰা কাঁড়ৰ চিহ্ন থকা \'বেক\' লিখা বর্গ"</string>
+    <string name="spoken_emoji_1F51A" msgid="823966751787338892">"বাওঁফালে নির্দেশ কৰা কাঁড়ৰ চিহ্নৰ তলত \'End\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"সোঁ-বাওঁ দুয়োফালে নির্দেশ কৰা কাঁড়ৰ চিহ্নৰ তলত \'On\' লিখা বর্গ"</string>
+    <string name="spoken_emoji_1F51C" msgid="110609810659826676">"সোঁফালে নির্দেশ কৰা কাঁড়ৰ চিহ্নৰ তলত \'Soon\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"ওপৰলৈ নির্দেশ কৰা কাঁড়ৰ চিহ্নৰ তলত \'Top\' লিখা থকা বর্গ"</string>
+    <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"ওঠৰ বছৰৰ তলৰ লোকৰ প্ৰৱেশ নিষেধ সূচোৱা প্ৰতীক"</string>
+    <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"কীকেপ টেন"</string>
+    <string name="spoken_emoji_1F520" msgid="7335109890337048900">"লেটিন বৰফলা আখৰৰ বাবে ইনপুট চিহ্ন"</string>
+    <string name="spoken_emoji_1F521" msgid="2693185864450925778">"লেটিন সৰুফলাৰ আখৰৰ বাবে ইনপুট চিহ্ন"</string>
+    <string name="spoken_emoji_1F522" msgid="8419130286280673347">"সংখ্যাৰ ইনপুট সূচোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F523" msgid="3318053476401719421">"প্ৰতীকসমূহৰ বাবে ইনপুট চিহ্ন"</string>
+    <string name="spoken_emoji_1F524" msgid="1625073997522316331">"লেটিন ভাষাৰ বর্ণৰ ইনপুট সূচোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F525" msgid="4083884189172963790">"জুই"</string>
+    <string name="spoken_emoji_1F526" msgid="2035494936742643580">"বৈদ্যুতিক টৰ্চ লাইট"</string>
+    <string name="spoken_emoji_1F527" msgid="134257142354034271">"ৰেঞ্চ"</string>
+    <string name="spoken_emoji_1F528" msgid="700627429570609375">"হাতুৰি"</string>
+    <string name="spoken_emoji_1F529" msgid="7480548235904988573">"নট আৰু বল্টু"</string>
+    <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"হ\'চ\'"</string>
+    <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"পিষ্টল"</string>
+    <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"অণুবীক্ষণ যন্ত্ৰ"</string>
+    <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"দূৰবীক্ষণ যন্ত্ৰ"</string>
+    <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"স্ফটিকৰ বল"</string>
+    <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"ছয়টা চুক আৰু মাজত বিন্দু থকা তৰাচিহ্ন"</string>
+    <string name="spoken_emoji_1F530" msgid="3572898444281774023">"শিকাৰু বুজোৱা জাপানী চিহ্ন"</string>
+    <string name="spoken_emoji_1F531" msgid="5225633376450025396">"ত্ৰিশূলৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F532" msgid="9169568490485180779">"ক\'লা ৰঙৰ বর্গৰ বুটাম"</string>
+    <string name="spoken_emoji_1F533" msgid="6554193837201918598">"বৰ্গাকৃতিৰ বগা বুটাম"</string>
+    <string name="spoken_emoji_1F534" msgid="8339298801331865340">"ডাঙৰ ৰঙা বৃত্ত"</string>
+    <string name="spoken_emoji_1F535" msgid="1227403104835533512">"ডাঙৰ নীলা চক্ৰ"</string>
+    <string name="spoken_emoji_1F536" msgid="5477372445510469331">"কমলা ৰঙৰ ডাঙৰ হীৰা"</string>
+    <string name="spoken_emoji_1F537" msgid="3158915214347274626">"ডাঙৰ নীলা হীৰা"</string>
+    <string name="spoken_emoji_1F538" msgid="4300084249474451991">"সৰু কমলাৰঙী হীৰা"</string>
+    <string name="spoken_emoji_1F539" msgid="6535159756325742275">"সৰু নীলা হীৰা"</string>
+    <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"ঊর্ধ্বমুখী ৰঙা ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"তলমুৱা ৰঙা ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"ওপৰমুৱা সৰু ৰঙা ত্ৰিভুজ"</string>
+    <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"তলমুৱা সৰু ৰঙা ত্ৰিভুজ"</string>
+    <!-- no translation found for spoken_emoji_1F549 (4488493812823912137) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F54A (6329445861053369293) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F54B (1632185618342057203) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F54C (2444758230008443504) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F54D (8871149889908118955) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F54E (2602602033588655819) -->
+    <skip />
+    <string name="spoken_emoji_1F550" msgid="7761392621689986218">"ঘড়ীত এটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F551" msgid="2699448504113431716">"ঘড়ীত দুটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F552" msgid="5872107867411853750">"ঘড়ীত তিনিটা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F553" msgid="8490966286158640743">"ঘড়ীত চাৰিটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F554" msgid="7662585417832909280">"ঘড়ীত পাঁচটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F555" msgid="5564698204520412009">"ঘড়ীত ছয়টা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F556" msgid="7325712194836512205">"ঘড়ীত সাতটা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F557" msgid="4398343183682848693">"ঘড়ীত আঠটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F558" msgid="3110507820404018172">"ঘড়ীত নটা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F559" msgid="2972160366448337839">"ঘড়ীত দহটা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"ঘড়ীত এঘাৰটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"ঘড়ীত বাৰটা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"ঘড়ীত ডেৰটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"ঘড়ীত আঢ়ৈটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"ঘড়ীত চাৰে তিনিটা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"ঘড়ীত চাৰে চাৰিটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F560" msgid="5771339179963924448">"ঘড়ীত চাৰে পাচঁটা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F561" msgid="3139944777062475382">"ঘড়ীত চাৰে ছয়টা বজা দৃশ্য"</string>
+    <string name="spoken_emoji_1F562" msgid="8273944611162457084">"ঘড়ীত সাত বাজি ত্ৰিশ মিনিট দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F563" msgid="8643976903718136299">"ঘড়ীত চাৰে আঠটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F564" msgid="3511070239796141638">"ঘড়ীত চাৰে নটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F565" msgid="4567451985272963088">"ঘড়ীত চাৰে দহটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F566" msgid="2790552288169929810">"ঘড়ীত চাৰে এঘাৰটা বজা দেখুৱাইছে"</string>
+    <string name="spoken_emoji_1F567" msgid="9026037362100689337">"ঘড়ীত চাৰে বাৰটা বজা দেখুৱাইছে"</string>
+    <!-- no translation found for spoken_emoji_1F56F (2425394083258103670) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F570 (2611444774363424788) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F573 (1039753319384915644) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F574 (1370973157808858727) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F575 (3393287560881832534) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F576 (6510040886626337527) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F577 (1745605672232546738) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F578 (5843261607004481128) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F579 (356353388497335187) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F587 (1529578701645787678) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F58A (5535685878758638056) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F58B (8383182102775796958) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F58C (3645908884921776727) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F58D (8498569396909368249) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F590 (1764003432828568259) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F595 (2331418391124951688) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F596 (1326418921526428839) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5A5 (5652785146334053695) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5A8 (1431495880490623659) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5B1 (5175363198176970281) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5B2 (638466571223781802) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5BC (2406817930103032256) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5C2 (5722791826015378721) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5C3 (2361411623100608566) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5C4 (5699005642361736394) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5D1 (8837990226577655561) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5D2 (875563245704330618) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5D3 (5759637997516385074) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5DC (2134509111665528807) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5DD (2537536524658220506) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5DE (369717954301912562) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5E1 (4756313645316161687) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5E3 (725415936980269374) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5EF (6775383222346053007) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5F3 (5365297662012404100) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F5FA (4806783543043181633) -->
+    <skip />
+    <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"মাউণ্ট ফুজি"</string>
+    <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"ট\'কিঅ\' টাৱাৰ"</string>
+    <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"ষ্টেচু অৱ লিবাৰ্টী"</string>
+    <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"জাপানৰ মেপ"</string>
+    <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"ম\'য়াই মূর্তি"</string>
+    <string name="spoken_emoji_1F600" msgid="7601109464776835283">"হাঁহিমুখীয়া চেহেৰা"</string>
+    <string name="spoken_emoji_1F601" msgid="746026523967444503">"হাঁহি থকা চকুৰে হাঁহিমুখীয়া চেহেৰা"</string>
+    <string name="spoken_emoji_1F602" msgid="8354558091785198246">"আনন্দৰ চকুলোৰ সৈতে মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F603" msgid="3861022912544159823">"মেলা মুখেৰে হাঁহি থকা চেহেৰা"</string>
+    <string name="spoken_emoji_1F604" msgid="5119021072966343531">"মুখ মেলি হাঁহি থকা মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F605" msgid="6140813923973561735">"খোলা মুখ আৰু শীতল ঘামেৰে হাঁহি থকা মুখ"</string>
+    <string name="spoken_emoji_1F606" msgid="3549936813966832799">"মেলা মুখেৰে কিন্তু জোৰকৈ চকু মুদি হাঁহি থকা চেহেৰা"</string>
+    <string name="spoken_emoji_1F607" msgid="2826424078212384817">"মৰলৰ সৈতে হাঁহিমুখীয়া ভংগী"</string>
+    <string name="spoken_emoji_1F608" msgid="7343559595089811640">"শিঙৰ সৈতে হাঁহিমুখীয়া মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F609" msgid="5481030187207504405">"চকু টিপিয়াই থকা মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"চকুৰে প্ৰকাশ পোৱা হাঁহিমুখীয়া মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"সুস্বাদু খাদ্যৰ আমেজ লোৱা চেহেৰা"</string>
+    <string name="spoken_emoji_1F60C" msgid="349384012958268496">"স্বস্তি অনুভৱ কৰা মুখ"</string>
+    <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"হৃদয় আকৃতিৰ চকুসহ হাঁহি থকা মুখ"</string>
+    <string name="spoken_emoji_1F60E" msgid="441718886380605643">"ছানগ্লাছ পৰিহিত হাঁহি থকা মুখ"</string>
+    <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"বেঁকা হাঁহি মৰা চেহেৰা"</string>
+    <string name="spoken_emoji_1F610" msgid="3225675825334102369">"কোনো ভংগী প্ৰকাশ নকৰা মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F611" msgid="7199179827619679668">"অনুভূতিহীন মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F612" msgid="985081329745137998">"বিৰক্ত মুখ"</string>
+    <string name="spoken_emoji_1F613" msgid="5548607684830303562">"ঘাম নির্গত হোৱা মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F614" msgid="3196305665259916390">"চিন্তিত মুখ"</string>
+    <string name="spoken_emoji_1F615" msgid="3051674239303969101">"বিভ্ৰান্ত চেহেৰা"</string>
+    <string name="spoken_emoji_1F616" msgid="8124887056243813089">"বিবুদ্ধিত পৰা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F617" msgid="7052733625511122870">"চুমা খোৱা মুখ"</string>
+    <string name="spoken_emoji_1F618" msgid="408207170572303753">"চুমা যঁচা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F619" msgid="8645430335143153645">"চকুৰে হাঁহি প্ৰকাশ পোৱা আৰু চুমা যঁচা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"চকু মুদি চুমা যঁচা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"বাহিৰলৈ জিভা উলিয়াই থকা মুখ"</string>
+    <string name="spoken_emoji_1F61C" msgid="198943912107589389">"চকু টিপিয়াই জিভা উলিয়াই থকা মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"চকু মুদি জিভা উলিয়াই থকা ধেমেলীয়া ভংগী"</string>
+    <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"নিৰাশ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"চিন্তিত চেহেৰা"</string>
+    <string name="spoken_emoji_1F620" msgid="6051942001307375830">"খঙাল মুখ"</string>
+    <string name="spoken_emoji_1F621" msgid="2114711878097257704">"খঙাল মুখ"</string>
+    <string name="spoken_emoji_1F622" msgid="29291014645931822">"কন্দনৰত মুখ"</string>
+    <string name="spoken_emoji_1F623" msgid="7803959833595184773">"অধ্যৱসায়ী চেহেৰা"</string>
+    <string name="spoken_emoji_1F624" msgid="8637637647725752799">"বিজয়ৰ আনন্দত আত্মহাৰা চেহেৰা"</string>
+    <string name="spoken_emoji_1F625" msgid="6153625183493635030">"হতাশ কিন্তু স্বস্তিৰ মুখ"</string>
+    <string name="spoken_emoji_1F626" msgid="6179485689935562950">"মুখ মেলি থকা ভ্ৰূ কুঞ্চিত মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F627" msgid="8566204052903012809">"ক্ষোভ প্ৰকাশ কৰা ভংগীৰে মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F628" msgid="8875777401624904224">"ভীতিগ্ৰস্ত চেহেৰা"</string>
+    <string name="spoken_emoji_1F629" msgid="1411538490319190118">"ক্লান্ত চেহেৰা"</string>
+    <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"টোপনি ধৰি থকা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"ক্লান্ত চেহেৰা"</string>
+    <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"মুখ বিকটাই থকা"</string>
+    <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"উচ্চস্বৰে কন্দনৰত চেহেৰা"</string>
+    <string name="spoken_emoji_1F62E" msgid="726083405284353894">"মুখ মেলি থকা চেহেৰা"</string>
+    <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"মৌন মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F630" msgid="3298804852155581163">"মেলা মুখ আৰু শীতল ঘামৰে ঘমাৰ্ত চেহেৰা"</string>
+    <string name="spoken_emoji_1F631" msgid="1603391150954646779">"শংকিত মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F632" msgid="4846193232203976013">"বিস্মিত চেহেৰা"</string>
+    <string name="spoken_emoji_1F633" msgid="4023593836629700443">"ৰঙাপৰা মুখ"</string>
+    <string name="spoken_emoji_1F634" msgid="3155265083246248129">"নিদ্ৰালু মুখ"</string>
+    <string name="spoken_emoji_1F635" msgid="4616691133452764482">"মূৰ ঘূৰণি হোৱা মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F636" msgid="947000211822375683">"মুখবিহীন চেহেৰা"</string>
+    <string name="spoken_emoji_1F637" msgid="1269551267347165774">"চিকিৎসা কাৰ্যত ব্যৱহাৰ কৰা মুখা"</string>
+    <string name="spoken_emoji_1F638" msgid="3410766467496872301">"হাঁহি থকা চকুৰে হাঁহিমুখীয়া মেকুৰীৰ চেহেৰা"</string>
+    <string name="spoken_emoji_1F639" msgid="1833417519781022031">"আনন্দৰ চকুলোৰ সৈতে মেকুৰীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"মেলা মুখেৰে হাঁহি থকা মেকুৰী"</string>
+    <string name="spoken_emoji_1F63B" msgid="74417995938927571">"হৃদয়ৰ আকাৰৰ চকুৰ হাঁহি মুখীয়া মেকুৰীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"বেঁকা হাঁহি মাৰি থকা মেকুৰী"</string>
+    <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"চকু মুদি চুমা খোৱা ভংগীৰ মেকুৰীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"খঙাল ভংগীৰ মেকুৰীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"কান্দি থকা ভংগীৰ মেকুৰীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F640" msgid="6023054549904329638">"বেঁকা হাঁহি মৰা মেকুৰী মুখ"</string>
+    <!-- no translation found for spoken_emoji_1F641 (2580807588556383139) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F642 (1150197386159721331) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F643 (7631520433919530552) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F644 (446284817942609022) -->
+    <skip />
+    <string name="spoken_emoji_1F645" msgid="5202090629227587076">"কোনো ভাল অভিব্যক্তি প্ৰকাশ নোপোৱা মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F646" msgid="6734425134415138134">"আস্বস্ত অনুভৱ কৰা চেহেৰা"</string>
+    <string name="spoken_emoji_1F647" msgid="1090285518444205483">"গভীৰভাৱে শিৰ নত কৰা ব্যক্তি"</string>
+    <string name="spoken_emoji_1F648" msgid="8978535230610522356">"বেয়া বস্তু নোচোৱা বান্দৰৰ চেহেৰা"</string>
+    <string name="spoken_emoji_1F649" msgid="8486145279809495102">"হাতেৰে কাণ ঢাকি থকা বান্দৰৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"হাতেৰে মুখ ঢাকি কথা নোকোৱা ভংগীত থকা বান্দৰৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"ওপৰলৈ এখন হাত দাঙি সুখী ব্যক্তিৰ চেহেৰা"</string>
+    <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"উল্লাসেৰে দুয়োখন হাত দাঙি থকা ব্যক্তিৰ চেহেৰা"</string>
+    <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"চেলাউৰি কোঁচ খুৱাই অস্বস্তি অনুভৱ কৰা ব্যক্তিৰ চেহেৰা"</string>
+    <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"খং কৰি থকা ব্যক্তি"</string>
+    <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"হাত সাৱটি থকা ব্যক্তিৰ চেহেৰা"</string>
+    <string name="spoken_emoji_1F680" msgid="513263736012689059">"ৰকেট"</string>
+    <string name="spoken_emoji_1F681" msgid="9201341783850525339">"হেলিকপ্টাৰ"</string>
+    <string name="spoken_emoji_1F682" msgid="8046933583867498698">"বাষ্পচালিত ৰে\'ল ইঞ্জিন"</string>
+    <string name="spoken_emoji_1F683" msgid="8772750354339223092">"ৰেলৰ ডবা"</string>
+    <string name="spoken_emoji_1F684" msgid="346396777356203608">"দ্ৰুতবেগী ৰে\'ল"</string>
+    <string name="spoken_emoji_1F685" msgid="1237059817190832730">"বন্ধুকৰ গুলি সদৃশ তীব্ৰ-গতিৰ ট্ৰেইন"</string>
+    <string name="spoken_emoji_1F686" msgid="3525197227223620343">"ট্ৰেইন"</string>
+    <string name="spoken_emoji_1F687" msgid="5110143437960392837">"মেট্ৰ\'"</string>
+    <string name="spoken_emoji_1F688" msgid="4702085029871797965">"পাতল চিৰিৰ ৰে\'ল পথ"</string>
+    <string name="spoken_emoji_1F689" msgid="2375851019798817094">"ষ্টেচন"</string>
+    <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"ট্ৰাম গাড়ী"</string>
+    <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"ট্ৰামৰ ডবা"</string>
+    <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"বাছ"</string>
+    <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"আহি থকা বাছ"</string>
+    <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"বৈদ্যুতিক শক্তিৰে চালিত বাছ"</string>
+    <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"বাছ আস্থান"</string>
+    <string name="spoken_emoji_1F690" msgid="8080964620200195262">"মিনিবাছ"</string>
+    <string name="spoken_emoji_1F691" msgid="999173032408730501">"এম্বুলেঞ্চ"</string>
+    <string name="spoken_emoji_1F692" msgid="1712863785341849487">"জুই নুমুৱা গাড়ী"</string>
+    <string name="spoken_emoji_1F693" msgid="7987109037389768934">"পুলিচৰ গাড়ী"</string>
+    <string name="spoken_emoji_1F694" msgid="6061658916653884608">"আহি থকা পুলিচৰ গাড়ী"</string>
+    <string name="spoken_emoji_1F695" msgid="6913445460364247283">"টেক্সি"</string>
+    <string name="spoken_emoji_1F696" msgid="6391604457418285404">"আহি থকা টেক্সি"</string>
+    <string name="spoken_emoji_1F697" msgid="7978399334396733790">"যান-বাহন"</string>
+    <string name="spoken_emoji_1F698" msgid="7006050861129732018">"আহি থকা যান"</string>
+    <string name="spoken_emoji_1F699" msgid="630317052666590607">"বিনোদনমূলক কামত ব্যৱহৃত বাহন"</string>
+    <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"বস্তু বিতৰণ কৰা ট্ৰাক"</string>
+    <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"ট্ৰাকৰ পিছফালে ট্ৰেইলাৰ লগোৱা দীঘল ল\'ৰী"</string>
+    <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"ট্ৰেক্টৰ"</string>
+    <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"ম\'ন\' ৰেল"</string>
+    <string name="spoken_emoji_1F69E" msgid="169238196389832234">"পাহাৰীয়া ৰে\'লপথ"</string>
+    <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"ওলমা ৰেলগাড়ী"</string>
+    <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"পর্বতত ব্যৱহাৰ হোৱা ৰজ্জুপথ"</string>
+    <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"কেবুলৰ সহায়ত চলা বায়বীয় ট্ৰাম"</string>
+    <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"জাহাজ"</string>
+    <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"বঠা মাৰি বোৱা নাও"</string>
+    <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"স্পীডব\'ট"</string>
+    <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"অানুভূমিক ট্ৰেফিক লাইট"</string>
+    <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"উলম্ব ট্ৰেফিক লাইট"</string>
+    <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"নিৰ্মাণ কাৰ্য প্ৰগতিত আছে সূচোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"আৱৰ্তিত লাইটসহ পুলিচৰ গাড়ী"</string>
+    <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"খুঁটাত আঁৰি থোৱা ত্ৰিভুজাকাৰ পতাকা"</string>
+    <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"দুৱাৰ"</string>
+    <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"প্ৰৱেশ নিষিদ্ধ সূচোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"ধূমপানৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"ধূমপান নিষেধৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"উপযুক্ত স্থানত পেলনীয়া বস্তুবোৰ পেলাবলৈ দিয়া চিহ্ন"</string>
+    <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"পেলনীয়া বস্তুবোৰ এই স্থানত পেলোৱা নিষেধ সূচোৱা চিহ্ন"</string>
+    <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"খোৱা পানীৰ প্ৰতীক"</string>
+    <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"পানী খোৱাৰ উপযোগী নোহোৱা বুজোৱা প্ৰতীক"</string>
+    <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"বাইচাইকেল"</string>
+    <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"চাইকেলৰ প্ৰৱেশ নিষেধ চিহ্ন"</string>
+    <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"চাইকেল আৰোহী"</string>
+    <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"পাৰ্বত্য পথত চাইকেল চলোৱা লোক"</string>
+    <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"পথচাৰী"</string>
+    <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"পদযাত্ৰীৰ প্ৰৱেশ নিষেধ"</string>
+    <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"শিশুৱে ৰাষ্টা পাৰ হোৱা ঠাই"</string>
+    <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"পুৰুষৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"মহিলাৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"শৌচাগাৰ"</string>
+    <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"কেঁচুৱাৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"শৌচালয়"</string>
+    <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"শৌচাগাৰৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"বাথৰুমৰ শ্বাৱাৰ"</string>
+    <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"স্নানাগাৰৰ চিহ্ন"</string>
+    <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"বাথটাব"</string>
+    <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"পাৰপত্ৰ নিয়ন্ত্ৰণ"</string>
+    <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"সীমাশুল্ক বিভাগ"</string>
+    <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"যাত্ৰীৰ বেগ ৰখা ঠাই"</string>
+    <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"সাময়িকভাৱে বস্তু ৰখা ঠাইৰ চিহ্ন"</string>
+    <!-- no translation found for spoken_emoji_1F6CB (3573872215992460856) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6CC (5533098630848925915) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6CD (4591419999684883647) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6CE (3747424887764059629) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6CF (4913111315645834484) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6D0 (7538197710400229967) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6E0 (3263282970310123206) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6E1 (6426910766335807918) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6E2 (5167605828052365314) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6E3 (1107731664336606313) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6E4 (5902467073917590761) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6E5 (5188878074701467086) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6E9 (5852950271931619238) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6EB (2733806707250741222) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6EC (4869529552294301253) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6F0 (3448012994947964984) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F6F3 (1127894976097893258) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F910 (4360725090163247960) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F911 (8595715714642200771) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F912 (6361337370946123054) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F913 (3175822147540114526) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F914 (3784454242803834936) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F915 (8277232429785015709) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F916 (4717142652070467513) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F917 (5434814678071084726) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F918 (6065030046434546286) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F980 (7396183110343909685) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F981 (1201691097417167784) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F982 (7295087763708065402) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F983 (9086413570044829984) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F984 (5757150507762082864) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F9C0 (3346738126264740148) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0023_20E3 (3693649188523505503) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_002A_20E3 (6500437684406442358) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0030_20E3 (6312420508970951699) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0031_20E3 (5101790681679370329) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0032_20E3 (6852105251673250734) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0033_20E3 (6436737625517381721) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0034_20E3 (7652958059237626893) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0035_20E3 (1222504383755215423) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0036_20E3 (7251599202525740371) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0037_20E3 (7717155024038170161) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0038_20E3 (744556233370117245) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_0039_20E3 (1891172571916106023) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1E8 (515584542061392145) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1E9 (9021988927513031086) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1EA (4856101611523027311) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1EB (3716145572492094038) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1EC (7286661601747455727) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1EE (94989132936786231) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1F1 (182374112533705554) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1F2 (8083744008211394946) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1F4 (1162797094210816783) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1F6 (8423968169207301745) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1F7 (6876638422035482357) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1F8 (8277196879892990334) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1F9 (2248522124836544558) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1FA (4458840480641529325) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1FC (1163927173985102777) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1FD (3030463315371570615) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E6_1F1FF (612355136879823825) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1E6 (8760838318301758538) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1E7 (3157629488105877061) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1E9 (3576256753416957572) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1EA (664083045789831960) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1EB (1288425089161930952) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1EC (7159669370784906474) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1ED (6171060568325681800) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1EE (8825724034337572789) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1EF (481381108368354037) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F1 (323880581960666092) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F2 (6865529687293471865) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F3 (6196184089269330603) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F4 (7901700697723663375) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F6 (3206988419974375148) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F7 (3483402348221577606) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F8 (3399891901314769071) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1F9 (8985883748925470425) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1FB (3357087874695825993) -->
+    <skip />
+    <string name="spoken_emoji_1F1E7_1F1FC" msgid="2010150990697392924">"ব\'টছোৱানাৰ পতাকা"</string>
+    <!-- no translation found for spoken_emoji_1F1E7_1F1FE (7660069185149104762) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E7_1F1FF (4808586235664381640) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1E6 (1994799795544707087) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1E8 (4545193589020675153) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1E9 (971846413301682398) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1EB (7040500840320409927) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1EC (7814411108372534362) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1ED (7525661715353339833) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1EE (918386022730555752) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1F0 (1272608483604229355) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1F1 (4368512465692540121) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1F2 (1029570029642994892) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1F3 (1409448857910840128) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1F4 (6875493644298026833) -->
+    <skip />
+    <string name="spoken_emoji_1F1E8_1F1F5" msgid="2538762550371590224">"ক্লীপার্টন দ্বীপৰ পতাকা"</string>
+    <!-- no translation found for spoken_emoji_1F1E8_1F1F7 (888554264338218550) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1FA (4443590407200355667) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1FB (5581596688027484825) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1FC (7291024802305602214) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1FD (2788698554656649228) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1FE (5037633794290940318) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E8_1F1FF (5384200881950442912) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E9_1F1EA (4047812762841623779) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E9_1F1EC (3569858113686878222) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E9_1F1EF (5200510107957246395) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E9_1F1F0 (8230065040498090250) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E9_1F1F2 (6971088854496559333) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E9_1F1F4 (2684281180913271831) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1E9_1F1FF (5134944828411359548) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EA_1F1E6 (5992703503107448385) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EA_1F1E8 (7604769613933532639) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EA_1F1EA (780881058311953116) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EA_1F1EC (5379955220214737541) -->
+    <skip />
+    <string name="spoken_emoji_1F1EA_1F1ED" msgid="608191363783136124">"দক্ষিণ ছাহাৰাৰ পতাকা"</string>
+    <!-- no translation found for spoken_emoji_1F1EA_1F1F7 (1974034165386559979) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EA_1F1F8 (7667964716717428380) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EA_1F1F9 (4028236645746627833) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EA_1F1FA (2605433302354957477) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EB_1F1EE (825447084506872225) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EB_1F1EF (1029994540873767904) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EB_1F1F0 (2992979756365410511) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EB_1F1F2 (1986035899283103062) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EB_1F1F4 (2441016703335601117) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EB_1F1F7 (6052493581307010327) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1E6 (8950853954004506523) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1E7 (8888357158195515349) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1E9 (3463286702486956748) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1EA (1180536780790586881) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1EB (1203001730316543314) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1EC (1840977808701617077) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1ED (8783297421754572238) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1EE (2567172982673015319) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F1 (8178317151097107486) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F2 (8595547572836079090) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F3 (3646326386653741855) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F5 (6864411408511905871) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F6 (2059115105795502868) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F7 (6459258808903505755) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F8 (5458754397575470944) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1F9 (1467915615110741560) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1FA (4393335139566648919) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1FC (3425188247186220041) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EC_1F1FE (1021690400460955309) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1ED_1F1F0 (3761740442568650190) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1ED_1F1F2 (6910358977247451757) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1ED_1F1F3 (1646439132096214446) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1ED_1F1F7 (1052046916656026391) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1ED_1F1F9 (8078385390509081446) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1ED_1F1FA (8804528562628572718) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1E8 (3140919483825058219) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1E9 (5502581798727777828) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1EA (644825647040215471) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F1 (5743874630545163729) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F2 (3120136719636059223) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F3 (7645444982385343194) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F4 (9194565409945825135) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F6 (8988731584319817673) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F7 (2725630029704415631) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F8 (1010746786020461229) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EE_1F1F9 (9197939415727389837) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EF_1F1EA (2768571528360031663) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EF_1F1F2 (5221399784104523954) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EF_1F1F4 (5417778604376647557) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1EF_1F1F5 (6507273654908139469) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1EA (21237090866742866) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1EC (8276011655824240009) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1ED (6083653169314926215) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1EE (9065926492362391494) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1F2 (3247483394872878766) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1F3 (5367548209741205839) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1F5 (8936494847635883781) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1F7 (6083499745947821288) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F0_1F1FC (1379041347924516759) -->
+    <skip />
+    <string name="spoken_emoji_1F1F0_1F1FE" msgid="4109777537443572630">"কে\'মেন দ্বীপপুঞ্জৰ পতাকা"</string>
+    <!-- no translation found for spoken_emoji_1F1F0_1F1FF (552222434607517957) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1E6 (5166202354177379139) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1E7 (5664910004482751646) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1E8 (4030901907323824445) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1EE (1173785145388735876) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1F0 (3577045271636841729) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1F7 (7993304871488957893) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1F8 (5224840012819747543) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1F9 (3594812865734584207) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1FA (224221840159454205) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1FB (7718987237653945359) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F1_1F1FE (5998022588266933168) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1E6 (8965537225940059216) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1E8 (5827062380829465964) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1E9 (1226461313141287009) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1EA (559788800834584573) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1EB (5222394276026013118) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1EC (7183384701516848699) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1ED (6898522028833048325) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F0 (7068152815895976960) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F1 (7611046424376988616) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F2 (491461913101284240) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F3 (1450454181585256539) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F4 (3352572139711280528) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F5 (7536142087380383112) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F6 (5424070233210033210) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F7 (108173332528207905) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F8 (4922582142276070473) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1F9 (3215356274998633531) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1FA (7064984448662302120) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1FB (7349657291755821742) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1FC (2970112458704297219) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1FD (6249447018233900361) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1FE (2415463066267602417) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F2_1F1FF (5374300224943425292) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1E6 (7995033472926590061) -->
+    <skip />
+    <string name="spoken_emoji_1F1F3_1F1E8" msgid="6673558559311734824">"নিউ কেলেড\'নিয়াৰ পতাকা"</string>
+    <!-- no translation found for spoken_emoji_1F1F3_1F1EA (5248874974108203948) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1EB (8586671186548769011) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1EC (3610271061141196804) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1EE (3793576318302879471) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1F1 (7394150679646822106) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1F4 (4823752697520630443) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1F5 (8143013034442974213) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1F7 (2718588476956930593) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1FA (2136206841853719289) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F3_1F1FF (7114679379862776721) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F4_1F1F2 (1366056698822189642) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1E6 (2318048598212415394) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1EA (3843366473938653876) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1EB (5842604724881232116) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1EC (1527509030357350666) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1ED (4519745708610996392) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1F0 (6461277576429215252) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1F1 (8076361813157658785) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1F2 (2895871984922747795) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1F3 (3351998070564812928) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1F7 (2273664192514768865) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1F8 (4184730889323208578) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1F9 (6088372177025496872) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1FC (6503480614531765009) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F5_1F1FE (8948077259790298897) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F6_1F1E6 (5941022501487103264) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F7_1F1EA (6520393107511408733) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F7_1F1F4 (24771949751001440) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F7_1F1F8 (3958542649861771783) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F7_1F1FA (1079726084663529719) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F7_1F1FC (3705031663938652819) -->
+    <skip />
+    <string name="spoken_emoji_1F1F8_1F1E6" msgid="2776179858340260230">"ছৌদী আৰবৰ পতাকা"</string>
+    <!-- no translation found for spoken_emoji_1F1F8_1F1E7 (3665472085378450456) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1E8 (4466400506433158307) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1E9 (5614788248607521243) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1EA (2665982185283861392) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1EC (1054034328208566506) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1ED (4263061939910522547) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1EE (6565744105871887098) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1EF (3016523221609614043) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F0 (5390016769601791982) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F1 (6403850165793367854) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F2 (4310711409277111575) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F3 (6489885135970927076) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F4 (5341079828952201668) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F7 (8817875467979840211) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F8 (2660263148212045846) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1F9 (8238122890022856070) -->
+    <skip />
+    <string name="spoken_emoji_1F1F8_1F1FB" msgid="4615906903576645230">"এল ছালভাড\'ৰৰ পতাকা"</string>
+    <!-- no translation found for spoken_emoji_1F1F8_1F1FD (4404781163148659815) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1FE (7179176431724187154) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F8_1F1FF (8456502038439909076) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1E6 (7462600413724750923) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1E8 (8714687302692115701) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1E9 (4271932459960645451) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1EB (8824845043239747091) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1EC (6378688671192754868) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1ED (3342706257317087047) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1EF (1902800890327368738) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1F0 (5328199482828913429) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1F1 (8753850591122992884) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1F2 (5491037548857189992) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1F3 (7278463413655866267) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1F4 (7624316225889181844) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1F7 (5932331866489640094) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1F9 (4042249888728442471) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1FB (4705386325884538832) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1FC (9106106156487112003) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1F9_1F1FF (6594567669471176195) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FA_1F1E6 (7516283481055191487) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FA_1F1EC (7713151466830788434) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FA_1F1F2 (169503347987231777) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FA_1F1F8 (3794069376561841694) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FA_1F1FE (7768717385050492537) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FA_1F1FF (1957036711159158590) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FB_1F1E6 (6686626035855100794) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FB_1F1E8 (958901562721846738) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FB_1F1EA (8171514854370897858) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FB_1F1EC (7825072244650491600) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FB_1F1EE (8177320330941963456) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FB_1F1F3 (6211275163002022414) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FB_1F1FA (7638199094441690866) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FC_1F1EB (2750545602487865333) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FC_1F1F8 (1717055707936794276) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FD_1F1F0 (8924460310127605012) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FE_1F1EA (5020385658435288646) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FE_1F1F9 (5627032701159894458) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FF_1F1E6 (3518155724469542909) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FF_1F1F2 (1316086892525163001) -->
+    <skip />
+    <!-- no translation found for spoken_emoji_1F1FF_1F1FC (7229025296887296741) -->
+    <skip />
+</resources>
diff --git a/java/res/values-as/strings-letter-descriptions.xml b/java/res/values-as/strings-letter-descriptions.xml
new file mode 100644
index 0000000..7cedd40
--- /dev/null
+++ b/java/res/values-as/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"অন্য বর্ণৰ সোঁফালে ওপৰত লিখা \'a\' সূচক"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"মিউ বর্ণৰ চিহ্ন"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"অন্য বর্ণৰ সোঁফালে ওপৰত লিখা \'o\' সূচক"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"বিটা বর্ণৰ প্ৰতীক"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"Aৰ ওপৰত গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"Aৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"Aৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"Aৰ ওপৰত টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"Aৰ ওপৰত ডায়েৰেচিছ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"ওপৰত সৰু বৃত্ত থকা \'a\' আখৰ"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"\'A, E\' আখৰৰ যুক্তাক্ষৰ"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"Cৰ তলত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"Eৰ ওপৰত গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"Eৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"Eৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"Eৰ ওপৰত ডায়েৰেচিছ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"Iৰ ওপৰত গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"Iৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"Iৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"Iৰ ওপৰত ডায়েৰেচিছ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"লেটিন বর্ণমালাৰ আখৰ \'Eth\' ৰ প্ৰতীক"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"Nৰ ওপৰত টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"Oৰ ওপৰত গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"Oৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"Oৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"Oৰ ওপৰত টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"Oৰ ওপৰত ডায়েৰেচিছ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Oত ষ্ট্ৰ\'ক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"Uৰ ওপৰত গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"Uৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"Uৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"Uৰ ওপৰত ডায়েৰেচিছ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Yৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"লেটিন বর্ণমালাৰ সৰুফলাৰ থৰ্ণ বৰ্ণ"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Yৰ ওপৰত ডায়েৰেচিছ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"Aৰ ওপৰত মেক্ৰন একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"Aৰ ওপৰত ব্ৰীভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"Aৰ তলত অগ\'নেক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"Cৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"Cৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"Cৰ ওপৰত এটা বিন্দু"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"Cৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"Dৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Dৰ ওপৰত ষ্ট্ৰ\'ক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"Eৰ ওপৰত মেক্ৰন একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"Eৰ ওপৰত ব্ৰীভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"Eৰ ওপৰত এটা বিন্দু"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"Eৰ তলত অগ\'নেক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"Eৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"Gৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"Gৰ ওপৰত ব্ৰীভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"Gৰ ওপৰত এটা বিন্দু"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"Gৰ ওপৰত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"Hৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Hৰ ওপৰত ষ্ট্ৰ\'ক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"Iৰ ওপৰত টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"Iৰ ওপৰত মেক্ৰন একচেণ্ট"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"Iৰ ওপৰত ব্ৰীভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"Iৰ তলত অগ\'নেক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ওপৰত বিন্দু নথকা \'I\'"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J আখৰৰ যুক্তাক্ষৰ"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"Jৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"Kৰ তলত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"লেটিন ভাষাৰ \'Kra\' বর্ণৰ প্ৰতীক"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"Lৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"lৰ তলত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"Lৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"সোঁফালে মধ্য অংশত বিন্দু থকা \'L\'"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Lত ষ্ট্ৰ\'ক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"Nৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"Nৰ ওপৰত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"Nৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"ঊর্ধ্বকমাৰ পাছত থকা \'N\'"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"লেটিন বর্ণমালাৰ সৰুফলা \'Eng\' বুজোৱা প্ৰতীক"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"Oৰ ওপৰত মেক্ৰন একচেণ্ট"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"Oৰ ওপৰত ব্ৰীভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"Oৰ ওপৰত দুডাল একিউটৰ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"\'oe\' আখৰৰ যুক্তাক্ষৰ"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"Rৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"Rৰ তলত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"Rৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"Sৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"Sৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"Sৰ তলত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"Sৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"Tৰ তলত চেডিলা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"Tৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Tত ষ্ট্ৰ\'ক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"Uৰ ওপৰত টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"Uৰ ওপৰত মেক্ৰনএকচেণ্ট"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"Uৰ ওপৰত ব্ৰীভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"ওপৰত সৰু বৃত্ত থকা \'U\' আখৰ"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"Uৰ ওপৰত দুডাল একিউটৰ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"Uৰ তলত অগ\'নেক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"Wৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"yৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"zৰ ওপৰত একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Zৰ ওপৰত এটা বিন্দু"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"zৰ ওপৰত কেৰণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"দীঘল \'s\' আকৃতিৰ লেটিন বর্ণৰ প্ৰতীক"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"Oৰ ওপৰত হৰ্ণ"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"uৰ ওপৰত হর্ণ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"তলত কমা থকা \'s\'"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"তলত কমা থকা \'t\'"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"লেটিন ভাষাৰ সৰুফলা আখৰ স্বা"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"Aৰ তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"\'a\'ৰ ওপৰত হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"aৰ ওপৰত চাৰকামফ্লেক্স আৰু একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"aৰ ওপৰত চাৰকামফ্লেক্স আৰু গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"aৰ ওপৰত চাৰকামফ্লেক্স আৰু হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"aৰ ওপৰত চাৰকামফ্লেক্স আৰু টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"aৰ ওপৰত চাৰকামফ্লেক্সৰ একচেণ্ট আৰু তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"Aৰ ওপৰত ব্ৰীভ আৰু একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"aৰ ওপৰত ব্ৰীভ আৰু গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"aৰ ওপৰত ব্ৰীভ আৰু হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"aৰ ওপৰত ব্ৰীভ আৰু টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"aৰ ওপৰত ব্ৰীভ একচেণ্ট আৰু তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Eৰ তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"eৰ ওপৰত গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"eৰ ওপৰত টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"eৰ ওপৰত চাৰকামফ্লেক্স আৰু একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"eৰ ওপৰত চাৰকামফ্লেক্স আৰু গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"Eৰ ওপৰত চাৰকামফ্লেক্স আৰু হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"Eৰ ওপৰত চাৰকামফ্লেক্স আৰু টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"eৰ ওপৰত চাৰকামফ্লেক্স একচেণ্ট আৰু তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"iৰ ওপৰত হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"iৰ তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"Oৰ তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"oৰ ওপৰত হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"Oৰ ওপৰত চাৰকামফ্লেক্স আৰু একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"oৰ ওপৰত চাৰকামফ্লেক্স আৰু গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"oৰ ওপৰত চাৰকামফ্লেক্স আৰু হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"oৰ ওপৰত চাৰকামফ্লেক্স আৰু টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"Oৰ ওপৰত চাৰকামফ্লেক্সৰ একচেণ্ট আৰু তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"Oৰ ওপৰত হর্ণ আৰু একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"oৰ ওপৰত হ\'র্ণ আৰু গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"oৰ ওপৰত হর্ণ আৰু হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"oৰ ওপৰত হর্ণ আৰু টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"oৰ ওপৰত হ\'র্ণ একচেণ্ট আৰু তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"Uৰ তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"Uৰ ওপৰত হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"Uৰ ওপৰত হর্ণ আৰু একিউট একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"Uৰ ওপৰত হর্ণ আৰু গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"Uৰ ওপৰত হর্ণ আৰু হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"Uৰ ওপৰত হর্ণ আৰু টিলডা একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"Uৰ ওপৰত হ\'র্ণ একচেণ্ট আৰু তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Yৰ ওপৰত গ্ৰেভ একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"yৰ তলত বিন্দু"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"yৰ ওপৰত হুক একচেণ্ট"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"yৰ ওপৰত টিলডা একচেণ্ট"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"ওলোটা ভাববোধক চিহ্ন"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"বাওঁফালে নির্দেশ কৰা দুটা কোণৰ প্ৰতীক"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"মধ্য বিন্দু"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"সোঁফালে ওপৰৰ অংশত লিখা সৰু \'1\'"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"সোঁফালে নির্দেশ কৰা দুটা কোণৰ প্ৰতীক"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"ওলোটা প্ৰশ্নবোধক চিহ্ন"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"বাওঁফালৰ ঊৰ্ধ্বকমা"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"সোঁফালৰ এডাল ঊৰ্ধ্বকমা"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"তলত লিখা সোঁফালৰ ঊৰ্ধ্বকমা"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"বাওঁ দ্বৈত ঊৰ্ধ্বকমা"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"সোঁ দ্বৈত ঊৰ্ধ্বকমা"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"ডেগাৰ চিহ্ন"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"দ্বৈত্ব ডেগাৰ চিহ্ন"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"প্ৰতি মাইলত বুজোৱা প্ৰতীক"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"প্ৰাইম"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"দৈর্ঘ্য জোখা একক ইঞ্চিৰ প্ৰতীক"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"বাওঁফালে নির্দেশ কৰা এটা কোণৰ প্ৰতীক"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"সোঁফালে নির্দেশ কৰা এটা কোণৰ প্ৰতীক"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"সোঁফালে ওপৰত লিখা সৰু \'4\'"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"সোঁফালে ওপৰত লিখা সৰু \'n\'"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"পেছ\' মুদ্ৰাৰ প্ৰতীক"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"প্ৰযত্নে"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"সোঁফালে নির্দেশ কৰা কাঁড়চিহ্ন"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"অধোমুখী কাঁড় চিহ্ন"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"ৰিক্ত সংহতি"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"বৃদ্ধি"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"ইয়াতকৈ কম বা ইয়াৰ সমান বুজোৱা প্ৰতীক"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"ইয়াতকৈ বেছি বা ইয়াৰ সমান বুজোৱা প্ৰতীক"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"ক\'লা তৰা প্ৰতীক"</string>
+</resources>
diff --git a/java/res/values-as/strings-talkback-descriptions.xml b/java/res/values-as/strings-talkback-descriptions.xml
new file mode 100644
index 0000000..c122b95
--- /dev/null
+++ b/java/res/values-as/strings-talkback-descriptions.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2015, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_use_headphones" msgid="4313642710742229868">"পাছৱৰ্ড কীবোৰ উচ্চাৰণ কৰা শুনিবলৈ হেডছেট এটা লগাওক৷"</string>
+    <string name="spoken_current_text_is" msgid="4240549866156675799">"বৰ্তমানৰ পাঠ হৈছে %s"</string>
+    <string name="spoken_no_text_entered" msgid="1711276837961785646">"কোনো পাঠ লিখা হোৱা নাই"</string>
+    <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>এ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>ৰ পৰা <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>লৈ শুদ্ধ কৰে"</string>
+    <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g>এ স্বয়ংক্ৰিয়ভাৱে শুদ্ধ কৰে"</string>
+    <string name="spoken_empty_suggestion" msgid="4250215619373459752">"কোনো পৰামর্শ নাই"</string>
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"অজ্ঞাত বর্ণ"</string>
+    <string name="spoken_description_shift" msgid="7209798151676638728">"শ্বিফ্ট"</string>
+    <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"অধিক চিহ্ন"</string>
+    <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"শ্বিফ্ট"</string>
+    <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"প্ৰতীকসমূহ"</string>
+    <string name="spoken_description_caps_lock" msgid="1224851412185975036">"শ্বিফ্ট"</string>
+    <string name="spoken_description_delete" msgid="3878902286264983302">"মচক"</string>
+    <string name="spoken_description_to_symbol" msgid="8244903740201126590">"প্ৰতীকসমূ্হ"</string>
+    <string name="spoken_description_to_alpha" msgid="4081215210530031950">"বৰ্ণসমূহ"</string>
+    <string name="spoken_description_to_numeric" msgid="4560261331530795682">"সংখ্যাসমূহ"</string>
+    <string name="spoken_description_settings" msgid="7281251004003143204">"ছেটিংসমূহ"</string>
+    <string name="spoken_description_tab" msgid="8210782459446866716">"টেব"</string>
+    <string name="spoken_description_space" msgid="5908716896642059145">"স্পেচ"</string>
+    <string name="spoken_description_mic" msgid="6153138783813452464">"ধ্বনি ইনপুট"</string>
+    <string name="spoken_description_emoji" msgid="7990051553008088470">"ইম\'জি"</string>
+    <string name="spoken_description_return" msgid="3183692287397645708">"উভতি যাওক"</string>
+    <string name="spoken_description_search" msgid="5099937658231911288">"সন্ধান কৰক"</string>
+    <string name="spoken_description_dot" msgid="5644176501632325560">"বিন্দু"</string>
+    <string name="spoken_description_language_switch" msgid="6818666779313544553">"ভাষা সলনি কৰক"</string>
+    <string name="spoken_description_action_next" msgid="431761808119616962">"পৰৱৰ্তী"</string>
+    <string name="spoken_description_action_previous" msgid="2919072174697865110">"পূৰ্বৱৰ্তী"</string>
+    <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"শ্বিফ্ট সক্ষম কৰা হ\'ল"</string>
+    <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"কেপছ্ লক সক্ষম কৰা হ\'ল"</string>
+    <string name="spoken_description_mode_symbol" msgid="111186851131446691">"চিহ্ন ম\'ড"</string>
+    <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"অধিক প্ৰতীক ম\'ড"</string>
+    <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"বৰ্ণ ম\'ড"</string>
+    <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ফ\'ন ম\'ড"</string>
+    <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ফ\'নৰ চিহ্নৰ ম\'ড"</string>
+    <string name="announce_keyboard_hidden" msgid="2313574218950517779">"কীব\'ৰ্ড লুকুওৱা হ\'ল"</string>
+    <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> কীব\'ৰ্ড দেখুওৱা হৈছে"</string>
+    <string name="keyboard_mode_date" msgid="6597407244976713364">"তাৰিখ"</string>
+    <string name="keyboard_mode_date_time" msgid="3642804408726668808">"তাৰিখ আৰু সময়"</string>
+    <string name="keyboard_mode_email" msgid="1239682082047693644">"ই-মেইল"</string>
+    <string name="keyboard_mode_im" msgid="3812086215529493501">"বাৰ্তা লিখন"</string>
+    <string name="keyboard_mode_number" msgid="5395042245837996809">"সংখ্যা"</string>
+    <string name="keyboard_mode_phone" msgid="2486230278064523665">"ফ’ন"</string>
+    <string name="keyboard_mode_text" msgid="9138789594969187494">"পাঠ"</string>
+    <string name="keyboard_mode_time" msgid="8558297845514402675">"সময়"</string>
+    <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string>
+    <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"শেহতীয়া সমলসমূহ"</string>
+    <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"সম্পৰ্ক ব্যক্তিসকল"</string>
+    <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"বস্তুসমূহ"</string>
+    <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"প্ৰকৃতি"</string>
+    <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ঠাইসমূহ"</string>
+    <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"প্ৰতীকসমূহ"</string>
+    <!-- no translation found for spoken_descrption_emoji_category_flags (5971573825866381472) -->
+    <skip />
+    <!-- no translation found for spoken_descrption_emoji_category_eight_smiley_people (5682663819532433464) -->
+    <skip />
+    <!-- no translation found for spoken_descrption_emoji_category_eight_animals_nature (5844950234883716704) -->
+    <skip />
+    <!-- no translation found for spoken_descrption_emoji_category_eight_food_drink (6196944764485349650) -->
+    <skip />
+    <!-- no translation found for spoken_descrption_emoji_category_eight_travel_places (3834085499381434611) -->
+    <skip />
+    <!-- no translation found for spoken_descrption_emoji_category_eight_activity (4795281669042975993) -->
+    <skip />
+    <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ইম\'টিকন"</string>
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"বৰফলা <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"বৰফলা l"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"ওপৰত বিন্দুৰ সৈতে লেটিন বৰফলা I"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"অজ্ঞাত চিহ্ন"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"অজ্ঞাত ইম\'জি"</string>
+    <string name="spoken_emoticon_3A_2D_21_20" msgid="2410905667389534573">"আমনি পোৱা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoticon_3A_2D_24_20" msgid="2481260475945560438">"লজ্জিত ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoticon_42_2D_29_20" msgid="1063205250387128068">"ছানগ্লাছ পৰিহিত মুখমণ্ডল"</string>
+    <string name="spoken_emoticon_3A_4F_20" msgid="532695091593447238">"আচৰিত হোৱা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoticon_3A_2D_2A_20" msgid="5612342617244114291">"চুমা খোৱা ভংগীৰ মুখমণ্ডল"</string>
+    <string name="spoken_emoticon_3A_2D_5B_20" msgid="2223507987759905920">"দুখী মুখমণ্ডল"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"বিকল্প বৰ্ণ আছে"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"বিকল্প বৰ্ণবোৰ অগ্ৰাহ্য কৰা হৈছে"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"বিকল্প পৰামর্শ আছে"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"বিকল্প পৰামর্শবোৰ অগ্ৰাহ্য কৰা হৈছে"</string>
+</resources>
diff --git a/java/res/values-as/strings.xml b/java/res/values-as/strings.xml
new file mode 100644
index 0000000..795f29a
--- /dev/null
+++ b/java/res/values-as/strings.xml
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_input_options" msgid="3909945612939668554">"ইনপুট বিকল্পসমূহ"</string>
+    <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"সম্পৰ্কসূচীৰ নামবোৰত চাওক"</string>
+    <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"বানান পৰীক্ষকে আপোনাৰ সম্পৰ্কসূচীৰ নামবোৰ ব্যৱহাৰ কৰে"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"কী টিপিলে কম্পন কৰক"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"কী টিপিলে শব্দ হ\'ব"</string>
+    <string name="popup_on_keypress" msgid="123894815723512944">"কী টিপিলে প\'পআপ ওলাব"</string>
+    <string name="settings_screen_preferences" msgid="2696713156722014624">"অগ্ৰাধিকাৰসমূহ"</string>
+    <string name="settings_screen_accounts" msgid="2786418968536696670">"একাউণ্ট আৰু গোপনীয়তা"</string>
+    <string name="settings_screen_appearance" msgid="7358046399111611615">"বাহ্যিক ৰূপ আৰু চানেকিসমূহ"</string>
+    <string name="settings_screen_gesture" msgid="8826372746901183556">"আঙুলি পিছলাই টাইপ কৰাৰ সুবিধা"</string>
+    <string name="settings_screen_correction" msgid="1616818407747682955">"পাঠ শুধৰণি"</string>
+    <string name="settings_screen_advanced" msgid="7472408607625972994">"উচ্চখাপৰ"</string>
+    <string name="settings_screen_theme" msgid="2137262503543943871">"থীম"</string>
+    <string name="enable_split_keyboard" msgid="4177264923999493614">"বিভক্ত কীবর্ড সক্ষম কৰক"</string>
+    <string name="cloud_sync_title" msgid="8579271074443847055">"Google কীব\'ৰ্ড ছিংক"</string>
+    <string name="cloud_sync_summary" msgid="7684887161145650857">"ছিংক হৈ আছে"</string>
+    <string name="cloud_sync_summary_disabled" msgid="4553338970382825796">"সকলো ডিভাইচত আপোনাৰ ব্যক্তিগত অভিধান ছিংক কৰক"</string>
+    <string name="sync_now_title" msgid="3088838136743277721">"এতিয়া ছিংক কৰক"</string>
+    <string name="clear_sync_data_title" msgid="8582001557037069154">"ক্লাউড ডেটা মচক"</string>
+    <string name="clear_sync_data_summary" msgid="993477139012576584">"আপোনাৰ ছিংক কৰা ডেটাসমূহ Googleৰ পৰা মচে"</string>
+    <string name="clear_sync_data_confirmation" msgid="2811931135574727678">"আপোনাৰ ক্লাউডৰ পৰা ছিংক কৰা ডেটাসমূহ মচা হ\'ব। আপুনি নিশ্চিতনে?"</string>
+    <string name="clear_sync_data_ok" msgid="613104067705915132">"মচক"</string>
+    <string name="cloud_sync_cancel" msgid="5877481252150919037">"বাতিল কৰক"</string>
+    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"আপোনাৰ ব্যক্তিগত অভিধান ছিংক কৰা হ\'ব আৰু Google ছার্ভাৰত বেক আপ লোৱা হ\'ব।শব্দৰ সঘনতা পৰিসংখ্যাৰ তথ্য আমাৰ সামগ্ৰীসমূহ উন্নত কৰাত সহায় কৰিবলৈ সংগ্ৰহ কৰা হ\'ব পাৰে। সংগ্ৰহ আৰু ব্যৱহাৰ কৰা সকলো তথ্যৰ বাবে "<a href="https://www.google.com/policies/privacy">"Googleৰ ব্যক্তিগত নীতি"</a>" মনা হ\'ব।"</string>
+    <string name="add_account_to_enable_sync" msgid="7836932571852055265">"এই সুবিধা সক্ষম কৰিবলৈ ডিভাইচত এটা Google একাউণ্ট যোগ কৰক"</string>
+    <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"ব্যৱসায় একাউণ্টসমূহৰ বাবে ব্যৱহাৰ কৰা Google এপসমূহৰ ডিভাইচবোৰৰ বাবে ছিংক উপলব্ধ নহয়"</string>
+    <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"আন ইনপুট পদ্ধতিলৈ সলনি কৰক"</string>
+    <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ভাষা সলনি কৰা কীটোৱে আন ইনপুট পদ্ধতিসমূহকো সামৰি লয়"</string>
+    <string name="show_language_switch_key" msgid="5915478828318774384">"ভাষা সলনি কৰা কী"</string>
+    <string name="show_language_switch_key_summary" msgid="7343403647474265713">"যেতিয়া একাধিক ইনপুট ভাষা সক্ষম কৰি থোৱা থাকে তেতিয়া দেখুৱাওক"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"কী প\'পআপৰ প্ৰত্যাখ্যান বিলম্ব"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"কোনো বিলম্ব নাই"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ডিফ\'ল্ট"</string>
+    <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>মি. ছে."</string>
+    <string name="settings_system_default" msgid="6268225104743331821">"ছিষ্টেম ডিফ\'ল্ট"</string>
+    <string name="use_contacts_dict" msgid="4435317977804180815">"সম্পৰ্ক নামৰ পৰামৰ্শ দিয়ক"</string>
+    <string name="use_contacts_dict_summary" msgid="6599983334507879959">"পৰামৰ্শ আৰু শুধৰণিৰ বাবে সম্পৰ্কসূচীৰ পৰা নামবোৰ ব্যৱহাৰ কৰক"</string>
+    <string name="use_personalized_dicts" msgid="5167396352105467626">"ব্যক্তিগতকৰণ কৰা পৰামর্শসমূহ"</string>
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"উন্নত কৰক <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"দুবাৰ স্পেচবাৰ টিপি দাড়ি দিয়াৰ সুবিধা"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"স্পেচবাৰত দুবাৰ টিপিলে এডাল দাড়ি বহুৱাই তাৰ পিছত এটা স্পেচ ভৰায়"</string>
+    <string name="auto_cap" msgid="1719746674854628252">"স্বয়ং-বৰফলাকৰণ"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"প্ৰতিটো বাক্যৰ প্ৰথমটো শব্দৰ প্ৰথম আখৰটো বৰফলাৰ কৰক"</string>
+    <string name="edit_personal_dictionary" msgid="3996910038952940420">"ব্যক্তিগত অভিধান"</string>
+    <string name="configure_dictionaries_title" msgid="4238652338556902049">"অতিৰিক্ত অভিধান"</string>
+    <string name="main_dictionary" msgid="4798763781818361168">"মুখ্য অভিধান"</string>
+    <string name="prefs_show_suggestions" msgid="8026799663445531637">"শুধৰণিৰ পৰামৰ্শবোৰ দেখুৱাওক"</string>
+    <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"টাইপ কৰি থাকোঁতে পৰামৰ্শৰ শব্দবোৰ দেখুৱাওক"</string>
+    <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"আপত্তিজনক শব্দবোৰ অৱৰোধ কৰক"</string>
+    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"সাম্ভাব্য আপত্তিজনক শব্দবোৰৰ পৰামৰ্শ নিদিব"</string>
+    <string name="auto_correction" msgid="7630720885194996950">"স্বয়ং-সংশোধন"</string>
+    <string name="auto_correction_summary" msgid="5625751551134658006">"স্পেচবাৰ আৰু যতিচিহ্নই ভুলকৈ টাইপ কৰা শব্দবোৰ স্বয়ংক্ৰিয়ভাৱে শুদ্ধ কৰে"</string>
+    <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"অফ কৰক"</string>
+    <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"পৰিমিত"</string>
+    <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"আগ্ৰাসী"</string>
+    <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"অতি আগ্ৰাসী"</string>
+    <string name="bigram_prediction" msgid="1084449187723948550">"পৰৱৰ্তী শব্দৰ পৰামৰ্শসমূহ"</string>
+    <string name="bigram_prediction_summary" msgid="3896362682751109677">"পৰামৰ্শ প্ৰদান কৰিবলৈ পূৰ্বৱৰ্তী শব্দটো ব্যৱহাৰ কৰক"</string>
+    <string name="gesture_input" msgid="826951152254563827">"স্পৰ্শ লিখন সক্ষম কৰক"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"আখৰৰ ওপৰেৰে আঙুলি পিছলাই শব্দ লিখক"</string>
+    <string name="gesture_preview_trail" msgid="3802333369335722221">"আঙুলি পিছলাই দিয়া নিৰ্দেশসমূহৰ গতিপথৰ চিহ্ন দেখুৱাওক"</string>
+    <string name="gesture_floating_preview_text" msgid="4443240334739381053">"গতিশীল প্ৰবাহিত পূৰ্বদৰ্শন"</string>
+    <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"আঙুলিৰে নিৰ্দেশ দিয়াৰ সময়ত পৰামৰ্শ দিয়া শব্দটো চাওক"</string>
+    <string name="gesture_space_aware" msgid="2078291600664682496">"আঙুলি পিছলাই দিয়া নিৰ্দেশেৰে বাক্যাংশ লিখক"</string>
+    <string name="gesture_space_aware_summary" msgid="4371385818348528538">"আঙুলি পিছলাই দিয়া নিৰ্দেশ দিওঁতে স্পেচ কীটোৰ ওপৰেৰে আঙুলি পিছলাই স্পেচ দিয়ক"</string>
+    <string name="voice_input" msgid="3583258583521397548">"কথনৰ দ্বাৰা লিখন কী"</string>
+    <!-- no translation found for voice_input_disabled_summary (6323489602945135165) -->
+    <skip />
+    <string name="configure_input_method" msgid="373356270290742459">"ইনপুট পদ্ধতিসমূহ কনফিগাৰ কৰক"</string>
+    <string name="language_selection_title" msgid="3666971864764478269">"ভাষা"</string>
+    <string name="help_and_feedback" msgid="5328219371839879161">"সহায় আৰু মতামত"</string>
+    <string name="select_language" msgid="5709487854987078367">"ভাষা"</string>
+    <!-- no translation found for hint_add_to_dictionary (2645988432867033007) -->
+    <skip />
+    <!-- no translation found for hint_add_to_dictionary_without_word (6710206006427574423) -->
+    <skip />
+    <string name="has_dictionary" msgid="6071847973466625007">"অভিধান উপলব্ধ"</string>
+    <string name="keyboard_layout" msgid="8451164783510487501">"কীব\'ৰ্ড থীম"</string>
+    <string name="switch_accounts" msgid="3321216593719006162">"একাউণ্ট সলনি কৰক"</string>
+    <string name="no_accounts_selected" msgid="2073821619103904330">"কোনো একাউণ্ট বাছনি কৰা হোৱা নাই"</string>
+    <string name="account_selected" msgid="2846876462199625974">"<xliff:g id="EMAIL_ADDRESS">%1$s</xliff:g> বর্তমান ব্যৱহাৰ কৰি থকা হৈছে"</string>
+    <string name="account_select_ok" msgid="9141195141763227797">"ঠিক আছে"</string>
+    <string name="account_select_cancel" msgid="5181012062618504340">"বাতিল কৰক"</string>
+    <string name="account_select_sign_out" msgid="3299651159390187933">"ছাইন আউট কৰক"</string>
+    <string name="account_select_title" msgid="6279711684772922649">"ব্যৱহাৰ কৰিবৰ বাবে এটা একাউণ্ট বাছনি কৰক"</string>
+    <string name="subtype_en_GB" msgid="88170601942311355">"ইংৰাজী (ইউ. কে.)"</string>
+    <string name="subtype_en_US" msgid="6160452336634534239">"ইংৰাজী (ইউ. এছ.)"</string>
+    <string name="subtype_es_US" msgid="5583145191430180200">"স্পেনিশ্ব (ইউ. এছ.)"</string>
+    <string name="subtype_hi_ZZ" msgid="8860448146262798623">"হিংলিশ্ব"</string>
+    <string name="subtype_sr_ZZ" msgid="9059219552986034343">"ছাৰ্বিয়ান (লেটিন)"</string>
+    <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ইংৰাজী (ইউ. কে.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ইংৰাজী (ইউ. এছ.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_es_US" msgid="510930471167541338">"স্পেনিশ্ব (ইউ. এছ.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_hi_ZZ" msgid="6827402953860547044">"হিংলিশ্ব (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_with_layout_sr_ZZ" msgid="2859024772719772407">"ছাৰ্বিয়ান (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string>
+    <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (পৰম্পৰাগত)"</string>
+    <string name="subtype_generic_compact" msgid="3353673321203202922">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (চমু)"</string>
+    <string name="subtype_no_language" msgid="7137390094240139495">"কোনো ভাষা নাই (বৰ্ণমালা)"</string>
+    <string name="subtype_no_language_qwerty" msgid="244337630616742604">"বৰ্ণমালা (QWERTY)"</string>
+    <string name="subtype_no_language_qwertz" msgid="443066912507547976">"বৰ্ণমালা (QWERTZ)"</string>
+    <string name="subtype_no_language_azerty" msgid="8144348527575640087">"বৰ্ণমালা (AZERTY)"</string>
+    <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"বৰ্ণমালা (Dvorak)"</string>
+    <string name="subtype_no_language_colemak" msgid="5837418400010302623">"বৰ্ণমালা (Colemak)"</string>
+    <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"বৰ্ণমালা (পি. চি.)"</string>
+    <string name="subtype_emoji" msgid="7483586578074549196">"ইম\'জি"</string>
+    <string name="keyboard_theme" msgid="4909551808526178852">"কীব\'ৰ্ড থীম"</string>
+    <string name="custom_input_styles_title" msgid="8429952441821251512">"কাষ্টম ইনপুট শৈলী"</string>
+    <string name="add_style" msgid="6163126614514489951">"শৈলী যোগ কৰক"</string>
+    <string name="add" msgid="8299699805688017798">"যোগ কৰক"</string>
+    <string name="remove" msgid="4486081658752944606">"আঁতৰাওক"</string>
+    <string name="save" msgid="7646738597196767214">"ছেভ কৰক"</string>
+    <string name="subtype_locale" msgid="8576443440738143764">"ভাষা"</string>
+    <string name="keyboard_layout_set" msgid="4309233698194565609">"চানেকি"</string>
+    <string name="custom_input_style_note_message" msgid="8826731320846363423">"আপুনি কাষ্টম ইনপুট শৈলীটো ব্যৱহাৰ কৰাৰ আগেয়ে তাক সক্ষম কৰিব লাগিব৷ আপুনি এতিয়াই তাক সক্ষম কৰিবলৈ বিচাৰেনে?"</string>
+    <string name="enable" msgid="5031294444630523247">"সক্ষম কৰক"</string>
+    <string name="not_now" msgid="6172462888202790482">"এতিয়া নহয়"</string>
+    <string name="custom_input_style_already_exists" msgid="8008728952215449707">"একে ইনপুট শৈলী ইতিমধ্যে মজুত আছে: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
+    <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"কী টিপিলে হোৱা কম্পনৰ কাল-দৈৰ্ঘ্য"</string>
+    <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"কী টিপিলে হোৱা ধ্বনিৰ মাত্ৰা"</string>
+    <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"কী দীঘলীয়াকৈ টিপি ৰখাৰ সময়"</string>
+    <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"কায়িক কীব\'ৰ্ডৰ বাবে ইম\'জী"</string>
+    <string name="prefs_enable_emoji_alt_physical_key_summary" msgid="5259484820941627827">"কায়িক Alt কীয়ে ইম\'জী পেলেট দেখুৱায়"</string>
+    <string name="button_default" msgid="3988017840431881491">"ডিফ\'ল্ট"</string>
+    <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>লৈ স্বাগতম জনাইছোঁ"</string>
+    <string name="setup_welcome_additional_description" msgid="8150252008545768953">"আঙুলি পিছলাই দিয়া নিৰ্দেশেৰে টাইপ কৰাৰ সুবিধাৰ সৈতে"</string>
+    <string name="setup_start_action" msgid="8936036460897347708">"আৰম্ভ কৰক"</string>
+    <string name="setup_next_action" msgid="371821437915144603">"পৰৱৰ্তী পদক্ষেপ"</string>
+    <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ছেট আপ কৰি থকা হৈছে"</string>
+    <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> সক্ষম কৰক"</string>
+    <!-- no translation found for setup_step1_instruction (4295448056733329661) -->
+    <skip />
+    <!-- no translation found for setup_step1_finished_instruction (8701441895377434947) -->
+    <skip />
+    <string name="setup_step1_action" msgid="4366513534999901728">"ছেটিংসমূহলৈ গৈ সক্ষম কৰক"</string>
+    <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> লৈ সলনি কৰক"</string>
+    <string name="setup_step2_instruction" msgid="9141481964870023336">"ইয়াৰ পিছত, আপোনাৰ সক্ৰিয় পাঠ ইনপুট পদ্ধতি হিচাপে \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" বাছনি কৰক৷"</string>
+    <string name="setup_step2_action" msgid="1660330307159824337">"ইনপুট পদ্ধতিসমূহ সলনি কৰক"</string>
+    <string name="setup_step3_title" msgid="3154757183631490281">"আপোনাক অভিনন্দন জনাইছোঁ, আপুনি এতিয়া সাজু!"</string>
+    <string name="setup_step3_instruction" msgid="8025981829605426000">"আপুনি এতিয়া আপোনাৰ প্ৰিয় এপসমূহত <xliff:g id="APPLICATION_NAME">%s</xliff:g>ৰ সৈতে লিখিব পাৰিব৷"</string>
+    <string name="setup_step3_action" msgid="600879797256942259">"অতিৰিক্ত ভাষা কনফিগাৰ কৰক"</string>
+    <string name="setup_finish_action" msgid="276559243409465389">"সম্পূৰ্ণ হ\'ল"</string>
+    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"এপৰ আইকন দেখুৱাওক"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"লঞ্চাৰত এপ্লিকেশ্বন আইকন দেখুৱাওক"</string>
+    <string name="app_name" msgid="6320102637491234792">"অভিধান প্ৰদানকাৰী"</string>
+    <string name="dictionary_provider_name" msgid="3027315045397363079">"অভিধান প্ৰদানকাৰী"</string>
+    <string name="dictionary_service_name" msgid="6237472350693511448">"অভিধান সেৱা"</string>
+    <string name="download_description" msgid="6014835283119198591">"অভিধান আপডেট কৰাৰ তথ্য"</string>
+    <string name="dictionary_settings_title" msgid="8091417676045693313">"অতিৰিক্ত অভিধান"</string>
+    <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"অভিধান উপলব্ধ"</string>
+    <string name="dictionary_settings_summary" msgid="5305694987799824349">"অভিধানসমূহৰ বাবে ছেটিংসমূহ"</string>
+    <string name="user_dictionaries" msgid="3582332055892252845">"ব্যৱহাৰকাৰীৰ অভিধানসমূহ"</string>
+    <string name="default_user_dict_pref_name" msgid="1625055720489280530">"ব্যৱহাৰকাৰীৰ অভিধান"</string>
+    <string name="dictionary_available" msgid="4728975345815214218">"অভিধান উপলব্ধ"</string>
+    <string name="dictionary_downloading" msgid="2982650524622620983">"বৰ্তমান ডাউনল\'ড হৈ আছে"</string>
+    <string name="dictionary_installed" msgid="8081558343559342962">"ইনষ্টল কৰা হ’ল"</string>
+    <string name="dictionary_disabled" msgid="8950383219564621762">"ফাইল ইনষ্টল হৈছে কিন্তু অভিধান অক্ষম হৈ আছে"</string>
+    <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"অভিধান সেৱাৰ লগত সংযোগ কৰোঁতে সমস্যাৰ সৃষ্টি হৈছে"</string>
+    <string name="no_dictionaries_available" msgid="8039920716566132611">"কোনো অভিধান নাই"</string>
+    <string name="check_for_updates_now" msgid="8087688440916388581">"ৰিফ্ৰেশ্ব কৰক"</string>
+    <string name="last_update" msgid="730467549913588780">"অন্তিমবাৰ আপডেট কৰা হৈছিল"</string>
+    <string name="message_updating" msgid="4457761393932375219">"আপডেট আছে নেকি পৰীক্ষা কৰি থকা হৈছে"</string>
+    <string name="message_loading" msgid="5638680861387748936">"ল\'ড হৈ আছে…"</string>
+    <string name="main_dict_description" msgid="3072821352793492143">"মুখ্য অভিধান"</string>
+    <string name="cancel" msgid="6830980399865683324">"বাতিল কৰক"</string>
+    <string name="go_to_settings" msgid="3876892339342569259">"ছেটিংসমূহ"</string>
+    <string name="install_dict" msgid="180852772562189365">"ইনষ্টল কৰক"</string>
+    <string name="cancel_download_dict" msgid="7843340278507019303">"বাতিল কৰক"</string>
+    <string name="delete_dict" msgid="756853268088330054">"মচক"</string>
+    <!-- no translation found for should_download_over_metered_prompt (6737084685073734292) -->
+    <skip />
+    <string name="download_over_metered" msgid="1643065851159409546">"এতিয়াই ডাউনল\'ড কৰক (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>এম. বি.)"</string>
+    <string name="do_not_download_over_metered" msgid="2176209579313941583">"ৱাই-ফাইৰ যোগেৰে ডাউনল\'ড কৰক"</string>
+    <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>ৰ বাবে এখন অভিধান উপলব্ধ"</string>
+    <string name="dict_available_notification_description" msgid="1075194169443163487">"সমীক্ষা আৰু ডাউনল\'ড কৰিবলৈ হেঁচক"</string>
+    <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ডাউনল\'ড কৰি থকা হৈছে: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>ৰ বাবে পৰামৰ্শবোৰ সোনকালে সাজু হ\'ব।"</string>
+    <string name="version_text" msgid="2715354215568469385">"সংস্কৰণ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
+    <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"যোগ কৰক"</string>
+    <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"অভিধানত যোগ কৰক"</string>
+    <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"বাক্যাংশ"</string>
+    <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"অধিক বিকল্প"</string>
+    <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"কম বিকল্প"</string>
+    <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ঠিক আছে"</string>
+    <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"শব্দ:"</string>
+    <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"শ্বৰ্টকাট:"</string>
+    <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ভাষা:"</string>
+    <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"কোনো শব্দ লিখক"</string>
+    <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ঐচ্ছিক শ্বৰ্টকাট"</string>
+    <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"শব্দ সম্পাদনা কৰক"</string>
+    <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"সম্পাদনা কৰক"</string>
+    <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"মচক"</string>
+    <!-- no translation found for user_dict_settings_empty_text (6889278304342592383) -->
+    <skip />
+    <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"সকলো ভাষাৰ বাবে"</string>
+    <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"অধিক ভাষা…"</string>
+    <string name="user_dict_settings_delete" msgid="110413335187193859">"মচক"</string>
+    <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+</resources>
diff --git a/java/res/values-b+sr+Latn/strings-talkback-descriptions.xml b/java/res/values-b+sr+Latn/strings-talkback-descriptions.xml
index 556b5ab..114dcf1 100644
--- a/java/res/values-b+sr+Latn/strings-talkback-descriptions.xml
+++ b/java/res/values-b+sr+Latn/strings-talkback-descriptions.xml
@@ -46,7 +46,7 @@
     <string name="spoken_description_dot" msgid="5644176501632325560">"Tačka"</string>
     <string name="spoken_description_language_switch" msgid="6818666779313544553">"Prebaci jezik"</string>
     <string name="spoken_description_action_next" msgid="431761808119616962">"Prethodno"</string>
-    <string name="spoken_description_action_previous" msgid="2919072174697865110">"Sledeće"</string>
+    <string name="spoken_description_action_previous" msgid="2919072174697865110">"Nazad"</string>
     <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift je omogućen"</string>
     <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock je omogućen"</string>
     <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Režim simbola"</string>
diff --git a/java/res/values-bn/strings-talkback-descriptions.xml b/java/res/values-bn/strings-talkback-descriptions.xml
index 1d438bd..ff7b0d8 100644
--- a/java/res/values-bn/strings-talkback-descriptions.xml
+++ b/java/res/values-bn/strings-talkback-descriptions.xml
@@ -42,7 +42,7 @@
     <string name="spoken_description_mic" msgid="6153138783813452464">"ভয়েস ইনপুট"</string>
     <string name="spoken_description_emoji" msgid="7990051553008088470">"ইমোজি"</string>
     <string name="spoken_description_return" msgid="3183692287397645708">"ফেরত যান"</string>
-    <string name="spoken_description_search" msgid="5099937658231911288">"অনুসন্ধান"</string>
+    <string name="spoken_description_search" msgid="5099937658231911288">"সার্চ"</string>
     <string name="spoken_description_dot" msgid="5644176501632325560">"ডট"</string>
     <string name="spoken_description_language_switch" msgid="6818666779313544553">"ভাষা স্যুইচ করুন"</string>
     <string name="spoken_description_action_next" msgid="431761808119616962">"পরবর্তী"</string>
@@ -76,7 +76,7 @@
     <string name="spoken_descrption_emoji_category_eight_animals_nature" msgid="5844950234883716704">"জীবজন্তু ও প্রকৃতি"</string>
     <string name="spoken_descrption_emoji_category_eight_food_drink" msgid="6196944764485349650">"খাদ্য ও পানীয়"</string>
     <string name="spoken_descrption_emoji_category_eight_travel_places" msgid="3834085499381434611">"ভ্রমণ ও স্থানগুলি"</string>
-    <string name="spoken_descrption_emoji_category_eight_activity" msgid="4795281669042975993">"কার্যকলাপ"</string>
+    <string name="spoken_descrption_emoji_category_eight_activity" msgid="4795281669042975993">"অ্যাক্টিভিটি"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ইমোটিকনগুলি"</string>
     <string name="spoken_description_upper_case" msgid="4904835255229433916">"বড় হাতের <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
     <string name="spoken_letter_0049" msgid="4743162182646977944">"বড় হাতের I"</string>
diff --git a/java/res/values-bn/strings.xml b/java/res/values-bn/strings.xml
index 13569ea..8ba3905 100644
--- a/java/res/values-bn/strings.xml
+++ b/java/res/values-bn/strings.xml
@@ -71,7 +71,7 @@
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"আপত্তিজনক শব্দ অবরোধ করুন"</string>
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"সম্ভাব্য অশোভন শব্দ সুপারিশ করবেন না"</string>
     <string name="auto_correction" msgid="7630720885194996950">"স্বত:সংশোধন"</string>
-    <string name="auto_correction_summary" msgid="5625751551134658006">"স্পেসবার ও যতিচিহ্ন ভুলভাবে টাইপ করা শব্দ স্বয়ংক্রিয়ভাবে সংশোধন করে"</string>
+    <string name="auto_correction_summary" msgid="5625751551134658006">"স্পেসবার ও যতিচিহ্ন ভুলভাবে টাইপ করা শব্দ অটোমেটিক সংশোধন করে"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"বন্ধ করুন"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"মাঝারি"</string>
     <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"আক্রমণাত্মক"</string>
@@ -123,17 +123,17 @@
     <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"বর্ণমালা (PC)"</string>
     <string name="subtype_emoji" msgid="7483586578074549196">"ইমোজি"</string>
     <string name="keyboard_theme" msgid="4909551808526178852">"কীবোর্ড থিম"</string>
-    <string name="custom_input_styles_title" msgid="8429952441821251512">"কাস্টম ইনপুট শৈলীগুলি"</string>
-    <string name="add_style" msgid="6163126614514489951">"শৈলী জুড়ুন"</string>
+    <string name="custom_input_styles_title" msgid="8429952441821251512">"কাস্টম ইনপুট স্টাইলগুলি"</string>
+    <string name="add_style" msgid="6163126614514489951">"স্টাইল জুড়ুন"</string>
     <string name="add" msgid="8299699805688017798">"জুড়ুন"</string>
     <string name="remove" msgid="4486081658752944606">"সরান"</string>
     <string name="save" msgid="7646738597196767214">"সেভ করুন"</string>
     <string name="subtype_locale" msgid="8576443440738143764">"ভাষা"</string>
     <string name="keyboard_layout_set" msgid="4309233698194565609">"লেআউট"</string>
-    <string name="custom_input_style_note_message" msgid="8826731320846363423">"আপনার কাস্টম ইনপুট শৈলী ব্যবহার শুরু করার আগে এটি সক্ষম করা প্রয়োজন। আপনি কি এখন এটি সক্ষম করতে চান?"</string>
+    <string name="custom_input_style_note_message" msgid="8826731320846363423">"আপনার কাস্টম ইনপুট স্টাইল ব্যবহার শুরু করার আগে এটি সক্ষম করা প্রয়োজন। আপনি কি এখন এটি সক্ষম করতে চান?"</string>
     <string name="enable" msgid="5031294444630523247">"সক্ষম করুন"</string>
     <string name="not_now" msgid="6172462888202790482">"এখন নয়"</string>
-    <string name="custom_input_style_already_exists" msgid="8008728952215449707">"একই ইনপুট শৈলী ইতোমধ্যে বিদ্যমান: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
+    <string name="custom_input_style_already_exists" msgid="8008728952215449707">"একই ইনপুট স্টাইল ইতোমধ্যে বিদ্যমান: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
     <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"কীপ্রেস ভাইব্রেট সময়কাল"</string>
     <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"কীপ্রেস সাউন্ড ভলিউম"</string>
     <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"কী প্রেসে দীর্ঘ বিলম্ব"</string>
@@ -183,7 +183,7 @@
     <string name="install_dict" msgid="180852772562189365">"ইনস্টল করুন"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"বাতিল করুন"</string>
     <string name="delete_dict" msgid="756853268088330054">"মুছুন"</string>
-    <string name="should_download_over_metered_prompt" msgid="6737084685073734292">"আপনার মোবাইল ডিভাইসে নির্বাচিত ভাষার জন্য একটি অভিধান উপলভ্য আছে। &lt;br/&gt; আপনার টাইপিং এর অভিজ্ঞতা ভালো করার জন্য আমরা <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> অভিধান &lt;b&gt;ডাউনলোড করার&lt;/b&gt; পরামর্শ দিই। &lt;br/&gt; &lt;br/&gt; 3G-র মাধ্যমে ডাউনলোড হতে এক বা দুই মিনিট সময় লাগতে পারে। আপনার কাছে কোন &lt;b&gt;আনলিমিটেড ডেটা প্ল্যান&lt;/b&gt;.&lt;br/&gt; না থাকলে চার্জ প্রযোজ্য হতে পারে, আপনার কাছে কোন ডেটা প্ল্যান আছে তা নিয়ে আপনি নিশ্চিত না থাকলে সেক্ষেত্রে আমরা ডাউনলোড স্বয়ংক্রিয়ভাবে শুরু করার জন্য একটি Wi-Fi সংযোগ খোঁজার পরামর্শ দিই। &lt;br/&gt; &lt;br/&gt;টিপ: আপনি আপনার মোবাইল ডিভাইসে &lt;b&gt;সেটিংস&lt;/b&gt; মেনুতে &lt;b&gt;ভাষা এবং ইনপুট&lt;/b&gt; এর মধ্যে গিয়ে অভিধান ডাউনলোড করতে ও মুছতে পারবেন।"</string>
+    <string name="should_download_over_metered_prompt" msgid="6737084685073734292">"আপনার মোবাইল ডিভাইসে নির্বাচিত ভাষার জন্য একটি অভিধান উপলভ্য আছে। &lt;br/&gt; আপনার টাইপিং এর অভিজ্ঞতা ভালো করার জন্য আমরা <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> অভিধান &lt;b&gt;ডাউনলোড করার&lt;/b&gt; পরামর্শ দিই। &lt;br/&gt; &lt;br/&gt; 3G-র মাধ্যমে ডাউনলোড হতে এক বা দুই মিনিট সময় লাগতে পারে। আপনার কাছে কোন &lt;b&gt;আনলিমিটেড ডেটা প্ল্যান&lt;/b&gt;.&lt;br/&gt; না থাকলে চার্জ প্রযোজ্য হতে পারে, আপনার কাছে কোন ডেটা প্ল্যান আছে তা নিয়ে আপনি নিশ্চিত না থাকলে সেক্ষেত্রে আমরা ডাউনলোড অটোমেটিক শুরু করার জন্য একটি Wi-Fi সংযোগ খোঁজার পরামর্শ দিই। &lt;br/&gt; &lt;br/&gt;টিপ: আপনি আপনার মোবাইল ডিভাইসে &lt;b&gt;সেটিংস&lt;/b&gt; মেনুতে &lt;b&gt;ভাষা এবং ইনপুট&lt;/b&gt; এর মধ্যে গিয়ে অভিধান ডাউনলোড করতে ও মুছতে পারবেন।"</string>
     <string name="download_over_metered" msgid="1643065851159409546">"এখন ডাউনলোড করুন (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>মেবা)"</string>
     <string name="do_not_download_over_metered" msgid="2176209579313941583">"ওয়াই-ফাই মাধ্যমে ডাউনলোড করুন"</string>
     <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ভাষার জন্য একটি অভিধান উপলব্ধ"</string>
diff --git a/java/res/values-bs/strings.xml b/java/res/values-bs/strings.xml
index ee310f3..18a6e84 100644
--- a/java/res/values-bs/strings.xml
+++ b/java/res/values-bs/strings.xml
@@ -26,7 +26,7 @@
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibracija pri pritisku na tipku"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk pri pritisku tipke"</string>
     <string name="popup_on_keypress" msgid="123894815723512944">"Iskačuči prozor pri pritisku na tipku"</string>
-    <string name="settings_screen_preferences" msgid="2696713156722014624">"Karakteristike"</string>
+    <string name="settings_screen_preferences" msgid="2696713156722014624">"Postavke"</string>
     <string name="settings_screen_accounts" msgid="2786418968536696670">"Računi i privatnost"</string>
     <string name="settings_screen_appearance" msgid="7358046399111611615">"Izgled i rasporedi tipki"</string>
     <string name="settings_screen_gesture" msgid="8826372746901183556">"Kucanje pokretima"</string>
@@ -38,7 +38,7 @@
     <string name="cloud_sync_summary" msgid="7684887161145650857">"Sinhronizacija je uključena"</string>
     <string name="cloud_sync_summary_disabled" msgid="4553338970382825796">"Sinhronizirajte vlastiti rječnik na svim uređajima"</string>
     <string name="sync_now_title" msgid="3088838136743277721">"Sinhroniziraj sada"</string>
-    <string name="clear_sync_data_title" msgid="8582001557037069154">"Obriši podatke iz oblaka"</string>
+    <string name="clear_sync_data_title" msgid="8582001557037069154">"Brisanje podataka iz oblaka"</string>
     <string name="clear_sync_data_summary" msgid="993477139012576584">"Briše vaše sinhronizirane podatke s Googlea"</string>
     <string name="clear_sync_data_confirmation" msgid="2811931135574727678">"Vaši snihronizirani podaci bit će izbrisani iz oblaka. Sigurno?"</string>
     <string name="clear_sync_data_ok" msgid="613104067705915132">"Izbriši"</string>
@@ -86,7 +86,7 @@
     <string name="gesture_space_aware" msgid="2078291600664682496">"Pokret za fraze"</string>
     <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Klizanjem na tipku za razmak umetni razmake tokom pokreta"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tipka za govorni unos"</string>
-    <string name="voice_input_disabled_summary" msgid="6323489602945135165">"Nisu omogućeni načini za glasovni unos. Provjerite postavke sekcije Jezici i unos."</string>
+    <string name="voice_input_disabled_summary" msgid="6323489602945135165">"Nisu omogućeni načini za glasovni unos. Provjerite postavke odjeljka Jezici i unos."</string>
     <string name="configure_input_method" msgid="373356270290742459">"Konfiguriraj načine unosa"</string>
     <string name="language_selection_title" msgid="3666971864764478269">"Jezici"</string>
     <string name="help_and_feedback" msgid="5328219371839879161">"Pomoć i povratne informacije"</string>
@@ -146,8 +146,8 @@
     <string name="setup_next_action" msgid="371821437915144603">"Sljedeći korak"</string>
     <string name="setup_steps_title" msgid="6400373034871816182">"Postavljanje aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_step1_title" msgid="3147967630253462315">"Omogući aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
-    <string name="setup_step1_instruction" msgid="4295448056733329661">"Označite aplikaciju \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" u postavkama sekcije Jezici i unos. Na taj način ćete joj dozvoliti da se pokrene na vašem uređaju."</string>
-    <string name="setup_step1_finished_instruction" msgid="8701441895377434947">"Aplikacija <xliff:g id="APPLICATION_NAME">%s</xliff:g> je već omogućena u vašim postavkama sekcije Jezici i unos, tako da je ovaj korak završen. Pređite na sljedeći!"</string>
+    <string name="setup_step1_instruction" msgid="4295448056733329661">"Označite aplikaciju \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" u postavkama odjeljka Jezici i unos. Na taj način ćete joj dozvoliti da se pokrene na vašem uređaju."</string>
+    <string name="setup_step1_finished_instruction" msgid="8701441895377434947">"Aplikacija <xliff:g id="APPLICATION_NAME">%s</xliff:g> je već omogućena u vašim postavkama odjeljka Jezici i unos, tako da je ovaj korak završen. Pređite na sljedeći!"</string>
     <string name="setup_step1_action" msgid="4366513534999901728">"Omogući u Postavkama"</string>
     <string name="setup_step2_title" msgid="6860725447906690594">"Prebacite se na aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_step2_instruction" msgid="9141481964870023336">"Zatim odaberite aplikaciju \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" kao vaš aktivni način unosa teksta."</string>
@@ -183,9 +183,9 @@
     <string name="install_dict" msgid="180852772562189365">"Instaliraj"</string>
     <string name="cancel_download_dict" msgid="7843340278507019303">"Otkaži"</string>
     <string name="delete_dict" msgid="756853268088330054">"Izbriši"</string>
-    <string name="should_download_over_metered_prompt" msgid="6737084685073734292">"Za odabrani jezik na vašem uređaju postoji dostupan rječnik.&lt;br/&gt; Predlažemo da &lt;b&gt;preuzmete&lt;/b&gt; rječnik za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> kako biste poboljšali svoje iskustvo tipkanja.&lt;br/&gt; &lt;br/&gt; Preuzimanje putem 3G mreže može potrajati minut-dva. Mogući su troškovi ukoliko nemate &lt;b&gt;paket s neograničenim prijenosom podataka&lt;/b&gt;.&lt;br/&gt; Ako ne znate koji paket za prijenos podataka imate, preporučujemo da pronađete Wi-Fi mrežu kako biste počeli automatsko preuzimanje.&lt;br/&gt; &lt;br/&gt; Savjet: Rječnike možete preuzimati i uklanjati ako odete na &lt;b&gt;Jezici i unos&lt;/b&gt; u meniju &lt;b&gt;Postavke&lt;/b&gt; na vašem mobilnom uređaju."</string>
+    <string name="should_download_over_metered_prompt" msgid="6737084685073734292">"Za odabrani jezik na vašem uređaju postoji dostupan rječnik.&lt;br/&gt; Predlažemo da &lt;b&gt;preuzmete&lt;/b&gt; rječnik za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> kako biste poboljšali svoje iskustvo tipkanja.&lt;br/&gt; &lt;br/&gt; Preuzimanje putem 3G mreže može potrajati minut-dva. Mogući su troškovi ukoliko nemate &lt;b&gt;paket s neograničenim prijenosom podataka&lt;/b&gt;.&lt;br/&gt; Ako ne znate koji paket za prijenos podataka imate, preporučujemo da pronađete WiFi mrežu kako biste počeli automatsko preuzimanje.&lt;br/&gt; &lt;br/&gt; Savjet: Rječnike možete preuzimati i uklanjati ako odete na &lt;b&gt;Jezici i unos&lt;/b&gt; u meniju &lt;b&gt;Postavke&lt;/b&gt; na vašem mobilnom uređaju."</string>
     <string name="download_over_metered" msgid="1643065851159409546">"Preuzmi odmah (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string>
-    <string name="do_not_download_over_metered" msgid="2176209579313941583">"Preuzmi putem Wi-Fi mreže"</string>
+    <string name="do_not_download_over_metered" msgid="2176209579313941583">"Preuzmi putem WiFi mreže"</string>
     <string name="dict_available_notification_title" msgid="4583842811218581658">"Rječnik je dostupan za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string>
     <string name="dict_available_notification_description" msgid="1075194169443163487">"Pritisnite za pregled i preuzimanje"</string>
     <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Preuzimanje: prijedlozi za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> bit će uskoro spremni."</string>
diff --git a/java/res/values-ca/strings-emoji-descriptions.xml b/java/res/values-ca/strings-emoji-descriptions.xml
index 4371fc2..86ba6a8 100644
--- a/java/res/values-ca/strings-emoji-descriptions.xml
+++ b/java/res/values-ca/strings-emoji-descriptions.xml
@@ -275,7 +275,7 @@
     <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Sortida del sol sobre les muntanyes"</string>
     <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Sortida del sol"</string>
     <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Paisatge urbà al vespre"</string>
-    <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Posta del sol sobre els edificis"</string>
+    <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Posta de sol sobre els edificis"</string>
     <string name="spoken_emoji_1F308" msgid="688704703985173377">"Arc de Sant Martí"</string>
     <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Pont a la nit"</string>
     <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Onada"</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index 77ec50e..f183902 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -62,7 +62,7 @@
     <string name="use_double_space_period" msgid="8781529969425082860">"Doble espai per punt"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Fer dos tocs a la barra d\'espai insereix punt seguit d\'un espai"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"Posa en majúscula la primera paraula de cada frase"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"Escriu en majúscula la primera lletra de la primera paraula de cada frase"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"Diccionari personal"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Diccionaris complementaris"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Diccionari principal"</string>
diff --git a/java/res/values-cs/strings-emoji-descriptions.xml b/java/res/values-cs/strings-emoji-descriptions.xml
index 988abd1..db072c4 100644
--- a/java/res/values-cs/strings-emoji-descriptions.xml
+++ b/java/res/values-cs/strings-emoji-descriptions.xml
@@ -1100,7 +1100,7 @@
     <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Vysokorychlostní vlak s kulatou přídí"</string>
     <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Vlak"</string>
     <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string>
-    <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Železnice"</string>
+    <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Městská dráha"</string>
     <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Stanice"</string>
     <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Tramvaj"</string>
     <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Vagon tramvaje"</string>
diff --git a/java/res/values-da/strings-emoji-descriptions.xml b/java/res/values-da/strings-emoji-descriptions.xml
index e82b06c..e3773c4 100644
--- a/java/res/values-da/strings-emoji-descriptions.xml
+++ b/java/res/values-da/strings-emoji-descriptions.xml
@@ -806,7 +806,7 @@
     <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Udbakke"</string>
     <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Indbakke"</string>
     <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Pakke"</string>
-    <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"E-mailsymbol"</string>
+    <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"Mailsymbol"</string>
     <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Indgående kuvert"</string>
     <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Kuvert under pil, der peger nedad"</string>
     <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Lukket postkasse med flaget nede"</string>
diff --git a/java/res/values-da/strings-talkback-descriptions.xml b/java/res/values-da/strings-talkback-descriptions.xml
index 8ee20d3..2974015 100644
--- a/java/res/values-da/strings-talkback-descriptions.xml
+++ b/java/res/values-da/strings-talkback-descriptions.xml
@@ -58,7 +58,7 @@
     <string name="announce_keyboard_mode" msgid="6698257917367823205">"Viser tastatur til <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="6597407244976713364">"dato"</string>
     <string name="keyboard_mode_date_time" msgid="3642804408726668808">"dato og klokkeslæt"</string>
-    <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string>
+    <string name="keyboard_mode_email" msgid="1239682082047693644">"mail"</string>
     <string name="keyboard_mode_im" msgid="3812086215529493501">"beskeder"</string>
     <string name="keyboard_mode_number" msgid="5395042245837996809">"tal"</string>
     <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefonnummer"</string>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index 2c3546c..5471ea0 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -56,7 +56,7 @@
     <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string>
     <string name="settings_system_default" msgid="6268225104743331821">"Systemstandard"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Foreslå navne på kontakter"</string>
-    <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Brug navne fra Kontaktpersoner til forslag og rettelser"</string>
+    <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Brug navne fra Kontakter til forslag og rettelser"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Tilpassede forslag"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"Gør <xliff:g id="APPLICATION_NAME">%s</xliff:g> bedre"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"To mellemrum for punktum"</string>
diff --git a/java/res/values-de/strings-emoji-descriptions.xml b/java/res/values-de/strings-emoji-descriptions.xml
index bbcd50a..0e4699b 100644
--- a/java/res/values-de/strings-emoji-descriptions.xml
+++ b/java/res/values-de/strings-emoji-descriptions.xml
@@ -227,7 +227,7 @@
     <string name="spoken_emoji_2935" msgid="6198710960720232074">"Pfeil nach rechts und dann im Bogen nach unten"</string>
     <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Schwarzer Pfeil nach links"</string>
     <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Schwarzer Pfeil nach oben"</string>
-    <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Schwarzer Pfeil nach unten"</string>
+    <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Schwarzer Abwärtspfeil"</string>
     <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Großes schwarzes Quadrat"</string>
     <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Großes weißes Quadrat"</string>
     <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Mittelgroßer weißer Stern"</string>
diff --git a/java/res/values-de/strings-letter-descriptions.xml b/java/res/values-de/strings-letter-descriptions.xml
index 78cf742..92b1d6c 100644
--- a/java/res/values-de/strings-letter-descriptions.xml
+++ b/java/res/values-de/strings-letter-descriptions.xml
@@ -199,7 +199,7 @@
     <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso-Zeichen"</string>
     <string name="spoken_symbol_2105" msgid="7289404939366976829">"Per Adresse"</string>
     <string name="spoken_symbol_2192" msgid="827804523596125414">"Pfeil nach rechts"</string>
-    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pfeil nach unten"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Abwärtspfeil"</string>
     <string name="spoken_symbol_2205" msgid="4457188084269117343">"Leere Menge"</string>
     <string name="spoken_symbol_2206" msgid="4856786565708380687">"Differenzzeichen"</string>
     <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kleiner/gleich"</string>
diff --git a/java/res/values-de/strings-talkback-descriptions.xml b/java/res/values-de/strings-talkback-descriptions.xml
index 17e9c94..7580678 100644
--- a/java/res/values-de/strings-talkback-descriptions.xml
+++ b/java/res/values-de/strings-talkback-descriptions.xml
@@ -29,9 +29,9 @@
     <string name="spoken_description_unknown" msgid="5139930082759824442">"Unbekanntes Zeichen"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Umschalttaste"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Weitere Symbole"</string>
-    <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift-Taste"</string>
+    <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Umschalttaste-Taste"</string>
     <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symbole"</string>
-    <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift-Taste"</string>
+    <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Umschalttaste-Taste"</string>
     <string name="spoken_description_delete" msgid="3878902286264983302">"Löschen"</string>
     <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symbole"</string>
     <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Buchstaben"</string>
diff --git a/java/res/values-en-rAU/strings-emoji-descriptions.xml b/java/res/values-en-rAU/strings-emoji-descriptions.xml
index b3eb4cc..695dcfe 100644
--- a/java/res/values-en-rAU/strings-emoji-descriptions.xml
+++ b/java/res/values-en-rAU/strings-emoji-descriptions.xml
@@ -1151,7 +1151,7 @@
     <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string>
     <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens symbol"</string>
     <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens symbol"</string>
-    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string>
+    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Toilet"</string>
     <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby symbol"</string>
     <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string>
     <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string>
diff --git a/java/res/values-en-rCA/strings-emoji-descriptions.xml b/java/res/values-en-rCA/strings-emoji-descriptions.xml
index b3eb4cc..952c27b 100644
--- a/java/res/values-en-rCA/strings-emoji-descriptions.xml
+++ b/java/res/values-en-rCA/strings-emoji-descriptions.xml
@@ -188,7 +188,7 @@
     <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Fuel pump"</string>
     <string name="spoken_emoji_2702" msgid="4005741160717451912">"Black scissors"</string>
     <string name="spoken_emoji_2705" msgid="164605766946697759">"White heavy tick"</string>
-    <string name="spoken_emoji_2708" msgid="7153840886849268988">"Aeroplane"</string>
+    <string name="spoken_emoji_2708" msgid="7153840886849268988">"Airplane"</string>
     <string name="spoken_emoji_2709" msgid="2217319160724311369">"Envelope"</string>
     <string name="spoken_emoji_270A" msgid="508347232762319473">"Raised fist"</string>
     <string name="spoken_emoji_270B" msgid="6640562128327753423">"Raised hand"</string>
@@ -1151,7 +1151,7 @@
     <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string>
     <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens symbol"</string>
     <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens symbol"</string>
-    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string>
+    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Toilet"</string>
     <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby symbol"</string>
     <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string>
     <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string>
diff --git a/java/res/values-en-rGB/strings-emoji-descriptions.xml b/java/res/values-en-rGB/strings-emoji-descriptions.xml
index b3eb4cc..695dcfe 100644
--- a/java/res/values-en-rGB/strings-emoji-descriptions.xml
+++ b/java/res/values-en-rGB/strings-emoji-descriptions.xml
@@ -1151,7 +1151,7 @@
     <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string>
     <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens symbol"</string>
     <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens symbol"</string>
-    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string>
+    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Toilet"</string>
     <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby symbol"</string>
     <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string>
     <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string>
diff --git a/java/res/values-en-rIN/strings-emoji-descriptions.xml b/java/res/values-en-rIN/strings-emoji-descriptions.xml
index b3eb4cc..695dcfe 100644
--- a/java/res/values-en-rIN/strings-emoji-descriptions.xml
+++ b/java/res/values-en-rIN/strings-emoji-descriptions.xml
@@ -1151,7 +1151,7 @@
     <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string>
     <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens symbol"</string>
     <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens symbol"</string>
-    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string>
+    <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Toilet"</string>
     <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby symbol"</string>
     <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string>
     <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string>
diff --git a/java/res/values-es/strings-talkback-descriptions.xml b/java/res/values-es/strings-talkback-descriptions.xml
index 139b637..4f79193 100644
--- a/java/res/values-es/strings-talkback-descriptions.xml
+++ b/java/res/values-es/strings-talkback-descriptions.xml
@@ -74,7 +74,7 @@
     <string name="spoken_descrption_emoji_category_flags" msgid="5971573825866381472">"Banderas"</string>
     <string name="spoken_descrption_emoji_category_eight_smiley_people" msgid="5682663819532433464">"Sonrisas y personas"</string>
     <string name="spoken_descrption_emoji_category_eight_animals_nature" msgid="5844950234883716704">"Animales y naturaleza"</string>
-    <string name="spoken_descrption_emoji_category_eight_food_drink" msgid="6196944764485349650">"Alimentación y bebidas"</string>
+    <string name="spoken_descrption_emoji_category_eight_food_drink" msgid="6196944764485349650">"Comer y beber"</string>
     <string name="spoken_descrption_emoji_category_eight_travel_places" msgid="3834085499381434611">"Viajes y sitios"</string>
     <string name="spoken_descrption_emoji_category_eight_activity" msgid="4795281669042975993">"Actividad"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticonos"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index ced838e..eab31f5 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -59,15 +59,15 @@
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nombres de contactos para sugerencias y correcciones"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugerencias personalizadas"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"Mejorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"Punto y espacio"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Si tocas dos veces el espacio, se inserta un punto seguido de un espacio"</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"Doble espacio inserta punto"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Insertar un punto seguido de un espacio al tocar dos veces la barra espaciadora"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Escribir la primera letra de cada frase en mayúscula"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"Diccionario personal"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Diccionarios complementarios"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Diccionario principal"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Sugerencias de correcciones"</string>
-    <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostrar las palabras sugeridas mientras se escribe"</string>
+    <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostrar las palabras sugeridas mientras escribes"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Bloquear palabras ofensivas"</string>
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"No sugerir palabras que pueden ser ofensivas"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Autocorrección"</string>
diff --git a/java/res/values-et/strings-emoji-descriptions.xml b/java/res/values-et/strings-emoji-descriptions.xml
index 0bd3707..795c7d0 100644
--- a/java/res/values-et/strings-emoji-descriptions.xml
+++ b/java/res/values-et/strings-emoji-descriptions.xml
@@ -818,7 +818,7 @@
     <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Ajaleht"</string>
     <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Mobiiltelefon"</string>
     <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Mobiiiltelefon, millest vasakul on paremnool"</string>
-    <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Värinarežiim"</string>
+    <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Vibreerimisrežiim"</string>
     <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Mobiiltelefon väljas"</string>
     <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Mobiiltelefonid pole lubatud"</string>
     <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Antennipostid"</string>
diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml
index a0bf57d..54de874 100644
--- a/java/res/values-et/strings.xml
+++ b/java/res/values-et/strings.xml
@@ -69,7 +69,7 @@
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Kuva korrigeerimise soovitused"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Kuva sisestamise ajal sõnasoovitusi"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Blokeeri solvavad sõnad"</string>
-    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Ära soovita potentsiaals. solvavaid sõnu"</string>
+    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Ära soovita potentsiaalselt solvavaid sõnu"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Automaatne korrigeerimine"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Tühik ja kirjavahemärgid parand. autom. kirjavigadega sõnad"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Väljas"</string>
diff --git a/java/res/values-eu/strings-emoji-descriptions.xml b/java/res/values-eu/strings-emoji-descriptions.xml
index 9af7e64..c4a788a 100644
--- a/java/res/values-eu/strings-emoji-descriptions.xml
+++ b/java/res/values-eu/strings-emoji-descriptions.xml
@@ -70,8 +70,8 @@
     <string name="spoken_emoji_24C2" msgid="3948348737566038470">"M letra larri latindarra zirkulu batean"</string>
     <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Karratu beltz txikia"</string>
     <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Karratu zuri txikia"</string>
-    <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Triangelu beltza gorantz begira"</string>
-    <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Triangelu beltza ezkerrerantz begira"</string>
+    <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Triangelu beltza gora begira"</string>
+    <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Triangelu beltza ezkerrera begira"</string>
     <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Karratu zuri ertaina"</string>
     <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Karratu beltz ertaina"</string>
     <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Karratu zuri txiki-ertaina"</string>
@@ -220,14 +220,14 @@
     <string name="spoken_emoji_2795" msgid="6563954833786162168">"Gehi ikur lodia"</string>
     <string name="spoken_emoji_2796" msgid="5990926508250772777">"Ken ikur lodia"</string>
     <string name="spoken_emoji_2797" msgid="24694184172879174">"Zatiketa ikur lodia"</string>
-    <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Gezi beltza eskuinerantz"</string>
+    <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Gezi beltza eskuinera"</string>
     <string name="spoken_emoji_27B0" msgid="203395646864662198">"Kiribila"</string>
     <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Kiribil bikoitza"</string>
-    <string name="spoken_emoji_2934" msgid="9062130477982973457">"Gezia eskuinerantz begira eta gero gorantz biratuta"</string>
-    <string name="spoken_emoji_2935" msgid="6198710960720232074">"Gezia eskuinerantz begira eta gero beherantz biratuta"</string>
-    <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Gezi beltza ezkerrerantz"</string>
-    <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Gezi beltza gorantz"</string>
-    <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Gezi beltza beherantz"</string>
+    <string name="spoken_emoji_2934" msgid="9062130477982973457">"Gezia eskuinera begira eta gero gora biratuta"</string>
+    <string name="spoken_emoji_2935" msgid="6198710960720232074">"Gezia eskuinera begira eta gero behera biratuta"</string>
+    <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Gezi beltza ezkerrera"</string>
+    <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Gezi beltza gora"</string>
+    <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Gezi beltza behera"</string>
     <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Karratu beltz handia"</string>
     <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Karratu zuri handia"</string>
     <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Izar zuri ertaina"</string>
@@ -645,10 +645,10 @@
     <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Sudurra"</string>
     <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Ahoa"</string>
     <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Mihia"</string>
-    <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Esku zuri baten atzeko aldea, hatz erakuslearekin gorantz seinalatzen duela"</string>
-    <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Esku zuri baten atzeko aldea, hatz erakuslearekin beherantz seinalatzen duela"</string>
-    <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Esku zuri baten atzeko aldea, hatz erakuslearekin ezkerrerantz seinalatzen duela"</string>
-    <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Esku zuri baten atzeko aldea, hatz erakuslearekin eskuinerantz seinalatzen duela"</string>
+    <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Esku zuri baten atzeko aldea, hatz erakuslearekin gora seinalatzen duela"</string>
+    <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Esku zuri baten atzeko aldea, hatz erakuslearekin behera seinalatzen duela"</string>
+    <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Esku zuri baten atzeko aldea, hatz erakuslearekin ezkerrera seinalatzen duela"</string>
+    <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Esku zuri baten atzeko aldea, hatz erakuslearekin eskuinera seinalatzen duela"</string>
     <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Ukabila"</string>
     <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Eskua agurtzen"</string>
     <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Ados keinua eskuarekin"</string>
@@ -752,7 +752,7 @@
     <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Lore zuria"</string>
     <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Ehun puntuen ikurra"</string>
     <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Diru-poltsa"</string>
-    <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Moneta-trukaketa"</string>
+    <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Dibisa-trukaketa"</string>
     <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Dolarraren ikur lodia"</string>
     <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Kreditu-txartela"</string>
     <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Billetea yenaren ikurrarekin"</string>
@@ -833,7 +833,7 @@
     <skip />
     <!-- no translation found for spoken_emoji_1F4FF (6566102135671766103) -->
     <skip />
-    <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Elkar gurutzatzen diren geziak eskuinerantz"</string>
+    <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Elkar gurutzatzen diren geziak eskuinera"</string>
     <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Erlojuaren noranzkoan doazen zirkulu irekiko gezi horizontalak"</string>
     <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Erlojuaren noranzkoan doazen zirkulu irekiko gezi horizontalak, 1 zenbakiarekin"</string>
     <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Erlojuaren noranzkoan doazen zirkulu irekiko gezi bertikalak"</string>
@@ -846,8 +846,8 @@
     <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Bozgorailua, hiru soinu-uhinekin"</string>
     <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Bateria"</string>
     <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Entxufe elektrikoa"</string>
-    <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Lupa ezkerrerantz"</string>
-    <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Lupa eskuinerantz"</string>
+    <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Lupa ezkerrera"</string>
+    <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Lupa eskuinera"</string>
     <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Giltzarrapoa eta bolaluma"</string>
     <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Giltzarrapoa itxita eta giltza"</string>
     <string name="spoken_emoji_1F511" msgid="262319867774655688">"Giltza"</string>
@@ -858,11 +858,11 @@
     <string name="spoken_emoji_1F516" msgid="108097933937925381">"Orri-markatzailea"</string>
     <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Estekaren ikurra"</string>
     <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Aukera-botoia"</string>
-    <string name="spoken_emoji_1F519" msgid="8211189165075445687">"\"Back\" hitza eta ezkerrerantz gezia gainean"</string>
-    <string name="spoken_emoji_1F51A" msgid="823966751787338892">"\"End\" hitza eta ezkerrerantz gezia gainean"</string>
-    <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"\"On\" hitza harridura markarekin eta ezkerrerantz gezia gainean"</string>
-    <string name="spoken_emoji_1F51C" msgid="110609810659826676">"\"Soon\" hitza eta eskuinerantz gezia gainean"</string>
-    <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"\"Top\" hitza eta gorantz gezia gainean"</string>
+    <string name="spoken_emoji_1F519" msgid="8211189165075445687">"\"Back\" hitza eta ezkerrera gezia gainean"</string>
+    <string name="spoken_emoji_1F51A" msgid="823966751787338892">"\"End\" hitza eta ezkerrera gezia gainean"</string>
+    <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"\"On\" hitza harridura markarekin eta ezkerrera gezia gainean"</string>
+    <string name="spoken_emoji_1F51C" msgid="110609810659826676">"\"Soon\" hitza eta eskuinera gezia gainean"</string>
+    <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"\"Top\" hitza eta gora gezia gainean"</string>
     <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Hemezortzi urte beherakorik ez ikurra"</string>
     <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Hamar tekla"</string>
     <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Letra larri latindarren idazketa-ikurra"</string>
@@ -1021,7 +1021,7 @@
     <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Aurpegi irribarretsua poztasun-begiekin"</string>
     <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Janari gozoa dastatzearen aurpegia"</string>
     <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Lasaitasun-aurpegia"</string>
-    <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Aurpegi irribarretsua bihotz formako begiekin"</string>
+    <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Aurpegi irribarretsua bihotz-formako begiekin"</string>
     <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Aurpegi irribarretsua betaurrekoekin"</string>
     <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Konplizitate irribarreko aurpegia"</string>
     <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Aurpegi neutroa"</string>
diff --git a/java/res/values-eu/strings.xml b/java/res/values-eu/strings.xml
index b63d83e..dfb2c1c 100644
--- a/java/res/values-eu/strings.xml
+++ b/java/res/values-eu/strings.xml
@@ -43,7 +43,7 @@
     <string name="clear_sync_data_confirmation" msgid="2811931135574727678">"Datuak hodeitik ezabatuko dira. Ziur hori egin nahi duzula?"</string>
     <string name="clear_sync_data_ok" msgid="613104067705915132">"Ezabatu"</string>
     <string name="cloud_sync_cancel" msgid="5877481252150919037">"Utzi"</string>
-    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"Hiztegi pertsonalizatua sinkronizatu egingo da eta Google zerbitzarietan gordeko da babeskopia gisa. Hitzak erabiltzeko maiztasunari buruzko estatistikak bil daitezke produktuak hobetzen laguntzeko. Informazioaren bilketak eta erabilerak "<a href="https://www.google.com/policies/privacy">"Google Pribatutasun-gidalerroak"</a>" gordeko ditu uneoro."</string>
+    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"Hiztegi pertsonalizatua sinkronizatu egingo da eta Google zerbitzarietan gordeko da babeskopia gisa. Hitzak erabiltzeko maiztasunari buruzko estatistikak bil daitezke produktuak hobetzen laguntzeko. Informazioaren bilketak eta erabilerak "<a href="https://www.google.com/policies/privacy">"Google Pribatutasun-gidalerroak"</a>" gordeko ditu une oro."</string>
     <string name="add_account_to_enable_sync" msgid="7836932571852055265">"Eginbidea gaitzeko, gehitu Google kontua gailuan"</string>
     <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"Sinkronizazioa ez dago erabilgarri Google Apps for Business kontuak dituzten gailuetan"</string>
     <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Aldatu idazketa-metodoa"</string>
diff --git a/java/res/values-fa/strings-emoji-descriptions.xml b/java/res/values-fa/strings-emoji-descriptions.xml
index 747bf1a..35139ef 100644
--- a/java/res/values-fa/strings-emoji-descriptions.xml
+++ b/java/res/values-fa/strings-emoji-descriptions.xml
@@ -806,7 +806,7 @@
     <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"سینی صندوق خروجی"</string>
     <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"سینی صندوق ورودی"</string>
     <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"بسته‌بندی"</string>
-    <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"نماد رایانامه"</string>
+    <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"نماد ایمیل"</string>
     <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"پاکت نامه ورودی"</string>
     <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"پاکت نامه با پیکان‌های رو به پایین در بالا"</string>
     <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"صندوق پستی بسته شده با پرچم پایین آمده"</string>
diff --git a/java/res/values-fa/strings-talkback-descriptions.xml b/java/res/values-fa/strings-talkback-descriptions.xml
index 12b55be..4613d32 100644
--- a/java/res/values-fa/strings-talkback-descriptions.xml
+++ b/java/res/values-fa/strings-talkback-descriptions.xml
@@ -58,7 +58,7 @@
     <string name="announce_keyboard_mode" msgid="6698257917367823205">"در حال نمایش صفحه‌کلید <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string>
     <string name="keyboard_mode_date" msgid="6597407244976713364">"تاریخ"</string>
     <string name="keyboard_mode_date_time" msgid="3642804408726668808">"تاریخ و زمان"</string>
-    <string name="keyboard_mode_email" msgid="1239682082047693644">"رایانامه"</string>
+    <string name="keyboard_mode_email" msgid="1239682082047693644">"ایمیل"</string>
     <string name="keyboard_mode_im" msgid="3812086215529493501">"پیام‌رسانی"</string>
     <string name="keyboard_mode_number" msgid="5395042245837996809">"عدد"</string>
     <string name="keyboard_mode_phone" msgid="2486230278064523665">"تلفن"</string>
diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml
index 139e775..d1f7e19 100644
--- a/java/res/values-fr-rCA/strings.xml
+++ b/java/res/values-fr-rCA/strings.xml
@@ -169,7 +169,7 @@
     <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dictionnaire personnel"</string>
     <string name="dictionary_available" msgid="4728975345815214218">"Dictionnaire disponible"</string>
     <string name="dictionary_downloading" msgid="2982650524622620983">"Téléchargement en cours…"</string>
-    <string name="dictionary_installed" msgid="8081558343559342962">"Installé"</string>
+    <string name="dictionary_installed" msgid="8081558343559342962">"Installés"</string>
     <string name="dictionary_disabled" msgid="8950383219564621762">"Installé, désactivé"</string>
     <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Pas de service dico."</string>
     <string name="no_dictionaries_available" msgid="8039920716566132611">"Aucun dictionnaire"</string>
@@ -204,7 +204,7 @@
     <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Modifier le mot"</string>
     <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Modifier"</string>
     <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Supprimer"</string>
-    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Votre dictionnaire personnel ne contient aucun mot. Pour ajouter un mot, touchez le bouton d\'ajout (« + »)."</string>
+    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Votre dictionnaire personnel ne contient aucun mot. Pour ajouter un mot, touchez le bouton d\'ajout (+)."</string>
     <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Pour toutes les langues"</string>
     <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Plus de langues…"</string>
     <string name="user_dict_settings_delete" msgid="110413335187193859">"Supprimer"</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index f8490b2..9e42ecc 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -74,7 +74,7 @@
     <string name="auto_correction_summary" msgid="5625751551134658006">"Corriger l\'orthographe (pression sur barre espace/signes ponctuation)"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Désactiver"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Simple"</string>
-    <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Proactive"</string>
+    <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Forcée"</string>
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Très proactive"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Suggestions pour mot suivant"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utiliser le mot précédent pour les suggestions"</string>
diff --git a/java/res/values-gl/strings.xml b/java/res/values-gl/strings.xml
index 2f5f134..354f31d 100644
--- a/java/res/values-gl/strings.xml
+++ b/java/res/values-gl/strings.xml
@@ -157,7 +157,7 @@
     <string name="setup_step3_action" msgid="600879797256942259">"Configurar idiomas adicionais"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"Finalizado"</string>
     <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Mostrar icona da aplicación"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Mostra a icona da aplicación no menú de aplicacións"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Mostra a icona da aplicación no Launcher"</string>
     <string name="app_name" msgid="6320102637491234792">"Fornecedor do dicionario"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"Fornecedor do dicionario"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"Servizo de dicionario"</string>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 3e71425..4f6d372 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -156,7 +156,7 @@
     <string name="setup_step3_instruction" msgid="8025981829605426000">"अब आप <xliff:g id="APPLICATION_NAME">%s</xliff:g> के साथ अपने सभी पसंदीदा ऐप्स  में लिख सकते हैं."</string>
     <string name="setup_step3_action" msgid="600879797256942259">"अतिरिक्त भाषाएं कॉन्फ़िगर करें"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"समाप्त"</string>
-    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"ऐप आइकॉन दिखाएं"</string>
+    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"ऐप्लिकेशन का आइकॉन दिखाएं"</string>
     <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"लॉन्चर में ऐप आइकॉन दिखाएं"</string>
     <string name="app_name" msgid="6320102637491234792">"डिक्‍शनरी प्रदाता"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"डिक्‍शनरी प्रदाता"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index d5f72c2..57c1692 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -79,7 +79,7 @@
     <string name="bigram_prediction" msgid="1084449187723948550">"Prijedlozi za sljedeću riječ"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Koristi se prethodnom riječi u izradi prijedloga"</string>
     <string name="gesture_input" msgid="826951152254563827">"Omogući pisanje kretnjama"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"Unesi riječ klizanjem preko slova"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"Unesite riječ klizanjem preko slova"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Prikaži trag pokreta"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamički plutajući pregled"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Vidi predloženu riječ tijekom pokreta"</string>
diff --git a/java/res/values-hy/strings.xml b/java/res/values-hy/strings.xml
index 3d9b39f..5e2568c 100644
--- a/java/res/values-hy/strings.xml
+++ b/java/res/values-hy/strings.xml
@@ -59,10 +59,10 @@
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Օգտագործել կոնտակտների անունները՝ առաջարկների և ուղղումների համար"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Անհատականացված առաջարկներ"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"Բարելավել <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ը"</string>
-    <string name="use_double_space_period" msgid="8781529969425082860">"Կրկնաբացակի վերջակետ"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Բացակի ստեղնի կրկնակի հպումը բացակից հետո վերջակետ է դնում"</string>
+    <string name="use_double_space_period" msgid="8781529969425082860">"Կրկնաբացատով վերջակետ"</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"Բացատի ստեղնի կրկնակի հպումը բացատից հետո վերջակետ է դնում"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Ավտոմատ գլխատառացում"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"Գլխատառել յուրաքանչյուր նախադասության առաջին բառը"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"Մեծատառով գրել յուրաքանչյուր նախադասության առաջին բառը"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"Անհատական բառարան"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Հավելյալ բառարաններ"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Հիմնական բառարան"</string>
@@ -79,7 +79,7 @@
     <string name="bigram_prediction" msgid="1084449187723948550">"Հաջորդ բառի առաջարկներ"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Առաջարկներ կազմելու համար օգտագործել նախորդ բառը"</string>
     <string name="gesture_input" msgid="826951152254563827">"Միացնել ժեստերով մուտքագրումը"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"Մուտքագրեք բառ` սահեցնելով տառերը"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"Մուտքագրեք բառ` մատը տառից տառ սահեցնելով"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Ցույց տալ ժեստի հետագիծը"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Դինամիկ սահող նախատեսք"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Տեսեք առաջարկված բառը՝ ժեստի միջոցով"</string>
@@ -157,7 +157,7 @@
     <string name="setup_step3_action" msgid="600879797256942259">"Կարգավորել լրացուցիչ լեզուները"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"Ավարտված"</string>
     <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Ցույց տալ հավելվածի պատկերակը"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Ցուցադրել հավելվածի պատկերակը թողարկչում"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Ցուցադրել հավելվածի պատկերակը գործարկիչում"</string>
     <string name="app_name" msgid="6320102637491234792">"Բառարանի մատակարար"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"Բառարանի մատակարար"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"Բառարանի ծառայություն"</string>
diff --git a/java/res/values-in/strings-emoji-descriptions.xml b/java/res/values-in/strings-emoji-descriptions.xml
index 1e87027..4b6b410 100644
--- a/java/res/values-in/strings-emoji-descriptions.xml
+++ b/java/res/values-in/strings-emoji-descriptions.xml
@@ -1082,7 +1082,7 @@
     <!-- no translation found for spoken_emoji_1F644 (446284817942609022) -->
     <skip />
     <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Wajah dengan isyarat tidak setuju"</string>
-    <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Wajah dengan isyarat oke"</string>
+    <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Wajah dengan gestur oke"</string>
     <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Orang yang membungkuk dalam-dalam"</string>
     <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Monyet menutup mata"</string>
     <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Monyet menutup telinga"</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 22a3c80..7061c40 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -29,7 +29,7 @@
     <string name="settings_screen_preferences" msgid="2696713156722014624">"Preferensi"</string>
     <string name="settings_screen_accounts" msgid="2786418968536696670">"Akun &amp; Privasi"</string>
     <string name="settings_screen_appearance" msgid="7358046399111611615">"Tampilan &amp; Tata Letak"</string>
-    <string name="settings_screen_gesture" msgid="8826372746901183556">"Ketikan Isyarat"</string>
+    <string name="settings_screen_gesture" msgid="8826372746901183556">"Ketikan Gestur"</string>
     <string name="settings_screen_correction" msgid="1616818407747682955">"Koreksi teks"</string>
     <string name="settings_screen_advanced" msgid="7472408607625972994">"Lanjutan"</string>
     <string name="settings_screen_theme" msgid="2137262503543943871">"Tema"</string>
@@ -43,7 +43,7 @@
     <string name="clear_sync_data_confirmation" msgid="2811931135574727678">"Data yang disinkronkan akan dihapus dari awan. Anda yakin?"</string>
     <string name="clear_sync_data_ok" msgid="613104067705915132">"Hapus"</string>
     <string name="cloud_sync_cancel" msgid="5877481252150919037">"Batal"</string>
-    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"Kamus pribadi akan disinkronkan dan dicadangkan ke server Google. Informasi statistik tentang frekuensi kata dapat dikumpulkan untuk membantu menyempurnakan produk kami. Pengumpulan dan penggunaan data tunduk pada "<a href="https://www.google.com/policies/privacy">"Kebijakan Privasi Google"</a>"."</string>
+    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"Kamus pribadi akan disinkronkan dan di-backup ke server Google. Informasi statistik tentang frekuensi kata dapat dikumpulkan untuk membantu menyempurnakan produk kami. Pengumpulan dan penggunaan data tunduk pada "<a href="https://www.google.com/policies/privacy">"Kebijakan Privasi Google"</a>"."</string>
     <string name="add_account_to_enable_sync" msgid="7836932571852055265">"Tambahkan akun Google ke perangkat ini untuk mengaktifkan fitur ini"</string>
     <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"Sinkronisasi tidak tersedia untuk perangkat yang memiliki akun Google Apps for Business"</string>
     <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Beralih ke metode masukan lain"</string>
@@ -78,12 +78,12 @@
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Sangat agresif"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Saran kata berikutnya"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Gunakan kata sebelumnya dalam membuat saran"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Aktifkan pengetikan isyarat"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Aktifkan pengetikan gestur"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Masukkan kata dengan menggeser huruf ke kanan/kiri"</string>
-    <string name="gesture_preview_trail" msgid="3802333369335722221">"Tampilkan jejak isyarat"</string>
+    <string name="gesture_preview_trail" msgid="3802333369335722221">"Tampilkan jejak gestur"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pratinjau mengambang dinamis"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Lihat kata yang disarankan saat melakukan isyarat"</string>
-    <string name="gesture_space_aware" msgid="2078291600664682496">"Isyarat frasa"</string>
+    <string name="gesture_space_aware" msgid="2078291600664682496">"Gesture frasa"</string>
     <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Masukkan spasi dalam isyarat dengan meluncur ke tombol spasi"</string>
     <string name="voice_input" msgid="3583258583521397548">"Tombol masukan suara"</string>
     <string name="voice_input_disabled_summary" msgid="6323489602945135165">"Tidak ada metode masukan suara yang diaktifkan. Periksa setelan Bahasan &amp; masukan."</string>
@@ -91,8 +91,8 @@
     <string name="language_selection_title" msgid="3666971864764478269">"Bahasa"</string>
     <string name="help_and_feedback" msgid="5328219371839879161">"Bantuan &amp; masukan"</string>
     <string name="select_language" msgid="5709487854987078367">"Bahasa"</string>
-    <string name="hint_add_to_dictionary" msgid="2645988432867033007">"Ketuk sekali lagi untuk menyimpan"</string>
-    <string name="hint_add_to_dictionary_without_word" msgid="6710206006427574423">"Ketuk di sini untuk menyimpan"</string>
+    <string name="hint_add_to_dictionary" msgid="2645988432867033007">"Tap sekali lagi untuk menyimpan"</string>
+    <string name="hint_add_to_dictionary_without_word" msgid="6710206006427574423">"Tap di sini untuk menyimpan"</string>
     <string name="has_dictionary" msgid="6071847973466625007">"Kamus yang tersedia"</string>
     <string name="keyboard_layout" msgid="8451164783510487501">"Tema keyboard"</string>
     <string name="switch_accounts" msgid="3321216593719006162">"Beralih akun"</string>
@@ -141,7 +141,7 @@
     <string name="prefs_enable_emoji_alt_physical_key_summary" msgid="5259484820941627827">"Tombol Alt fisik menampilkan palet emoji"</string>
     <string name="button_default" msgid="3988017840431881491">"Default"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Selamat datang di <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
-    <string name="setup_welcome_additional_description" msgid="8150252008545768953">"dengan Ketikan Isyarat"</string>
+    <string name="setup_welcome_additional_description" msgid="8150252008545768953">"dengan Ketikan Gestur"</string>
     <string name="setup_start_action" msgid="8936036460897347708">"Memulai"</string>
     <string name="setup_next_action" msgid="371821437915144603">"Langkah berikutnya"</string>
     <string name="setup_steps_title" msgid="6400373034871816182">"Menyiapkan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
@@ -204,7 +204,7 @@
     <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Edit kata"</string>
     <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Edit"</string>
     <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Hapus"</string>
-    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Tidak ada kata-kata dalam kamus pengguna. Untuk menambahkan kata, ketuk tombol Tambahkan (+)."</string>
+    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Tidak ada kata-kata dalam kamus pengguna. Untuk menambahkan kata, tap tombol Tambahkan (+)."</string>
     <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Untuk semua bahasa"</string>
     <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Bahasa lainnya..."</string>
     <string name="user_dict_settings_delete" msgid="110413335187193859">"Hapus"</string>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 73a2961..a44b2fb 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -44,7 +44,7 @@
     <string name="clear_sync_data_ok" msgid="613104067705915132">"Elimina"</string>
     <string name="cloud_sync_cancel" msgid="5877481252150919037">"Annulla"</string>
     <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"Il tuo dizionario personale verrà sincronizzato sui server di Google e ne verrà effettuato il backup. Potrebbero essere raccolte informazioni statistiche relative alla frequenza delle parole per migliorare i nostri prodotti. La raccolta e l\'utilizzo di tutte le informazioni saranno conformi alle "<a href="https://www.google.com/policies/privacy">"Norme sulla privacy di Google"</a>"."</string>
-    <string name="add_account_to_enable_sync" msgid="7836932571852055265">"Per attivare la funzione, aggiungi un account Google al dispositivo"</string>
+    <string name="add_account_to_enable_sync" msgid="7836932571852055265">"Per attivare la funzione, aggiungi un Account Google al dispositivo"</string>
     <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"La sincronizzazione non è disponibile per i dispositivi con account Google Apps for Business"</string>
     <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Altri metodi immissione"</string>
     <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Il tasto per cambiare lingua offre altri metodi di immissione"</string>
@@ -157,7 +157,7 @@
     <string name="setup_step3_action" msgid="600879797256942259">"Configura altre lingue"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"Terminato"</string>
     <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Mostra icona app"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Mostra l\'icona dell\'app in Avvio applicazioni"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Mostra l\'icona dell\'app in Avvio app"</string>
     <string name="app_name" msgid="6320102637491234792">"Dictionary Provider"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"Dictionary Provider"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"Servizio dizionario"</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index bce66c0..2fc1133 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -23,7 +23,7 @@
     <string name="english_ime_input_options" msgid="3909945612939668554">"入力オプション"</string>
     <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"連絡先名の検索"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"スペルチェッカーでは連絡先リストのエントリを使用します"</string>
-    <string name="vibrate_on_keypress" msgid="5258079494276955460">"キー操作バイブ"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"キー操作バイブレーション"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"キー操作音"</string>
     <string name="popup_on_keypress" msgid="123894815723512944">"キー押下時ポップアップ"</string>
     <string name="settings_screen_preferences" msgid="2696713156722014624">"設定"</string>
@@ -134,7 +134,7 @@
     <string name="enable" msgid="5031294444630523247">"有効にする"</string>
     <string name="not_now" msgid="6172462888202790482">"後で行う"</string>
     <string name="custom_input_style_already_exists" msgid="8008728952215449707">"同じ入力スタイルが既に存在します: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
-    <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"キー操作バイブの振動時間"</string>
+    <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"キー操作バイブレーションの振動時間"</string>
     <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"キー操作音の音量"</string>
     <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"キーの長押し時間"</string>
     <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"物理キーボードの絵文字"</string>
diff --git a/java/res/values-kk/strings-emoji-descriptions.xml b/java/res/values-kk/strings-emoji-descriptions.xml
index 989c645..8d6c438 100644
--- a/java/res/values-kk/strings-emoji-descriptions.xml
+++ b/java/res/values-kk/strings-emoji-descriptions.xml
@@ -249,7 +249,7 @@
     <string name="spoken_emoji_1F194" msgid="4903128609556175887">"Шаршыдағы ID"</string>
     <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Шаршыдағы «new»"</string>
     <string name="spoken_emoji_1F196" msgid="8825160701159634202">"Шаршыдағы «N G»"</string>
-    <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Шаршыдағы «OK»"</string>
+    <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Шаршыдағы «Жарайды»"</string>
     <string name="spoken_emoji_1F198" msgid="7020298909426960622">"Шаршыдағы «SOS»"</string>
     <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Шаршыдағы «Up» және леп белгісі"</string>
     <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Шаршыдағы «vs»"</string>
diff --git a/java/res/values-kk/strings.xml b/java/res/values-kk/strings.xml
index 275300d..b7da51b 100644
--- a/java/res/values-kk/strings.xml
+++ b/java/res/values-kk/strings.xml
@@ -31,7 +31,7 @@
     <string name="settings_screen_appearance" msgid="7358046399111611615">"Сыртқы түр және орналасулар"</string>
     <string name="settings_screen_gesture" msgid="8826372746901183556">"Қимыл арқылы теру"</string>
     <string name="settings_screen_correction" msgid="1616818407747682955">"Мәтінді түзету"</string>
-    <string name="settings_screen_advanced" msgid="7472408607625972994">"Кеңейтілген"</string>
+    <string name="settings_screen_advanced" msgid="7472408607625972994">"Қосымша"</string>
     <string name="settings_screen_theme" msgid="2137262503543943871">"Тақырып"</string>
     <string name="enable_split_keyboard" msgid="4177264923999493614">"Бөлінген пернетақтаны қосу"</string>
     <string name="cloud_sync_title" msgid="8579271074443847055">"Google пернетақтасын синхрондау"</string>
@@ -54,21 +54,21 @@
     <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Кідіріс жоқ"</string>
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Әдепкі"</string>
     <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>мс"</string>
-    <string name="settings_system_default" msgid="6268225104743331821">"Жүйе әдепкісі"</string>
+    <string name="settings_system_default" msgid="6268225104743331821">"Жүйенің әдепкі мәні"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Контакт аттарын ұсыну"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Ұсыныстар мен түзетулер үшін контакт аттарын пайдалану"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Жекелендірілген ұсыныстар"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> жақсарту"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Нүкте мен бос орын қою"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Бос орын пернесін екі рет түртсе, нүкте мен бос орын қойылады"</string>
-    <string name="auto_cap" msgid="1719746674854628252">"Авто бас әріптерге түрлендіру"</string>
+    <string name="auto_cap" msgid="1719746674854628252">"Автоматты бас әріпке ауыстыру"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Әрбір сөйлемнің бірінші әріпін бас әріпке түрлендіру"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"Жеке сөздік"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Қосымша сөздіктер"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Негізгі сөздік"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Түзету ұсыныстарын көрсету"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Теру кезінде ұсынылған сөздерді көрсету"</string>
-    <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Қорлаушы сөздерді тыю"</string>
+    <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Балағат сөздерге тыйым салу"</string>
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Қорлаушы сөздерді ұсынбау"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Авто түзету"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Бос орын және тыныс белгі автоматты түрде қателерді түзетеді"</string>
@@ -157,7 +157,7 @@
     <string name="setup_step3_action" msgid="600879797256942259">"Қосымша тілдерді теңшеу"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"Аяқталған"</string>
     <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Қолданба белгішесін көрсету"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Іске қосу құралындағы қолданба белгішесін көрсету"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Іске қосу құралында қолданба белгішесін көрсету"</string>
     <string name="app_name" msgid="6320102637491234792">"Сөздік провайдері"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"Сөздік провайдері"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"Сөздік қызметі"</string>
diff --git a/java/res/values-km/strings.xml b/java/res/values-km/strings.xml
index d5dce2a..71a185d 100644
--- a/java/res/values-km/strings.xml
+++ b/java/res/values-km/strings.xml
@@ -156,8 +156,8 @@
     <string name="setup_step3_instruction" msgid="8025981829605426000">"ឥឡូវ​​អ្នក​អាច​​វាយ​បញ្ចូល​នៅ​ក្នុង​​កម្មវិធី​​ពេញ​ចិត្ត​របស់​អ្នក​ទាំងអស់​ជាមួយ <xliff:g id="APPLICATION_NAME">%s</xliff:g> ។"</string>
     <string name="setup_step3_action" msgid="600879797256942259">"កំណត់​រចនា​សម្ព័ន្ធ​ភាសា​បន្ថែម"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"បាន​បញ្ចប់"</string>
-    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"បង្ហាញ​រូប​តំណាង​កម្មវិធី"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"បង្ហាញ​រូប​តំណាង​កម្មវិធី​នៅ​ក្នុង​កម្ម​​វិធី​ចាប់ផ្ដើម"</string>
+    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"បង្ហាញ​រូប​កម្មវិធី"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"បង្ហាញ​រូប​កម្មវិធី​នៅ​ក្នុង​កម្ម​​វិធី​ចាប់ផ្ដើម"</string>
     <string name="app_name" msgid="6320102637491234792">"កម្មវិធី​ផ្ដល់​វចនានុក្រម"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"កម្មវិធី​ផ្ដល់​វចនានុក្រម"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"សេវាកម្ម​​វចនានុក្រម"</string>
diff --git a/java/res/values-kn/strings.xml b/java/res/values-kn/strings.xml
index 924f059..45f05ab 100644
--- a/java/res/values-kn/strings.xml
+++ b/java/res/values-kn/strings.xml
@@ -80,7 +80,7 @@
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"ಸಲಹೆಗಳನ್ನು ಮಾಡುವಾಗ ಹಿಂದಿನ ಪದವನ್ನು ಬಳಸು"</string>
     <string name="gesture_input" msgid="826951152254563827">"ಗೆಶ್ಚರ್ ಟೈಪಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸು"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"ಅಕ್ಷರಗಳ ಮೇಲೆ ಸರಿಸುವ ಮೂಲಕ ಪದವೊಂದನ್ನು ನಮೂದಿಸಿ"</string>
-    <string name="gesture_preview_trail" msgid="3802333369335722221">"ಗೆಶ್ಚರ್ ಟ್ರಯಲ್ ತೋರಿಸು"</string>
+    <string name="gesture_preview_trail" msgid="3802333369335722221">"ಗೆಶ್ಚರ್ ಟ್ರೇಲ್ ತೋರಿಸು"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ಡೈನಮಿಕ್ ಫ್ಲೋಟಿಂಗ್ ಪೂರ್ವವೀಕ್ಷಣೆ"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ಗೆಸ್ಟರ್ ಮಾಡುವಾಗ ಸೂಚಿಸಿದ ಪದವನ್ನು ನೋಡಿ"</string>
     <string name="gesture_space_aware" msgid="2078291600664682496">"ಪದಗುಚ್ಛದ ಗೆಶ್ಚರ್"</string>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index 5f2fb8e..90fec1b 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -60,7 +60,7 @@
     <string name="use_personalized_dicts" msgid="5167396352105467626">"맞춤 추천 검색어"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> 개선"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"더블스페이스 마침표"</string>
-    <string name="use_double_space_period_summary" msgid="6532892187247952799">"스페이스바를 두 번 탭하면 마침표와 공백 한 개가 삽입됩니다."</string>
+    <string name="use_double_space_period_summary" msgid="6532892187247952799">"스페이스바를 두 번 탭하면 마침표와 공백 한 개가 삽입됨"</string>
     <string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"문장의 첫 단어를 대문자로 표시"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"개인 사전"</string>
diff --git a/java/res/values-ky/strings.xml b/java/res/values-ky/strings.xml
index c6be21a..59ef363 100644
--- a/java/res/values-ky/strings.xml
+++ b/java/res/values-ky/strings.xml
@@ -24,7 +24,7 @@
     <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Байланыш ысымдарын издөө"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Орфография текшерилип жатканда байланыштар тизмеси колдонулат"</string>
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"Баскыч басылганда дирилдесин"</string>
-    <string name="sound_on_keypress" msgid="6093592297198243644">"Баскыч басылганда чыккан үн"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"Баскычты басканда үн чыгат"</string>
     <string name="popup_on_keypress" msgid="123894815723512944">"Баскыч басылганда калкып чыкма"</string>
     <string name="settings_screen_preferences" msgid="2696713156722014624">"Мүмкүнчүлүктөрдү тандоо"</string>
     <string name="settings_screen_accounts" msgid="2786418968536696670">"Каттоо эсептери жана купуялык"</string>
@@ -69,7 +69,7 @@
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Оңдоо сунуштары көрсөтүлсүн"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Терүү учурунда сунушталган сөздөрдү көрсөтүү"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Адепсиз сөздөрдү бөгөттө"</string>
-    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Адепсиз сөздөр сунушталбасын"</string>
+    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Адепсиз сөздөр сунушталбайт"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Авто оңдоо"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Боштук жана тыныш белгиси автоматтык түрдө туура эмес терилген сөздөрдү оңдойт"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Өчүк"</string>
@@ -79,7 +79,7 @@
     <string name="bigram_prediction" msgid="1084449187723948550">"Кийинки сөздү сунуштоо"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Сунуштоодо мурунку сөздү пайдалануу"</string>
     <string name="gesture_input" msgid="826951152254563827">"Жаңсап терүүнү иштетүү"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"Тамгаларды сүрүп сөз киргизүү"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"Сөздү тамгаларды сүрүп киргизесиз"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Жаңсоо изи көрүнүп турсун"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамикалык калкыма алдын-ала көрүү"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Жаңсалганда сунушталган сөздү көрүү"</string>
@@ -157,7 +157,7 @@
     <string name="setup_step3_action" msgid="600879797256942259">"Кошумча тилдерди конфигурациялоо"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"Аяктады"</string>
     <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Колдонмонун сүрөтчөсүн көрсөтүү"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Колдонмонун сүрөтчөсүн иштетүү тактасында көрсөтүү"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Колдонмонун сүрөтчөсү иштетүү тактасында көрүнөт"</string>
     <string name="app_name" msgid="6320102637491234792">"Сөздүк жабдуучусу"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"Сөздүк жабдуучусу"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"Сөздүк кызматы"</string>
diff --git a/java/res/values-lo/strings.xml b/java/res/values-lo/strings.xml
index 2c37c9a..fc93425 100644
--- a/java/res/values-lo/strings.xml
+++ b/java/res/values-lo/strings.xml
@@ -21,7 +21,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_input_options" msgid="3909945612939668554">"ຕົວເລືອກການປ້ອນຂໍ້ມູນ"</string>
-    <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ເບິ່ງທີ່ຊື່ຂອງລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+    <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ຊອກຫາລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ໂຕຊ່ວຍສະກົດໃຊ້ຂໍ້ມູນຈາກລາຍການຂອງລາຍຊື່ຜູ່ຕິດຕໍ່ຂອງທ່ານ"</string>
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"ສັ່ນເຕືອນເມື່ອພິມ"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"ສຽງໃນການກົດປຸ່ມ"</string>
@@ -156,8 +156,8 @@
     <string name="setup_step3_instruction" msgid="8025981829605426000">"ຕອນນີ້ທ່ານສາມາດພິມໃນແອັບຯທີ່ທ່ານມັກໄດ້ທຸກແອັບຯດ້ວຍ <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
     <string name="setup_step3_action" msgid="600879797256942259">"ປັບຄ່າພາສາເພີ່ມເຕີມ"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"ສຳເລັດແລ້ວ"</string>
-    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"ສະແດງໄອຄອນຂອງແອັບຯ"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"ສະແດງໄອຄອນຂອງແອັບຯໃນ Launcher"</string>
+    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"ສະແດງໄອຄອນຂອງແອັບ"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"ສະແດງໄອຄອນຂອງແອັບໃນ Launcher"</string>
     <string name="app_name" msgid="6320102637491234792">"ຜູ່​ສະ​ຫນອງ​ວັດຈະ​ນາ​ນຸ​ກົມ"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"ຜູ່​ສະ​ຫນອງ​ວັດຈະ​ນາ​ນຸ​ກົມ"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"ບໍລິການວັດຈະນານຸກົມ"</string>
diff --git a/java/res/values-mk/strings-talkback-descriptions.xml b/java/res/values-mk/strings-talkback-descriptions.xml
index 0955656..44ac433 100644
--- a/java/res/values-mk/strings-talkback-descriptions.xml
+++ b/java/res/values-mk/strings-talkback-descriptions.xml
@@ -64,7 +64,7 @@
     <string name="keyboard_mode_phone" msgid="2486230278064523665">"телефон"</string>
     <string name="keyboard_mode_text" msgid="9138789594969187494">"текст"</string>
     <string name="keyboard_mode_time" msgid="8558297845514402675">"време"</string>
-    <string name="keyboard_mode_url" msgid="8072011652949962550">"УРЛ"</string>
+    <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string>
     <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Неодамнешни"</string>
     <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Луѓе"</string>
     <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Предмети"</string>
diff --git a/java/res/values-ml/strings.xml b/java/res/values-ml/strings.xml
index 6d4ce71..bc1aebc 100644
--- a/java/res/values-ml/strings.xml
+++ b/java/res/values-ml/strings.xml
@@ -78,7 +78,7 @@
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"വളരെ നിർബന്ധിതമായി"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"അടുത്ത-പദ നിർദ്ദേശങ്ങൾ"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"നിർദ്ദേശങ്ങൾ സൃഷ്‌ടിക്കാൻ മുമ്പത്തെ പദം ഉപയോഗിക്കുക"</string>
-    <string name="gesture_input" msgid="826951152254563827">"ജെസ്റ്റർടൈപ്പിംഗ് സജീവമാക്കൂ"</string>
+    <string name="gesture_input" msgid="826951152254563827">"ജെസ്റ്റർടൈപ്പിംഗ് സജീവമാക്കുക"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"അക്ഷരങ്ങളിലൂടെ സ്ലൈഡ് ചെയ്‌തുകൊണ്ട് ഒരു പദം ടൈപ്പുചെയ്യുക"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"വിരൽചലന ട്രെയിൽ കാണിക്കുക"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ചലനാത്മക ഫ്ലോട്ടിംഗ് പ്രിവ്യൂ"</string>
diff --git a/java/res/values-mn/strings.xml b/java/res/values-mn/strings.xml
index a2efc42..69f9673 100644
--- a/java/res/values-mn/strings.xml
+++ b/java/res/values-mn/strings.xml
@@ -30,7 +30,7 @@
     <string name="settings_screen_accounts" msgid="2786418968536696670">"Хаяг &amp; Нууцлал"</string>
     <string name="settings_screen_appearance" msgid="7358046399111611615">"Харагдах байдал &amp; Зураглал"</string>
     <string name="settings_screen_gesture" msgid="8826372746901183556">"Зангаагаар бичих"</string>
-    <string name="settings_screen_correction" msgid="1616818407747682955">"Текст залруулалт"</string>
+    <string name="settings_screen_correction" msgid="1616818407747682955">"Текст засварлах"</string>
     <string name="settings_screen_advanced" msgid="7472408607625972994">"Дэлгэрэнгүй"</string>
     <string name="settings_screen_theme" msgid="2137262503543943871">"Загвар"</string>
     <string name="enable_split_keyboard" msgid="4177264923999493614">"Хуваагдмал гарыг идэвхжүүлэх"</string>
@@ -135,7 +135,7 @@
     <string name="not_now" msgid="6172462888202790482">"Одоо биш"</string>
     <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Ижилхэн оруулах загвар байна: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
     <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Товч дарах чичиргээний хугацаа"</string>
-    <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Товчны дууны хэмжээ"</string>
+    <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Товчны дууны түвшин"</string>
     <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Товчны удаан даралтын тохиргоо"</string>
     <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"Бодит гарт зориулсан эможи"</string>
     <string name="prefs_enable_emoji_alt_physical_key_summary" msgid="5259484820941627827">"Бодит Alt товчлуур нь эможи палитрыг харуулдаг"</string>
diff --git a/java/res/values-mr/strings-emoji-descriptions.xml b/java/res/values-mr/strings-emoji-descriptions.xml
index 07b5b50..373ef29 100644
--- a/java/res/values-mr/strings-emoji-descriptions.xml
+++ b/java/res/values-mr/strings-emoji-descriptions.xml
@@ -818,7 +818,7 @@
     <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"वर्तमानपत्र"</string>
     <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"मोबाईल फोन"</string>
     <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"डावीकडे उजवीकडे जाणार्‍या बाणासह मोबाईल फोन"</string>
-    <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"कंपन मोड"</string>
+    <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"व्हायब्रेट मोड"</string>
     <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"मोबाईल फोन बंद"</string>
     <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"मोबाईल फोन नाहीत"</string>
     <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"बार सह अँटेना"</string>
diff --git a/java/res/values-mr/strings.xml b/java/res/values-mr/strings.xml
index a7963ef..d07c72e 100644
--- a/java/res/values-mr/strings.xml
+++ b/java/res/values-mr/strings.xml
@@ -23,7 +23,7 @@
     <string name="english_ime_input_options" msgid="3909945612939668554">"इनपुट पर्याय"</string>
     <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"संपर्क नावे शोधा"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"शब्दलेखन तपासक आपल्या संपर्क सूचीमधील प्रविष्ट्या वापरतो"</string>
-    <string name="vibrate_on_keypress" msgid="5258079494276955460">"की दाबताना कंपन"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"की दाबताना व्हायब्रेट"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"की दाबताना आवाज"</string>
     <string name="popup_on_keypress" msgid="123894815723512944">"की दाबताना पॉपअप"</string>
     <string name="settings_screen_preferences" msgid="2696713156722014624">"प्राधान्ये"</string>
@@ -33,19 +33,19 @@
     <string name="settings_screen_correction" msgid="1616818407747682955">"मजकूर दुरुस्ती"</string>
     <string name="settings_screen_advanced" msgid="7472408607625972994">"प्रगत"</string>
     <string name="settings_screen_theme" msgid="2137262503543943871">"थीम"</string>
-    <string name="enable_split_keyboard" msgid="4177264923999493614">"विभाजित कीबोर्ड सक्षम करा"</string>
-    <string name="cloud_sync_title" msgid="8579271074443847055">"Google कीबोर्ड संकालन"</string>
-    <string name="cloud_sync_summary" msgid="7684887161145650857">"संकालन चालू केले आहे"</string>
+    <string name="enable_split_keyboard" msgid="4177264923999493614">"विभाजित कीबोर्ड सुरू करा"</string>
+    <string name="cloud_sync_title" msgid="8579271074443847055">"Google कीबोर्ड सिंक"</string>
+    <string name="cloud_sync_summary" msgid="7684887161145650857">"सिंक चालू केले आहे"</string>
     <string name="cloud_sync_summary_disabled" msgid="4553338970382825796">"डिव्‍हाइसेस वरून आपला वैयक्तिक शब्दकोश संकालित करा"</string>
-    <string name="sync_now_title" msgid="3088838136743277721">"आता संकालन करा"</string>
+    <string name="sync_now_title" msgid="3088838136743277721">"आता सिंक करा"</string>
     <string name="clear_sync_data_title" msgid="8582001557037069154">"क्लाउड डेटा हटवा"</string>
     <string name="clear_sync_data_summary" msgid="993477139012576584">"Google वरून आपला संकालित केलेला डेटा हटविते"</string>
-    <string name="clear_sync_data_confirmation" msgid="2811931135574727678">"आपला संकालित केलेला डेटा मेघवरून हटविला जाईल. आपल्‍याला खात्री आहे?"</string>
+    <string name="clear_sync_data_confirmation" msgid="2811931135574727678">"आपला संकालित केलेला डेटा मेघवरून हटवला जाईल. आपल्‍याला खात्री आहे?"</string>
     <string name="clear_sync_data_ok" msgid="613104067705915132">"हटवा"</string>
     <string name="cloud_sync_cancel" msgid="5877481252150919037">"रद्द करा"</string>
-    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"आपली वैयक्तिक डिरेक्टरी Google सर्व्हरवर सिंक केली जाईल आणि बॅकअप घेतला जाईल. आमचे उत्पादन सुधारित करण्यात मदत करण्यासाठी शब्दाच्या वारंवारतेची आकडेवारी माहिती गोळा केली जाऊ शकते. सर्व माहितीचे संकलन आणि वापर "<a href="https://www.google.com/policies/privacy">"Google चे गोपनीयता धोरण"</a>" शी सुसंगत असेल."</string>
+    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"तुमची वैयक्तिक डिरेक्टरी Google सर्व्हरवर सिंक केली जाईल आणि बॅकअप घेतला जाईल. आमचे उत्पादन सुधारित करण्यात मदत करण्यासाठी शब्दाच्या वारंवारतेची आकडेवारी माहिती गोळा केली जाऊ शकते. सर्व माहितीचे संकलन आणि वापर "<a href="https://www.google.com/policies/privacy">"Google चे गोपनीयता धोरण"</a>" शी सुसंगत असेल."</string>
     <string name="add_account_to_enable_sync" msgid="7836932571852055265">"या डीव्हाइसमध्ये हे वैशिष्ट्य सक्षम करण्यासाठी कृपया एक Google खाते जोडा"</string>
-    <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"Google Apps for Business खात्यांसह डिव्हाइसेससाठी संकालन उपलब्ध नाही"</string>
+    <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"Google Apps for Business खात्यांसह डिव्हाइसेससाठी सिंक उपलब्ध नाही"</string>
     <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"अन्य इनपुट पद्धतींवर स्विच करा"</string>
     <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"भाषा स्विच की अन्य इनपुट पद्धती देखील समाविष्ट करते"</string>
     <string name="show_language_switch_key" msgid="5915478828318774384">"भाषा स्विच की"</string>
@@ -57,7 +57,7 @@
     <string name="settings_system_default" msgid="6268225104743331821">"सिस्टम डीफॉल्ट"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नावे सुचवा"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सूचनांसाठी आणि सुधारणांसाठी संपर्कांमधील नावे वापरा"</string>
-    <string name="use_personalized_dicts" msgid="5167396352105467626">"वैयक्तिकृत केलेल्या सूचना"</string>
+    <string name="use_personalized_dicts" msgid="5167396352105467626">"पर्सनलाइझ केलेल्या सूचना"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> मध्ये सुधारणा करा"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"डबल-स्पेस पूर्णविरामचिन्ह"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"स्पेसबारवर डबल टॅप केल्याने पूर्णविरामचिन्ह व त्यापाठोपाठ स्पेस घातली जाते"</string>
@@ -70,7 +70,7 @@
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"टाइप करताना सुचविलेले शब्द प्रदर्शित करा"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"आक्षेपार्ह शब्द ब्लॉक करा"</string>
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"संभाव्य आक्षेपार्ह शब्द सुचवू नका"</string>
-    <string name="auto_correction" msgid="7630720885194996950">"स्‍वयं-सुधारणा"</string>
+    <string name="auto_correction" msgid="7630720885194996950">"ऑटो-करेक्शन"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"चुकीचे टाइप केलेले शब्द स्पेसबार आणि विरामचिन्हे स्वयंचलितपणे सुधारते"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"बंद"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"मर्यादशील"</string>
@@ -78,7 +78,7 @@
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"खूप आक्रमक"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"पुढील-शब्द सूचना"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"सूचना करताना मागील शब्द वापरा"</string>
-    <string name="gesture_input" msgid="826951152254563827">"जेश्चर टायपिंग सक्षम करा"</string>
+    <string name="gesture_input" msgid="826951152254563827">"जेश्चर टायपिंग सुरू करा"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"अक्षरांमधून स्लायडिंग करून एक शब्द इनपुट करा"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"जेश्चर अनुचिन्ह दर्शवा"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"डायनॅमिक फ्लोटिंग पूर्वावलोकन"</string>
@@ -91,8 +91,8 @@
     <string name="language_selection_title" msgid="3666971864764478269">"भाषा"</string>
     <string name="help_and_feedback" msgid="5328219371839879161">"मदत आणि अभिप्राय"</string>
     <string name="select_language" msgid="5709487854987078367">"भाषा"</string>
-    <string name="hint_add_to_dictionary" msgid="2645988432867033007">"जतन करण्यासाठी पुन्हा टॅप करा"</string>
-    <string name="hint_add_to_dictionary_without_word" msgid="6710206006427574423">"जतन करण्यासाठी येथे टॅप करा"</string>
+    <string name="hint_add_to_dictionary" msgid="2645988432867033007">"सेव्ह करण्यासाठी पुन्हा टॅप करा"</string>
+    <string name="hint_add_to_dictionary_without_word" msgid="6710206006427574423">"सेव्ह करण्यासाठी येथे टॅप करा"</string>
     <string name="has_dictionary" msgid="6071847973466625007">"शब्दकोश उपलब्ध"</string>
     <string name="keyboard_layout" msgid="8451164783510487501">"कीबोर्ड थीम"</string>
     <string name="switch_accounts" msgid="3321216593719006162">"खाती स्विच करा"</string>
@@ -123,18 +123,18 @@
     <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"वर्णमाला (PC)"</string>
     <string name="subtype_emoji" msgid="7483586578074549196">"इमोजी"</string>
     <string name="keyboard_theme" msgid="4909551808526178852">"कीबोर्ड थीम"</string>
-    <string name="custom_input_styles_title" msgid="8429952441821251512">"सानुकूल इनपुट शैली"</string>
+    <string name="custom_input_styles_title" msgid="8429952441821251512">"कस्टम इनपुट शैली"</string>
     <string name="add_style" msgid="6163126614514489951">"स्टाइल जोडा"</string>
     <string name="add" msgid="8299699805688017798">"जोडा"</string>
     <string name="remove" msgid="4486081658752944606">"काढा"</string>
     <string name="save" msgid="7646738597196767214">"सेव्ह करा"</string>
     <string name="subtype_locale" msgid="8576443440738143764">"भाषा"</string>
     <string name="keyboard_layout_set" msgid="4309233698194565609">"लेआउट"</string>
-    <string name="custom_input_style_note_message" msgid="8826731320846363423">"आपली सानुकूल इनपुट शैली आपण ती वापरणे प्रारंभ करण्यापूर्वी सक्षम करणे आवश्यक आहे. आपण आता ती सक्षम करू इच्‍छिता?"</string>
-    <string name="enable" msgid="5031294444630523247">"सक्षम करा"</string>
+    <string name="custom_input_style_note_message" msgid="8826731320846363423">"तुमची कस्टम इनपुट शैली तुम्ही ती वापरणे प्रारंभ करण्यापूर्वी सक्षम करणे आवश्यक आहे. तुम्ही आता ती सक्षम करू इच्‍छिता?"</string>
+    <string name="enable" msgid="5031294444630523247">"सुरू करा"</string>
     <string name="not_now" msgid="6172462888202790482">"आता नाही"</string>
     <string name="custom_input_style_already_exists" msgid="8008728952215449707">"समान इनपुट शैली आधीपासूनच अस्तित्वात आहे: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
-    <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"की दाबल्यानंतरचा कंपन कालावधी"</string>
+    <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"की दाबल्यानंतरचा व्हायब्रेट कालावधी"</string>
     <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"की दाबल्यावर आवाजाची तीव्रता"</string>
     <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"की जास्त दाबण्यात विलंब"</string>
     <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"वास्तविक कीबोर्डसाठी इमोजी"</string>
@@ -145,15 +145,15 @@
     <string name="setup_start_action" msgid="8936036460897347708">"सुरू करा"</string>
     <string name="setup_next_action" msgid="371821437915144603">"पुढील चरण"</string>
     <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सेट अप करत आहे"</string>
-    <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सक्षम करा"</string>
+    <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सुरू करा"</string>
     <string name="setup_step1_instruction" msgid="4295448056733329661">"कृपया आपल्या भाषांमध्ये आणि इनपुट सेटिंग्जमध्ये \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" तपासा. आपल्या डिव्हाइसवर चालण्यासाठी त्यास हे अधिकृत करेल."</string>
     <string name="setup_step1_finished_instruction" msgid="8701441895377434947">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> आपल्या भाषांमध्ये आणि इनपुट सेटिंग्जमध्ये आधीपासून सक्षम केला आहे, त्यामुळे हे चरण पूर्ण झाले आहे. पुढील चरणावर!"</string>
-    <string name="setup_step1_action" msgid="4366513534999901728">"सेटिंग्जमध्ये सक्षम करा"</string>
+    <string name="setup_step1_action" msgid="4366513534999901728">"सेटिंग्जमध्ये सुरू करा"</string>
     <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> वर स्विच करा"</string>
-    <string name="setup_step2_instruction" msgid="9141481964870023336">"पुढे, आपली सक्रिय मजकूर-इनपुट पद्धत म्हणून \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" निवडा."</string>
+    <string name="setup_step2_instruction" msgid="9141481964870023336">"पुढे, तुमची सक्रिय मजकूर-इनपुट पद्धत म्हणून \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" निवडा."</string>
     <string name="setup_step2_action" msgid="1660330307159824337">"इनपुट पद्धती स्विच करा"</string>
-    <string name="setup_step3_title" msgid="3154757183631490281">"अभिनंदन, आता आपण तयार आहात!"</string>
-    <string name="setup_step3_instruction" msgid="8025981829605426000">"आता आपण <xliff:g id="APPLICATION_NAME">%s</xliff:g> सह आपल्या सर्व आवडत्या अॅप्समध्ये टाइप करू शकता."</string>
+    <string name="setup_step3_title" msgid="3154757183631490281">"अभिनंदन, आता तुम्ही तयार आहात!"</string>
+    <string name="setup_step3_instruction" msgid="8025981829605426000">"आता तुम्ही <xliff:g id="APPLICATION_NAME">%s</xliff:g> सह आपल्या सर्व आवडत्या अॅप्समध्ये टाइप करू शकता."</string>
     <string name="setup_step3_action" msgid="600879797256942259">"अतिरिक्त भाषा कॉन्फिगर करा"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"समाप्त"</string>
     <string name="show_setup_wizard_icon" msgid="5008028590593710830">"अॅप आयकन दर्शवा"</string>
diff --git a/java/res/values-my/strings.xml b/java/res/values-my/strings.xml
index 685dc9b..a7b7f24 100644
--- a/java/res/values-my/strings.xml
+++ b/java/res/values-my/strings.xml
@@ -25,7 +25,7 @@
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"စာလုံးပေါင်းစစ်စနစ်က သင့်အဆက်အသွယ်စာရင်းမှ ရယူအသုံးပြုသည်"</string>
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"ခလုတ်နှိပ်သည်နှင့် တုံခါစေပါ"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"ခလုတ်နှိပ်လျှင် အသံမြည်"</string>
-    <string name="popup_on_keypress" msgid="123894815723512944">"ကီးနှိပ်လိုက်သည်နှင့် ပေါ်လာရန်"</string>
+    <string name="popup_on_keypress" msgid="123894815723512944">"ခလုတ်နှိပ်လိုက်သည်နှင့် ပေါ်လာရန်"</string>
     <string name="settings_screen_preferences" msgid="2696713156722014624">"ရွေးချယ်စရာများ"</string>
     <string name="settings_screen_accounts" msgid="2786418968536696670">"အကောင့်များ &amp; ကိုယ်ပိုင်ကိစ္စ"</string>
     <string name="settings_screen_appearance" msgid="7358046399111611615">"ပုံပန်းသွင်ပြင် &amp; အပြင်အဆင်များ"</string>
@@ -156,7 +156,7 @@
     <string name="setup_step3_instruction" msgid="8025981829605426000">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ဖြင့်သင့် ကြိုက်နှစ်သက်ရာ အပလီကေးရှင်းများအားလုံးအား ရိုက်ထည့်နိုင်ပါပြီ။"</string>
     <string name="setup_step3_action" msgid="600879797256942259">"ထပ်ပေါင်းဘာသာစကားများ ပြုပြင်မည်"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"ပြီးဆုံးသွားပြီ"</string>
-    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"အက်ပ်သင်္ကေတ ပြပါ"</string>
+    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"အက်ပ်သင်္ကေတပြခြင်း"</string>
     <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"launcher တွင် အပလီကေးရှင်း သင်္ကေတကိုပြရန်"</string>
     <string name="app_name" msgid="6320102637491234792">"အဘိဓါန် ထောက်ပံ့သူ"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"အဘိဓါန် ထောက်ပံ့သူ"</string>
diff --git a/java/res/values-ne/strings-emoji-descriptions.xml b/java/res/values-ne/strings-emoji-descriptions.xml
index 2396156..2735db8 100644
--- a/java/res/values-ne/strings-emoji-descriptions.xml
+++ b/java/res/values-ne/strings-emoji-descriptions.xml
@@ -249,7 +249,7 @@
     <string name="spoken_emoji_1F194" msgid="4903128609556175887">"चारपाते ID"</string>
     <string name="spoken_emoji_1F195" msgid="1433142500411060924">"चारपाते नयाँ"</string>
     <string name="spoken_emoji_1F196" msgid="8825160701159634202">"चारपाते N G"</string>
-    <string name="spoken_emoji_1F197" msgid="7841079241554176535">"चारपाते ठीक"</string>
+    <string name="spoken_emoji_1F197" msgid="7841079241554176535">"चारपाते ठिक"</string>
     <string name="spoken_emoji_1F198" msgid="7020298909426960622">"चारपाते SOS"</string>
     <string name="spoken_emoji_1F199" msgid="5971252667136235630">"उद्गार चिन्ह साथ चारपाते"</string>
     <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"चारपाते बिरुद्ध"</string>
@@ -651,7 +651,7 @@
     <string name="spoken_emoji_1F449" msgid="4764447975177805991">"औंला इशारा पछाडिबाट सूचकांक दायाँ"</string>
     <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"मुठी चिन्ह"</string>
     <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"हल्लाएको हात चिन्ह"</string>
-    <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"ठीक हात चिन्ह"</string>
+    <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"ठिक हात चिन्ह"</string>
     <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"औंठा माथी चिन्ह"</string>
     <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"औंठा तल चिन्ह"</string>
     <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"ताली चिन्ह"</string>
@@ -1082,7 +1082,7 @@
     <!-- no translation found for spoken_emoji_1F644 (446284817942609022) -->
     <skip />
     <string name="spoken_emoji_1F645" msgid="5202090629227587076">"कुनै राम्रो सङ्केत बिना साथ अनुहार"</string>
-    <string name="spoken_emoji_1F646" msgid="6734425134415138134">"ठीक इशारा साथ अनुहार"</string>
+    <string name="spoken_emoji_1F646" msgid="6734425134415138134">"ठिक इशारा साथ अनुहार"</string>
     <string name="spoken_emoji_1F647" msgid="1090285518444205483">"गहिरो निहुरेको व्यक्ति"</string>
     <string name="spoken_emoji_1F648" msgid="8978535230610522356">"हेर्नुहोस्-कुनै-दुष्ट बाँदर"</string>
     <string name="spoken_emoji_1F649" msgid="8486145279809495102">"सुन-कुनै-दुष्ट बाँदर"</string>
diff --git a/java/res/values-ne/strings-talkback-descriptions.xml b/java/res/values-ne/strings-talkback-descriptions.xml
index 4a84386..5d4d131 100644
--- a/java/res/values-ne/strings-talkback-descriptions.xml
+++ b/java/res/values-ne/strings-talkback-descriptions.xml
@@ -72,7 +72,7 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"स्थानहरू"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"प्रतिकहरू"</string>
     <string name="spoken_descrption_emoji_category_flags" msgid="5971573825866381472">"झण्डाहरू"</string>
-    <string name="spoken_descrption_emoji_category_eight_smiley_people" msgid="5682663819532433464">"स्माइली र व्यक्तिहरू"</string>
+    <string name="spoken_descrption_emoji_category_eight_smiley_people" msgid="5682663819532433464">"स्माइली र मान्छेहरू"</string>
     <string name="spoken_descrption_emoji_category_eight_animals_nature" msgid="5844950234883716704">"पशुहरू र प्रकृति"</string>
     <string name="spoken_descrption_emoji_category_eight_food_drink" msgid="6196944764485349650">"खाद्य र पेय"</string>
     <string name="spoken_descrption_emoji_category_eight_travel_places" msgid="3834085499381434611">"यात्रा र स्थानहरू"</string>
diff --git a/java/res/values-ne/strings.xml b/java/res/values-ne/strings.xml
index b552dd5..2a70553 100644
--- a/java/res/values-ne/strings.xml
+++ b/java/res/values-ne/strings.xml
@@ -98,7 +98,7 @@
     <string name="switch_accounts" msgid="3321216593719006162">"खाताहरू स्विच गर्नुहोस्"</string>
     <string name="no_accounts_selected" msgid="2073821619103904330">"कुनै खाता चयन गरिएको छैन"</string>
     <string name="account_selected" msgid="2846876462199625974">"हाल प्रयोग गर्दै <xliff:g id="EMAIL_ADDRESS">%1$s</xliff:g>"</string>
-    <string name="account_select_ok" msgid="9141195141763227797">"ठीक छ"</string>
+    <string name="account_select_ok" msgid="9141195141763227797">"ठिक छ"</string>
     <string name="account_select_cancel" msgid="5181012062618504340">"रद्द गर्नुहोस्"</string>
     <string name="account_select_sign_out" msgid="3299651159390187933">"बाहिर निकल्नुहोस्"</string>
     <string name="account_select_title" msgid="6279711684772922649">"प्रयोग गर्न खाता चयन गर्नुहोस्"</string>
@@ -153,7 +153,7 @@
     <string name="setup_step2_instruction" msgid="9141481964870023336">"त्यसपछि, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" लाई तपाईँको सक्रिय पाठ इनपुट विधिका रूपमा चयन गर्नुहोस्।"</string>
     <string name="setup_step2_action" msgid="1660330307159824337">"इनपुट विधि स्विच गर्नुहोस्"</string>
     <string name="setup_step3_title" msgid="3154757183631490281">"बधाई छ, तपाईँले सेट पुरा गर्नुभयो!"</string>
-    <string name="setup_step3_instruction" msgid="8025981829605426000">"अब तपाईं <xliff:g id="APPLICATION_NAME">%s</xliff:g>का साथ तपाईंका सम्पूर्ण मनपर्ने अनुप्रयोगहरू टाइप गर्न सक्नुहुन्छ।"</string>
+    <string name="setup_step3_instruction" msgid="8025981829605426000">"अब तपाईं <xliff:g id="APPLICATION_NAME">%s</xliff:g>का साथ तपाईंका सम्पूर्ण मन पर्ने अनुप्रयोगहरू टाइप गर्न सक्नुहुन्छ।"</string>
     <string name="setup_step3_action" msgid="600879797256942259">"थप भाषाहरू कन्फिगर गर्नुहोस्"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"समाप्त भयो"</string>
     <string name="show_setup_wizard_icon" msgid="5008028590593710830">"अनुप्रयोग आइकन देखाउनुहोस्"</string>
@@ -195,7 +195,7 @@
     <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"पदावली"</string>
     <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"थप विकल्पहरू"</string>
     <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"कम विकल्पहरू"</string>
-    <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ठीक छ"</string>
+    <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ठिक छ"</string>
     <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"शब्द:"</string>
     <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"सर्टकट:"</string>
     <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"भाषा:"</string>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index 195821b..4951f97 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -89,7 +89,7 @@
     <string name="voice_input_disabled_summary" msgid="6323489602945135165">"Geen spraakinvoermethoden ingeschakeld. Bekijk de instellingen bij \'Talen en invoer\'."</string>
     <string name="configure_input_method" msgid="373356270290742459">"Invoermethoden configureren"</string>
     <string name="language_selection_title" msgid="3666971864764478269">"Talen"</string>
-    <string name="help_and_feedback" msgid="5328219371839879161">"Help en feedback"</string>
+    <string name="help_and_feedback" msgid="5328219371839879161">"Hulp en feedback"</string>
     <string name="select_language" msgid="5709487854987078367">"Talen"</string>
     <string name="hint_add_to_dictionary" msgid="2645988432867033007">"Tik nogmaals om op te slaan"</string>
     <string name="hint_add_to_dictionary_without_word" msgid="6710206006427574423">"Tik hier om op te slaan"</string>
diff --git a/java/res/values-pa/strings.xml b/java/res/values-pa/strings.xml
index bcce742..0f972e5 100644
--- a/java/res/values-pa/strings.xml
+++ b/java/res/values-pa/strings.xml
@@ -62,7 +62,7 @@
     <string name="use_double_space_period" msgid="8781529969425082860">"ਡਬਲ-ਸਪੇਸ ਡੰਡੀ"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"ਸਪੇਸਬਾਰ ’ਤੇ ਡਬਲ ਟੈਪ ਕਰਨਾ ਇੱਕ ਡੰਡੀ ਤੋਂ ਬਾਅਦ ਇੱਕ ਸਪੇਸ ਦਾਖਲ ਕਰਦਾ ਹੈ"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ਆਟੋ-ਕੈਪਿਟਲਾਈਜ਼ੇਸ਼ਨ"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"ਹਰੇਕ ਵਾਕ ਦਾ ਪਹਿਲਾ ਸ਼ਬਦ ਕੈਪੀਟਲਾਈਜ਼ ਕਰੋ"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"ਹਰੇਕ ਵਾਕ ਦਾ ਪਹਿਲਾ ਅੱਖਰ ਵੱਡਾ ਕਰੋ"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"ਨਿੱਜੀ ਸ਼ਬਦਕੋਸ਼"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"ਐਡ-ਆਨ ਸ਼ਬਦਕੋਸ਼"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"ਮੁੱਖ ਸ਼ਬਦਕੋਸ਼"</string>
@@ -80,12 +80,12 @@
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"ਸੁਝਾਅ ਦੇਣ ਵਿੱਚ ਪਿਛਲਾ ਸ਼ਬਦ ਵਰਤੋ"</string>
     <string name="gesture_input" msgid="826951152254563827">"ਸੰਕੇਤ ਟਾਈਪਿੰਗ ਚਾਲੂ ਕਰੋ"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"ਅੱਖਰਾਂ ਰਾਹੀਂ ਸਲਾਈਡ ਕਰਕੇ ਇੱਕ ਸ਼ਬਦ ਦਾਖਲ ਕਰੋ"</string>
-    <string name="gesture_preview_trail" msgid="3802333369335722221">"ਸੰਕੇਤ ਲੀਹ  ਦਿਖਾਓ"</string>
+    <string name="gesture_preview_trail" msgid="3802333369335722221">"ਸੰਕੇਤ ਲੀਹ ਦਿਖਾਓ"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ਸਕਿਰਿਆ ਫਲੋਟਿੰਗ ਪੂਰਵ-ਝਲਕ"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ਸੰਕੇਤ ਦਿੰਦੇ ਸਮੇਂ ਸੁਝਾਇਆ ਗਿਆ ਸ਼ਬਦ ਦੇਖੋ"</string>
     <string name="gesture_space_aware" msgid="2078291600664682496">"ਵਾਕਾਂਸ਼ ਸੰਕੇਤ"</string>
     <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ਸਪੇਸ ਕੁੰਜੀ ਸਰਕਾ ਕੇ ਸੰਕੇਤਾਂ ਦੇ ਦੌਰਾਨ ਸਪੇਸ ਇਨਪੁਟ ਕਰੋ"</string>
-    <string name="voice_input" msgid="3583258583521397548">"ਵੌਇਸ ਇਨਪੁਟ ਕੁੰਜੀ"</string>
+    <string name="voice_input" msgid="3583258583521397548">"ਅਵਾਜ਼ੀ ਇਨਪੁੱਟ ਕੁੰਜੀ"</string>
     <string name="voice_input_disabled_summary" msgid="6323489602945135165">"ਕੋਈ ਵੌਇਸ ਇਨਪੁੱਟ ਵਿਧੀਆਂ ਚਾਲੂ ਨਹੀਂ ਕੀਤੀਆਂ ਹਨ। ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁੱਟ ਸੈਟਿੰਗਾਂ ਦੀ ਜਾਂਚ ਕਰੋ।"</string>
     <string name="configure_input_method" msgid="373356270290742459">"ਇਨਪੁੱਟ ਵਿਧੀਆਂ ਦੀ ਰੂਪ-ਰੇਖਾ ਬਦਲੋ"</string>
     <string name="language_selection_title" msgid="3666971864764478269">"ਭਾਸ਼ਾਵਾਂ"</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 81b40f0..3912782 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -57,7 +57,7 @@
     <string name="settings_system_default" msgid="6268225104743331821">"Ustawienie domyślne"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Proponuj osoby z kontaktów"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"W podpowiedziach i poprawkach używaj nazwisk z kontaktów"</string>
-    <string name="use_personalized_dicts" msgid="5167396352105467626">"Spersonalizowane sugestie"</string>
+    <string name="use_personalized_dicts" msgid="5167396352105467626">"Dostosowane sugestie"</string>
     <string name="enable_metrics_logging" msgid="5506372337118822837">"Popraw aplikację <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Szybka kropka ze spacją"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dwukrotne kliknięcie spacji wstawia kropkę ze spacją"</string>
diff --git a/java/res/values-pt/strings-talkback-descriptions.xml b/java/res/values-pt/strings-talkback-descriptions.xml
index fc0c6ee..c41baac 100644
--- a/java/res/values-pt/strings-talkback-descriptions.xml
+++ b/java/res/values-pt/strings-talkback-descriptions.xml
@@ -72,7 +72,7 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Lugares"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbolos"</string>
     <string name="spoken_descrption_emoji_category_flags" msgid="5971573825866381472">"Sinalizações"</string>
-    <string name="spoken_descrption_emoji_category_eight_smiley_people" msgid="5682663819532433464">"Emoticon e pessoas"</string>
+    <string name="spoken_descrption_emoji_category_eight_smiley_people" msgid="5682663819532433464">"Emoticons e pessoas"</string>
     <string name="spoken_descrption_emoji_category_eight_animals_nature" msgid="5844950234883716704">"Animais e natureza"</string>
     <string name="spoken_descrption_emoji_category_eight_food_drink" msgid="6196944764485349650">"Comidas e bebidas"</string>
     <string name="spoken_descrption_emoji_category_eight_travel_places" msgid="3834085499381434611">"Viagens e lugares"</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index a82b6b8..24a0154 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -23,15 +23,15 @@
     <string name="english_ime_input_options" msgid="3909945612939668554">"Opções de entrada"</string>
     <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Buscar nomes de contatos"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"O corretor ortográfico usa entradas de sua lista de contatos"</string>
-    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar a tecla"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao digitar"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"Som ao tocar a tecla"</string>
-    <string name="popup_on_keypress" msgid="123894815723512944">"Exibir pop-up ao digitar"</string>
+    <string name="popup_on_keypress" msgid="123894815723512944">"Mostrar letra em pop-up ao digitar"</string>
     <string name="settings_screen_preferences" msgid="2696713156722014624">"Preferências"</string>
     <string name="settings_screen_accounts" msgid="2786418968536696670">"Contas e privacidade"</string>
     <string name="settings_screen_appearance" msgid="7358046399111611615">"Aparência e layouts"</string>
     <string name="settings_screen_gesture" msgid="8826372746901183556">"Escrita com gestos"</string>
     <string name="settings_screen_correction" msgid="1616818407747682955">"Correção de texto"</string>
-    <string name="settings_screen_advanced" msgid="7472408607625972994">"Avançadas"</string>
+    <string name="settings_screen_advanced" msgid="7472408607625972994">"Avançado"</string>
     <string name="settings_screen_theme" msgid="2137262503543943871">"Tema"</string>
     <string name="enable_split_keyboard" msgid="4177264923999493614">"Ativar teclado dividido"</string>
     <string name="cloud_sync_title" msgid="8579271074443847055">"Sincronização Teclado do Google"</string>
@@ -62,14 +62,14 @@
     <string name="use_double_space_period" msgid="8781529969425082860">"Duplo espaço para ponto"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Toque duplo na barra de espaço insere um ponto seguido de espaço"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Capitalização automática"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"Inicia a primeira palavra de cada frase com letra maiúscula"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"Iniciar a primeira palavra de cada frase com letra maiúscula"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"Dicionário pessoal"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Dicionários complementares"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Dicionário principal"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugestões de correção"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Exibir sugestões de palavras durante a digitação"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Bloquear palavras ofensivas"</string>
-    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Não sugere palavras potencialmente ofensivas"</string>
+    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Não sugerir palavras potencialmente ofensivas"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Correção automática"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"A barra de espaço e a pontuação corrigem automaticamente palavras com erro de digitação"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desativado"</string>
@@ -77,7 +77,7 @@
     <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Agressivo"</string>
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Muito agressivo"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Sugerir palavra seguinte"</string>
-    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usa a palavra anterior ao fazer sugestões"</string>
+    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usar a palavra anterior ao fazer sugestões"</string>
     <string name="gesture_input" msgid="826951152254563827">"Ativar a escrita com gestos"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Insere uma palavra deslizando os dedos pelas letras"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percurso do gesto"</string>
@@ -121,7 +121,7 @@
     <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Alfabeto (Dvorak)"</string>
     <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string>
     <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string>
-    <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string>
+    <string name="subtype_emoji" msgid="7483586578074549196">"Emojis"</string>
     <string name="keyboard_theme" msgid="4909551808526178852">"Tema do teclado"</string>
     <string name="custom_input_styles_title" msgid="8429952441821251512">"Estilos personalizados"</string>
     <string name="add_style" msgid="6163126614514489951">"Adic. estilo"</string>
@@ -137,8 +137,8 @@
     <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Duração da vibração ao tocar"</string>
     <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume ao tocar na tela"</string>
     <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Atraso ao pressionar teclas"</string>
-    <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"Emoticons para teclado físico"</string>
-    <string name="prefs_enable_emoji_alt_physical_key_summary" msgid="5259484820941627827">"Tecla Alt física mostra a paleta de emoticons"</string>
+    <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"Emojis para teclado físico"</string>
+    <string name="prefs_enable_emoji_alt_physical_key_summary" msgid="5259484820941627827">"Exibe o teclado de emojis ao pressionar a tecla Alt"</string>
     <string name="button_default" msgid="3988017840431881491">"Padrão"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Bem-vindo ao <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"com entrada por gestos"</string>
diff --git a/java/res/values-ru/strings-emoji-descriptions.xml b/java/res/values-ru/strings-emoji-descriptions.xml
index a133412..1c6f4e0 100644
--- a/java/res/values-ru/strings-emoji-descriptions.xml
+++ b/java/res/values-ru/strings-emoji-descriptions.xml
@@ -249,7 +249,7 @@
     <string name="spoken_emoji_1F194" msgid="4903128609556175887">"Квадратный значок идентификатора."</string>
     <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Квадратный значок Новый."</string>
     <string name="spoken_emoji_1F196" msgid="8825160701159634202">"Квадратный значок Нехорошо."</string>
-    <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Квадратный значок О\'кей."</string>
+    <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Квадратный значок Окей."</string>
     <string name="spoken_emoji_1F198" msgid="7020298909426960622">"Квадратный значок СОС."</string>
     <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Квадратный значок обновления с восклицательным знаком."</string>
     <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Квадратный значок Против."</string>
@@ -651,7 +651,7 @@
     <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Белая рука с указательным пальцем вправо с тыльной стороны."</string>
     <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Кулак."</string>
     <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Машущая раскрытая ладонь."</string>
-    <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Пальцы, сложенные знаком О\'кей."</string>
+    <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Пальцы, сложенные знаком Окей."</string>
     <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Большой палец вверх."</string>
     <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Большой палец вниз."</string>
     <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Аплодисменты."</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 2415299..40ab5b5 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -58,7 +58,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Подсказывать имена"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Подсказывать исправления на основе имен из списка контактов"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Пользовательские словари"</string>
-    <string name="enable_metrics_logging" msgid="5506372337118822837">"Помочь улучшить <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Помочь улучшить приложение <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Точки автоматически"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Вводить точку с пробелом двойным нажатием пробела."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Заглавные автоматически"</string>
@@ -72,7 +72,7 @@
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Не предлагать слова, которые могут быть сочтены оскорбительными"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Автоисправление"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Автоматическое исправление опечаток при вводе знака препинания или пробела"</string>
-    <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Откл."</string>
+    <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Отключено"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умеренное"</string>
     <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Активно"</string>
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Очень активно"</string>
diff --git a/java/res/values-sq/strings.xml b/java/res/values-sq/strings.xml
index 5889c7e..7fc2837 100644
--- a/java/res/values-sq/strings.xml
+++ b/java/res/values-sq/strings.xml
@@ -204,7 +204,7 @@
     <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Redakto fjalën"</string>
     <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Redakto"</string>
     <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Fshi"</string>
-    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Nuk ke asnjë fjalë në fjalorin e përdoruesit. Për të shtuar një fjalë, trokit te butoni Shto (+)."</string>
+    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Nuk ke asnjë fjalë në fjalorin e përdoruesit. Për të shtuar një fjalë, trokit te butoni \"Shto (+)\"."</string>
     <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Për të gjitha gjuhët"</string>
     <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Gjuhë të tjera…"</string>
     <string name="user_dict_settings_delete" msgid="110413335187193859">"Fshi"</string>
diff --git a/java/res/values-sr/strings-talkback-descriptions.xml b/java/res/values-sr/strings-talkback-descriptions.xml
index ae18556..e1728bf 100644
--- a/java/res/values-sr/strings-talkback-descriptions.xml
+++ b/java/res/values-sr/strings-talkback-descriptions.xml
@@ -46,7 +46,7 @@
     <string name="spoken_description_dot" msgid="5644176501632325560">"Тачка"</string>
     <string name="spoken_description_language_switch" msgid="6818666779313544553">"Пребаци језик"</string>
     <string name="spoken_description_action_next" msgid="431761808119616962">"Претходно"</string>
-    <string name="spoken_description_action_previous" msgid="2919072174697865110">"Следеће"</string>
+    <string name="spoken_description_action_previous" msgid="2919072174697865110">"Назад"</string>
     <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift је омогућен"</string>
     <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock је омогућен"</string>
     <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Режим симбола"</string>
diff --git a/java/res/values-sw/strings-config-important-notice.xml b/java/res/values-sw/strings-config-important-notice.xml
index 7b10085..efc283d 100644
--- a/java/res/values-sw/strings-config-important-notice.xml
+++ b/java/res/values-sw/strings-config-important-notice.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Jifunze kutoka kwenye mawasiliano yako na data iliyocharazwa ili kuboresha mapendekezo"</string>
+    <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Tumia mawasiliano yako na data unayocharaza, kujifunza ili kuboresha mapendekezo"</string>
 </resources>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index a3268d5..16cfa80 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -52,9 +52,9 @@
     <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Onyesha wakati lugha ingizo mbalimbali zinapowezeshwa"</string>
     <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Kuchelewesha kutupa kitufe ibukizi"</string>
     <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Hakuna kuchelewa"</string>
-    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Chaguo-msingi"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Chaguomsingi"</string>
     <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"Milisekunde <xliff:g id="MILLISECONDS">%s</xliff:g>"</string>
-    <string name="settings_system_default" msgid="6268225104743331821">"Chaguo-msingi la mfumo"</string>
+    <string name="settings_system_default" msgid="6268225104743331821">"Chaguomsingi la mfumo"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"Pendekeza majini ya Anwani"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Tumia majina kutoka kwa Anwani kama mapendekezo na marekebisho"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Mapendekezo yaliyobadilishwa kukufaa"</string>
@@ -136,10 +136,10 @@
     <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Mfumo sawa wa maingizo tayari upo: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
     <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Bonyeza kitufe cha muda wa kutetema"</string>
     <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Bonyeza kitufe cha kiwango cha sauti"</string>
-    <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Ucheleweshaji wa kubofya kitufe na kushikilia"</string>
+    <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Ucheleweshaji unapobofya kitufe na kushikilia"</string>
     <string name="prefs_enable_emoji_alt_physical_key" msgid="5963640002335470112">"Emoji za kibodi halisi"</string>
     <string name="prefs_enable_emoji_alt_physical_key_summary" msgid="5259484820941627827">"Kitufe halisi cha Alt huonyesha kibao cha emoji"</string>
-    <string name="button_default" msgid="3988017840431881491">"Chaguo-msingi"</string>
+    <string name="button_default" msgid="3988017840431881491">"Chaguomsingi"</string>
     <string name="setup_welcome_title" msgid="6112821709832031715">"Karibu kwenye <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="setup_welcome_additional_description" msgid="8150252008545768953">"kwa Kuandika kwa ishara"</string>
     <string name="setup_start_action" msgid="8936036460897347708">"Anza kutumia"</string>
@@ -194,7 +194,7 @@
     <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Ongeza kwenye kamusi"</string>
     <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Fungu la maneno"</string>
     <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Hiari zingine"</string>
-    <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Hiari chache"</string>
+    <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Chaguo chache"</string>
     <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Sawa"</string>
     <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Neno:"</string>
     <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Njia ya mkato:"</string>
diff --git a/java/res/values-ta/strings.xml b/java/res/values-ta/strings.xml
index 9fee3e5..bbb7b62 100644
--- a/java/res/values-ta/strings.xml
+++ b/java/res/values-ta/strings.xml
@@ -68,8 +68,8 @@
     <string name="main_dictionary" msgid="4798763781818361168">"முதன்மை அகராதி"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"திருத்துதல் விருப்பங்களைக் காட்டு"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"உள்ளிடும்போது பரிந்துரைக்கப்பட்ட வார்த்தைகளைக் காட்டும்"</string>
-    <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"வன்மொழி சொற்களைத் தடு"</string>
-    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"வன்மொழியாக இருக்கும் சாத்தியமுள்ள சொற்களைப் பரிந்துரைக்க வேண்டாம்"</string>
+    <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"புண்படுத்தும் சொற்களைத் தடு"</string>
+    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"மனதைப் புண்படுத்தக் கூடிய சொற்களைப் பரிந்துரைக்க வேண்டாம்"</string>
     <string name="auto_correction" msgid="7630720885194996950">"தன்னியக்க திருத்தம்"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"ஸ்பேஸ்பாரும், நிறுத்தற்குறிகளும் தவறாக உள்ளிடப்பட்ட வார்த்தைகளை தானாக திருத்தும்"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ஆஃப்"</string>
diff --git a/java/res/values-te/strings.xml b/java/res/values-te/strings.xml
index 2b15564..9233af8 100644
--- a/java/res/values-te/strings.xml
+++ b/java/res/values-te/strings.xml
@@ -71,12 +71,12 @@
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"అభ్యంతరకరమైన పదాలను బ్లాక్ చేయి"</string>
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"సంభావ్యంగా అభ్యంతరకరమైన పదాలను సూచించవద్దు"</string>
     <string name="auto_correction" msgid="7630720885194996950">"స్వీయ-సవరణ"</string>
-    <string name="auto_correction_summary" msgid="5625751551134658006">"స్పేస్ బార్ మరియు విరామ చిహ్నాలు తప్పుగా టైప్ చేసిన పదాలను స్వయంచాలకంగా సరి చేస్తాయి"</string>
+    <string name="auto_correction_summary" msgid="5625751551134658006">"స్పేస్ బార్ మరియు విరామ చిహ్నాలు తప్పుగా టైప్ చేసిన పదాలను ఆటోమేటిక్‌గా సరి చేస్తాయి"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ఆఫ్‌ చేయి"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"మధ్యస్థం"</string>
     <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"తీవ్రం"</string>
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"చాలా తీవ్రం"</string>
-    <string name="bigram_prediction" msgid="1084449187723948550">"తర్వాత-పదం సూచనలు"</string>
+    <string name="bigram_prediction" msgid="1084449187723948550">"తర్వాతి-పదం సూచనలు"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"సూచనలను రూపొందించడంలో మునుపటి పదాన్ని ఉపయోగించు"</string>
     <string name="gesture_input" msgid="826951152254563827">"సంజ్ఞ టైపింగ్‌ను ప్రారంభించండి"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"అక్షరాల గుండా స్లైడ్ చేయడం ద్వారా పదాన్ని ఇన్‌పుట్ చేయండి"</string>
@@ -156,8 +156,8 @@
     <string name="setup_step3_instruction" msgid="8025981829605426000">"ఇప్పుడు మీరు <xliff:g id="APPLICATION_NAME">%s</xliff:g>తో మీకు ఇష్టమైన అన్ని అనువర్తనాల్లో టైప్ చేయవచ్చు."</string>
     <string name="setup_step3_action" msgid="600879797256942259">"అదనపు భాషలను కాన్ఫిగర్ చేయండి"</string>
     <string name="setup_finish_action" msgid="276559243409465389">"పూర్తయింది"</string>
-    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"అనువర్తన చిహ్నాన్ని చూపు"</string>
-    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"లాంచర్‌లో అనువర్తన చిహ్నాన్ని ప్రదర్శించు"</string>
+    <string name="show_setup_wizard_icon" msgid="5008028590593710830">"యాప్‌ చిహ్నాన్ని చూపు"</string>
+    <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"లాంచర్‌లో యాప్‌ చిహ్నాన్ని ప్రదర్శించు"</string>
     <string name="app_name" msgid="6320102637491234792">"నిఘంటువు ప్రదాత"</string>
     <string name="dictionary_provider_name" msgid="3027315045397363079">"నిఘంటువు ప్రదాత"</string>
     <string name="dictionary_service_name" msgid="6237472350693511448">"నిఘంటువు సేవ"</string>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index cf2833f..885b633 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -70,7 +70,7 @@
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"แสดงคำที่แนะนำขณะพิมพ์"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"บล็อกคำที่ไม่เหมาะสม"</string>
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"ไม่แนะนำคำที่อาจไม่เหมาะสม"</string>
-    <string name="auto_correction" msgid="7630720885194996950">"การแก้ไขอัตโนมัติ"</string>
+    <string name="auto_correction" msgid="7630720885194996950">"การแก้ไขคำผิดอัตโนมัติ"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"กดเว้นวรรคและเครื่องหมายจะแก้คำผิดอัตโนมัติ"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ปิด"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"ปานกลาง"</string>
diff --git a/java/res/values-tl/strings-emoji-descriptions.xml b/java/res/values-tl/strings-emoji-descriptions.xml
index 2027920..c364587 100644
--- a/java/res/values-tl/strings-emoji-descriptions.xml
+++ b/java/res/values-tl/strings-emoji-descriptions.xml
@@ -272,10 +272,10 @@
     <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Mahamog"</string>
     <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Nakasarang payong"</string>
     <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Gabi na may mga bituin"</string>
-    <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Pagsikat ng araw sa mga bundok"</string>
-    <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Pagsikat ng araw"</string>
+    <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Sunrise sa mga bundok"</string>
+    <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Sunrise"</string>
     <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Lungsod sa dapit-hapon"</string>
-    <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Paglubog ng araw sa mga gusali"</string>
+    <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Sunset sa mga gusali"</string>
     <string name="spoken_emoji_1F308" msgid="688704703985173377">"Bahaghari"</string>
     <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Tulay sa gabi"</string>
     <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Alon ng tubig"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index 0566591..2b4ca3e 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -68,7 +68,7 @@
     <string name="main_dictionary" msgid="4798763781818361168">"Pangunahing diksyonaryo"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Ipakita ang mga suhestiyon sa pagwawasto"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string>
-    <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"I-block ang nakakapanakit na salita"</string>
+    <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"I-block ang masakit na salita"</string>
     <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Huwag magmungkahi ng mga maaaring nakakapanakit na salita"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Auto na pagwawasto"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Awtomatikong tinatama ng spacebar at bantas ang maling na-type"</string>
@@ -85,7 +85,7 @@
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Tingnan ang iminungkahing salita habang gumagalaw"</string>
     <string name="gesture_space_aware" msgid="2078291600664682496">"Phrase gesture"</string>
     <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Maglagay ng espasyo sa pamamagitan ng pag-glide sa space key"</string>
-    <string name="voice_input" msgid="3583258583521397548">"Voice input key"</string>
+    <string name="voice_input" msgid="3583258583521397548">"Key sa voice input"</string>
     <string name="voice_input_disabled_summary" msgid="6323489602945135165">"Walang naka-enable na paraan ng pag-input gamit ang boses. Tingnan ang Mga setting ng wika at input."</string>
     <string name="configure_input_method" msgid="373356270290742459">"I-configure ang mga pamamaraan ng pag-input"</string>
     <string name="language_selection_title" msgid="3666971864764478269">"Mga Wika"</string>
@@ -204,7 +204,7 @@
     <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"I-edit ang salita"</string>
     <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"I-edit"</string>
     <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"I-delete"</string>
-    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Wala kang anumang mga salita sa diksyonaryo ng user. Upang magdagdag ng salita, i-tap ang button na Magdagdag (+)."</string>
+    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"Wala kang anumang salita sa diksyonaryo ng user. Para magdagdag ng salita, i-tap ang button na Magdagdag (+)."</string>
     <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Para sa lahat ng wika"</string>
     <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Higit pang mga wika..."</string>
     <string name="user_dict_settings_delete" msgid="110413335187193859">"I-delete"</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index d41ea69..bfebd97 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -62,14 +62,14 @@
     <string name="use_double_space_period" msgid="8781529969425082860">"Çift boşlukla nokta ekle"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Boşluk çubuğuna iki kez dokunmak nokta ve ardından bir boşluk ekler"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Otomatik büyük harf yap"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"Her cümlenin ilk harfini büyük harf yap"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"Her cümlenin ilk harfini büyük harf yapar"</string>
     <string name="edit_personal_dictionary" msgid="3996910038952940420">"Kişisel sözlük"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Ek sözlükler"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Ana sözlük"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Düzeltme önerilerini göster"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Yazarken, önerilen kelimeleri görüntüle"</string>
     <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Rahatsız edici kelimeleri engelle"</string>
-    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Rahatsız edici olabilecek kelimeleri önerme"</string>
+    <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Rahatsız edici olabilecek kelimeleri önermez"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Otomatik düzelt"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Boşluk tuşu ve noktalama işaretleri yanlış yazılan kelimeleri otomatikman düzeltir"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Kapalı"</string>
@@ -77,7 +77,7 @@
     <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Geniş ölçekte"</string>
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Çok geniş ölçekte"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Sonraki kelime önerileri"</string>
-    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Öneride bulunurken önceki kelimeyi kullan"</string>
+    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Öneride bulunurken önceki kelimeyi kullanır"</string>
     <string name="gesture_input" msgid="826951152254563827">"Hareketle yazmayı etkinleştir"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Kelime girmek için parmağınızı harflerin üzerinde kaydırın"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Hareket izini göster"</string>
diff --git a/java/res/values-uz/strings-action-keys.xml b/java/res/values-uz/strings-action-keys.xml
index c395901..e6cb07c 100644
--- a/java/res/values-uz/strings-action-keys.xml
+++ b/java/res/values-uz/strings-action-keys.xml
@@ -22,7 +22,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="label_go_key" msgid="4033615332628671065">"OK"</string>
     <string name="label_next_key" msgid="5586407279258592635">"Keyingisi"</string>
-    <string name="label_previous_key" msgid="1421141755779895275">"Avvalgi"</string>
+    <string name="label_previous_key" msgid="1421141755779895275">"Orqaga"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Tayyor"</string>
     <string name="label_send_key" msgid="482252074224462163">"Yuborish"</string>
     <string name="label_search_key" msgid="7965186050435796642">"Qidiruv"</string>
diff --git a/java/res/values-uz/strings-talkback-descriptions.xml b/java/res/values-uz/strings-talkback-descriptions.xml
index d6eb3c8..88434b7 100644
--- a/java/res/values-uz/strings-talkback-descriptions.xml
+++ b/java/res/values-uz/strings-talkback-descriptions.xml
@@ -44,9 +44,9 @@
     <string name="spoken_description_return" msgid="3183692287397645708">"Kiritish"</string>
     <string name="spoken_description_search" msgid="5099937658231911288">"Qidiruv"</string>
     <string name="spoken_description_dot" msgid="5644176501632325560">"Qora nuqta"</string>
-    <string name="spoken_description_language_switch" msgid="6818666779313544553">"Tilni o‘zgartirish"</string>
+    <string name="spoken_description_language_switch" msgid="6818666779313544553">"Tilni almashtirish"</string>
     <string name="spoken_description_action_next" msgid="431761808119616962">"Keyingisi"</string>
-    <string name="spoken_description_action_previous" msgid="2919072174697865110">"Avvalgi"</string>
+    <string name="spoken_description_action_previous" msgid="2919072174697865110">"Orqaga"</string>
     <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Yuqori registr yoqildi"</string>
     <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock yoqildi"</string>
     <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Belgilar rejimi"</string>
@@ -65,7 +65,7 @@
     <string name="keyboard_mode_text" msgid="9138789594969187494">"matn kiritish"</string>
     <string name="keyboard_mode_time" msgid="8558297845514402675">"vaqt"</string>
     <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string>
-    <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"So‘nggi ishlatilganlar"</string>
+    <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Oxirgilar"</string>
     <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Odamlar"</string>
     <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Narsa-buyumlar"</string>
     <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Tabiat"</string>
diff --git a/java/res/values-uz/strings.xml b/java/res/values-uz/strings.xml
index fea9975..e29b9fb 100644
--- a/java/res/values-uz/strings.xml
+++ b/java/res/values-uz/strings.xml
@@ -31,7 +31,7 @@
     <string name="settings_screen_appearance" msgid="7358046399111611615">"Ko‘rinish va sxema"</string>
     <string name="settings_screen_gesture" msgid="8826372746901183556">"Qo‘l uzmasdan yozish"</string>
     <string name="settings_screen_correction" msgid="1616818407747682955">"Matnni tuzatish"</string>
-    <string name="settings_screen_advanced" msgid="7472408607625972994">"Qo‘shimcha sozlamalar"</string>
+    <string name="settings_screen_advanced" msgid="7472408607625972994">"Kengaytirilgan sozlamalar"</string>
     <string name="settings_screen_theme" msgid="2137262503543943871">"Mavzu"</string>
     <string name="enable_split_keyboard" msgid="4177264923999493614">"Ikkiga ajratiladigan klaviaturani yoqish"</string>
     <string name="cloud_sync_title" msgid="8579271074443847055">"Klaviaturani sinxronlash"</string>
@@ -47,8 +47,8 @@
     <string name="add_account_to_enable_sync" msgid="7836932571852055265">"Ushbu imkoniyatni yoqish uchun, iltimos, Google hisobingizni qo‘shing"</string>
     <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"“Biznes uchun Google Apps” hisobi mavjud qurilmalarda sinxronlab bo‘lmaydi"</string>
     <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Boshqa usullarga o‘tish"</string>
-    <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tilni o‘zgartirish tugmasi matn kiritish usulini ham o‘zgartiradi"</string>
-    <string name="show_language_switch_key" msgid="5915478828318774384">"Tilni o‘zgartirish tugmasi"</string>
+    <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tilni almashtirish tugmasi matn kiritish usulini ham o‘zgartiradi"</string>
+    <string name="show_language_switch_key" msgid="5915478828318774384">"Tilni almashtirish tugmasi"</string>
     <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Bir nechta matn kiritish tili mavjud bo‘lganda ko‘rsatilsin"</string>
     <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Yopilish vaqti"</string>
     <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Kechikishsiz"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index aa39f8c..a9785aa 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -25,7 +25,7 @@
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Trình kiểm tra chính tả sử dụng các mục nhập từ danh bạ của bạn"</string>
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"Rung khi nhấn phím"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"Âm thanh khi nhấn phím"</string>
-    <string name="popup_on_keypress" msgid="123894815723512944">"Bật lên khi nhấn phím"</string>
+    <string name="popup_on_keypress" msgid="123894815723512944">"Phông chữ lớn hơn bật lên khi nhấn phím"</string>
     <string name="settings_screen_preferences" msgid="2696713156722014624">"Tùy chọn"</string>
     <string name="settings_screen_accounts" msgid="2786418968536696670">"Tài khoản và bảo mật"</string>
     <string name="settings_screen_appearance" msgid="7358046399111611615">"Giao diện và bố cục"</string>
@@ -85,7 +85,7 @@
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Xem từ được đề xuất trong khi dùng cử chỉ"</string>
     <string name="gesture_space_aware" msgid="2078291600664682496">"Cử chỉ nhập cụm từ"</string>
     <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Nhập dấu cách khi thực hiện cử chỉ bằng cách trượt tới phím cách"</string>
-    <string name="voice_input" msgid="3583258583521397548">"Khóa nhập giọng nói"</string>
+    <string name="voice_input" msgid="3583258583521397548">"Phím nhập liệu bằng giọng nói"</string>
     <string name="voice_input_disabled_summary" msgid="6323489602945135165">"Không có phương thức nhập bằng giọng nói nào được bật. Kiểm tra cài đặt Ngôn ngữ và phương thức nhập."</string>
     <string name="configure_input_method" msgid="373356270290742459">"Định cấu hình phương thức nhập"</string>
     <string name="language_selection_title" msgid="3666971864764478269">"Ngôn ngữ"</string>
diff --git a/java/res/values-zh-rHK/strings-talkback-descriptions.xml b/java/res/values-zh-rHK/strings-talkback-descriptions.xml
index c7a1b25..3930dd3 100644
--- a/java/res/values-zh-rHK/strings-talkback-descriptions.xml
+++ b/java/res/values-zh-rHK/strings-talkback-descriptions.xml
@@ -20,7 +20,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="spoken_use_headphones" msgid="4313642710742229868">"插上耳機即可聽到系統朗讀密碼鍵。"</string>
+    <string name="spoken_use_headphones" msgid="4313642710742229868">"插上耳機即可聽到系統讀出密碼鍵。"</string>
     <string name="spoken_current_text_is" msgid="4240549866156675799">"目前文字為 %s"</string>
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"未輸入文字"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"按「<xliff:g id="KEY_NAME">%1$s</xliff:g>」可將「<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>」修正為「<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>」"</string>
diff --git a/java/res/values-zh-rHK/strings.xml b/java/res/values-zh-rHK/strings.xml
index 29b6812..f5b7c94 100644
--- a/java/res/values-zh-rHK/strings.xml
+++ b/java/res/values-zh-rHK/strings.xml
@@ -77,9 +77,9 @@
     <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"加強模式"</string>
     <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"極度加強模式"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"建議下一個字詞"</string>
-    <string name="bigram_prediction_summary" msgid="3896362682751109677">"根據前一個字詞提出建議"</string>
+    <string name="bigram_prediction_summary" msgid="3896362682751109677">"根據上一個字詞提供建議"</string>
     <string name="gesture_input" msgid="826951152254563827">"啟用手勢輸入功能"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"透過滑動手指寫出字母來輸入字詞"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"透過在字母上滑動輸入字詞"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"顯示觸控蹤跡"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"動態浮動預覽"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"在啟用手勢輸入時顯示建議的字詞"</string>
@@ -204,7 +204,7 @@
     <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"編輯字詞"</string>
     <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"編輯"</string>
     <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"刪除"</string>
-    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"用戶字典中沒有任何字詞。如要新增字詞,請輕按「新增」(+) 按鈕。"</string>
+    <string name="user_dict_settings_empty_text" msgid="6889278304342592383">"您的用戶字典中沒有任何字詞。如要新增字詞,請輕按 [新增] (+) 按鈕。"</string>
     <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"所有語言"</string>
     <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"更多語言..."</string>
     <string name="user_dict_settings_delete" msgid="110413335187193859">"刪除"</string>
diff --git a/java/res/values-zh-rTW/strings-config-important-notice.xml b/java/res/values-zh-rTW/strings-config-important-notice.xml
index 326d6ce..4c94b06 100644
--- a/java/res/values-zh-rTW/strings-config-important-notice.xml
+++ b/java/res/values-zh-rTW/strings-config-important-notice.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="use_personalized_dicts_summary" msgid="590432261305469627">"根據你的通訊紀錄和以往輸入的資料改善建議項目"</string>
+    <string name="use_personalized_dicts_summary" msgid="590432261305469627">"根據你的通訊記錄和以往輸入的資料改善建議項目"</string>
 </resources>
diff --git a/java/shared.keystore b/java/shared.keystore
new file mode 100644
index 0000000..9c2f1bd
--- /dev/null
+++ b/java/shared.keystore
Binary files differ
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
index 442ab3e..31e142e 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
@@ -21,7 +21,7 @@
 import android.os.Build;
 import android.os.SystemClock;
 import android.provider.Settings;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
+import androidx.core.view.accessibility.AccessibilityEventCompat;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.MotionEvent;
diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java
index 237117d..f7a1163 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java
@@ -18,9 +18,9 @@
 
 import android.content.Context;
 import android.os.SystemClock;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import androidx.core.view.AccessibilityDelegateCompat;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
index 2de71ce..a3511c6 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
@@ -18,11 +18,11 @@
 
 import android.graphics.Rect;
 import android.os.Bundle;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
-import android.support.v4.view.accessibility.AccessibilityRecordCompat;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.accessibility.AccessibilityEventCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
+import androidx.core.view.accessibility.AccessibilityNodeProviderCompat;
+import androidx.core.view.accessibility.AccessibilityRecordCompat;
 import android.util.Log;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
diff --git a/java-overridable/src/com/android/inputmethod/compat/AppWorkaroundsHelper.java b/java/src/com/android/inputmethod/compat/AppWorkaroundsHelper.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/compat/AppWorkaroundsHelper.java
rename to java/src/com/android/inputmethod/compat/AppWorkaroundsHelper.java
diff --git a/java/src/com/android/inputmethod/compat/UserManagerCompatUtils.java b/java/src/com/android/inputmethod/compat/UserManagerCompatUtils.java
index 5dee316..a0ca2c9 100644
--- a/java/src/com/android/inputmethod/compat/UserManagerCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/UserManagerCompatUtils.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 import android.os.Build;
 import android.os.UserManager;
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.reflect.Method;
diff --git a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
index 16260ab..a584625 100644
--- a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
@@ -20,7 +20,7 @@
 
 import java.lang.reflect.Method;
 
-// TODO: Use {@link android.support.v4.view.ViewCompat} instead of this utility class.
+// TODO: Use {@link androidx.core.view.ViewCompat} instead of this utility class.
 // Currently {@link #getPaddingEnd(View)} and {@link #setPaddingRelative(View,int,int,int,int)}
 // are missing from android-support-v4 static library in KitKat SDK.
 public final class ViewCompatUtils {
diff --git a/java-overridable/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
rename to java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
diff --git a/java-overridable/src/com/android/inputmethod/dictionarypack/MetadataUriGetter.java b/java/src/com/android/inputmethod/dictionarypack/MetadataUriGetter.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/dictionarypack/MetadataUriGetter.java
rename to java/src/com/android/inputmethod/dictionarypack/MetadataUriGetter.java
diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiLayoutParams.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiLayoutParams.java
index 582e091..797541a 100644
--- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiLayoutParams.java
+++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiLayoutParams.java
@@ -17,7 +17,7 @@
 package com.android.inputmethod.keyboard.emoji;
 
 import android.content.res.Resources;
-import android.support.v4.view.ViewPager;
+import androidx.viewpager.widget.ViewPager;
 import android.view.View;
 import android.widget.LinearLayout;
 
diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java
index 68056e0..18b9c7e 100644
--- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java
+++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.emoji;
 
-import android.support.v4.view.PagerAdapter;
+import androidx.viewpager.widget.PagerAdapter;
 import android.util.Log;
 import android.util.SparseArray;
 import android.view.LayoutInflater;
diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java
index a3b869d..9ba8d2b 100644
--- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java
+++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java
@@ -23,7 +23,7 @@
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.preference.PreferenceManager;
-import android.support.v4.view.ViewPager;
+import androidx.viewpager.widget.ViewPager;
 import android.util.AttributeSet;
 import android.util.Pair;
 import android.util.TypedValue;
diff --git a/java-overridable/src/com/android/inputmethod/latin/DictionaryFacilitatorProvider.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorProvider.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/DictionaryFacilitatorProvider.java
rename to java/src/com/android/inputmethod/latin/DictionaryFacilitatorProvider.java
diff --git a/java/src/com/android/inputmethod/latin/PersonalDictionaryLookup.java b/java/src/com/android/inputmethod/latin/PersonalDictionaryLookup.java
deleted file mode 100644
index eed4ec1..0000000
--- a/java/src/com/android/inputmethod/latin/PersonalDictionaryLookup.java
+++ /dev/null
@@ -1,651 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.UserDictionary;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.common.CollectionUtils;
-import com.android.inputmethod.latin.common.LocaleUtils;
-import com.android.inputmethod.latin.define.DebugFlags;
-import com.android.inputmethod.latin.utils.ExecutorUtils;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * This class provides the ability to look into the system-wide "Personal dictionary". It loads the
- * data once when created and reloads it when notified of changes to {@link UserDictionary}
- *
- * It can be used directly to validate words or expand shortcuts, and it can be used by instances
- * of {@link PersonalLanguageModelHelper} that create language model files for a specific input
- * locale.
- *
- * Note, that the initial dictionary loading happens asynchronously so it is possible (hopefully
- * rarely) that {@link #isValidWord} or {@link #expandShortcut} is called before the initial load
- * has started.
- *
- * The caller should explicitly call {@link #close} when the object is no longer needed, in order
- * to release any resources and references to this object.  A service should create this object in
- * {@link android.app.Service#onCreate} and close it in {@link android.app.Service#onDestroy}.
- */
-public class PersonalDictionaryLookup implements Closeable {
-
-    /**
-     * To avoid loading too many dictionary entries in memory, we cap them at this number.  If
-     * that number is exceeded, the lowest-frequency items will be dropped.  Note, there is no
-     * explicit cap on the number of locales in every entry.
-     */
-    private static final int MAX_NUM_ENTRIES = 1000;
-
-    /**
-     * The delay (in milliseconds) to impose on reloads.  Previously scheduled reloads will be
-     * cancelled if a new reload is scheduled before the delay expires.  Thus, only the last
-     * reload in the series of frequent reloads will execute.
-     *
-     * Note, this value should be low enough to allow the "Add to dictionary" feature in the
-     * TextView correction (red underline) drop-down menu to work properly in the following case:
-     *
-     *   1. User types OOV (out-of-vocabulary) word.
-     *   2. The OOV is red-underlined.
-     *   3. User selects "Add to dictionary".  The red underline disappears while the OOV is
-     *      in a composing span.
-     *   4. The user taps space.  The red underline should NOT reappear.  If this value is very
-     *      high and the user performs the space tap fast enough, the red underline may reappear.
-     */
-    @UsedForTesting
-    static final int RELOAD_DELAY_MS = 200;
-
-    @UsedForTesting
-    static final Locale ANY_LOCALE = new Locale("");
-
-    private final String mTag;
-    private final ContentResolver mResolver;
-    private final String mServiceName;
-
-    /**
-     * Interface to implement for classes interested in getting notified of updates.
-     */
-    public static interface PersonalDictionaryListener {
-        public void onUpdate();
-    }
-
-    private final Set<PersonalDictionaryListener> mListeners = new HashSet<>();
-
-    public void addListener(@Nonnull final PersonalDictionaryListener listener) {
-        mListeners.add(listener);
-    }
-
-    public void removeListener(@Nonnull final PersonalDictionaryListener listener) {
-        mListeners.remove(listener);
-    }
-
-    /**
-     * Broadcast the update to all the Locale-specific language models.
-     */
-    @UsedForTesting
-    void notifyListeners() {
-        for (PersonalDictionaryListener listener : mListeners) {
-            listener.onUpdate();
-        }
-    }
-
-    /**
-     *  Content observer for changes to the personal dictionary. It has the following properties:
-     *    1. It spawns off a reload in another thread, after some delay.
-     *    2. It cancels previously scheduled reloads, and only executes the latest.
-     *    3. It may be called multiple times quickly in succession (and is in fact called so
-     *       when the dictionary is edited through its settings UI, when sometimes multiple
-     *       notifications are sent for the edited entry, but also for the entire dictionary).
-     */
-    private class PersonalDictionaryContentObserver extends ContentObserver implements Runnable {
-        public PersonalDictionaryContentObserver() {
-            super(null);
-        }
-
-        @Override
-        public boolean deliverSelfNotifications() {
-            return true;
-        }
-
-        // Support pre-API16 platforms.
-        @Override
-        public void onChange(boolean selfChange) {
-            onChange(selfChange, null);
-        }
-
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "onChange() : URI = " + uri);
-            }
-            // Cancel (but don't interrupt) any pending reloads (except the initial load).
-            if (mReloadFuture != null && !mReloadFuture.isCancelled() &&
-                    !mReloadFuture.isDone()) {
-                // Note, that if already cancelled or done, this will do nothing.
-                boolean isCancelled = mReloadFuture.cancel(false);
-                if (DebugFlags.DEBUG_ENABLED) {
-                    if (isCancelled) {
-                        Log.d(mTag, "onChange() : Canceled previous reload request");
-                    } else {
-                        Log.d(mTag, "onChange() : Failed to cancel previous reload request");
-                    }
-                }
-            }
-
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "onChange() : Scheduling reload in " + RELOAD_DELAY_MS + " ms");
-            }
-
-            // Schedule a new reload after RELOAD_DELAY_MS.
-            mReloadFuture = ExecutorUtils.getBackgroundExecutor(mServiceName)
-                    .schedule(this, RELOAD_DELAY_MS, TimeUnit.MILLISECONDS);
-        }
-
-        @Override
-        public void run() {
-            loadPersonalDictionary();
-        }
-    }
-
-    private final PersonalDictionaryContentObserver mPersonalDictionaryContentObserver =
-            new PersonalDictionaryContentObserver();
-
-    /**
-     * Indicates that a load is in progress, so no need for another.
-     */
-    private AtomicBoolean mIsLoading = new AtomicBoolean(false);
-
-    /**
-     * Indicates that this lookup object has been close()d.
-     */
-    private AtomicBoolean mIsClosed = new AtomicBoolean(false);
-
-    /**
-     * We store a map from a dictionary word to the set of locales & raw string(as it appears)
-     * We then iterate over the set of locales to find a match using LocaleUtils.
-     */
-    private volatile HashMap<String, HashMap<Locale, String>> mDictWords;
-
-    /**
-     * We store a map from a shortcut to a word for each locale.
-     * Shortcuts that apply to any locale are keyed by {@link #ANY_LOCALE}.
-     */
-    private volatile HashMap<Locale, HashMap<String, String>> mShortcutsPerLocale;
-
-    /**
-     *  The last-scheduled reload future.  Saved in order to cancel a pending reload if a new one
-     * is coming.
-     */
-    private volatile ScheduledFuture<?> mReloadFuture;
-
-    private volatile List<DictionaryStats> mDictionaryStats;
-
-    /**
-     * @param context the context from which to obtain content resolver
-     */
-    public PersonalDictionaryLookup(
-            @Nonnull final Context context,
-            @Nonnull final String serviceName) {
-        mTag = serviceName + ".Personal";
-
-        Log.i(mTag, "create()");
-
-        mServiceName = serviceName;
-        mDictionaryStats = new ArrayList<DictionaryStats>();
-        mDictionaryStats.add(new DictionaryStats(ANY_LOCALE, Dictionary.TYPE_USER, 0));
-        mDictionaryStats.add(new DictionaryStats(ANY_LOCALE, Dictionary.TYPE_USER_SHORTCUT, 0));
-
-        // Obtain a content resolver.
-        mResolver = context.getContentResolver();
-    }
-
-    public List<DictionaryStats> getDictionaryStats() {
-        return mDictionaryStats;
-    }
-
-    public void open() {
-        Log.i(mTag, "open()");
-
-        // Schedule the initial load to run immediately.  It's possible that the first call to
-        // isValidWord occurs before the dictionary has actually loaded, so it should not
-        // assume that the dictionary has been loaded.
-        loadPersonalDictionary();
-
-        // Register the observer to be notified on changes to the personal dictionary and all
-        // individual items.
-        //
-        // If the user is interacting with the Personal Dictionary settings UI, or with the
-        // "Add to dictionary" drop-down option, duplicate notifications will be sent for the same
-        // edit: if a new entry is added, there is a notification for the entry itself, and
-        // separately for the entire dictionary. However, when used programmatically,
-        // only notifications for the specific edits are sent. Thus, the observer is registered to
-        // receive every possible notification, and instead has throttling logic to avoid doing too
-        // many reloads.
-        mResolver.registerContentObserver(
-                UserDictionary.Words.CONTENT_URI,
-                true /* notifyForDescendents */,
-                mPersonalDictionaryContentObserver);
-    }
-
-    /**
-     * To be called by the garbage collector in the off chance that the service did not clean up
-     * properly.  Do not rely on this getting called, and make sure close() is called explicitly.
-     */
-    @Override
-    public void finalize() throws Throwable {
-        try {
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "finalize()");
-            }
-            close();
-        } finally {
-            super.finalize();
-        }
-    }
-
-    /**
-     * Cleans up PersonalDictionaryLookup: shuts down any extra threads and unregisters the observer.
-     *
-     * It is safe, but not advised to call this multiple times, and isValidWord would continue to
-     * work, but no data will be reloaded any longer.
-     */
-    @Override
-    public void close() {
-        if (DebugFlags.DEBUG_ENABLED) {
-            Log.d(mTag, "close() : Unregistering content observer");
-        }
-        if (mIsClosed.compareAndSet(false, true)) {
-            // Unregister the content observer.
-            mResolver.unregisterContentObserver(mPersonalDictionaryContentObserver);
-        }
-    }
-
-    /**
-     * Returns true if the initial load has been performed.
-     *
-     * @return true if the initial load is successful
-     */
-    public boolean isLoaded() {
-        return mDictWords != null && mShortcutsPerLocale != null;
-    }
-
-    /**
-     * Returns the set of words defined for the given locale and more general locales.
-     *
-     * For example, input locale en_US uses data for en_US, en, and the global dictionary.
-     *
-     * Note that this method returns expanded words, not shortcuts. Shortcuts are handled
-     * by {@link #getShortcutsForLocale}.
-     *
-     * @param inputLocale the locale to restrict for
-     * @return set of words that apply to the given locale.
-     */
-    public Set<String> getWordsForLocale(@Nonnull final Locale inputLocale) {
-        final HashMap<String, HashMap<Locale, String>> dictWords = mDictWords;
-        if (CollectionUtils.isNullOrEmpty(dictWords)) {
-            return Collections.emptySet();
-        }
-
-        final Set<String> words = new HashSet<>();
-        final String inputLocaleString = inputLocale.toString();
-        for (String word : dictWords.keySet()) {
-            HashMap<Locale, String> localeStringMap = dictWords.get(word);
-                if (!CollectionUtils.isNullOrEmpty(localeStringMap)) {
-                    for (Locale wordLocale : localeStringMap.keySet()) {
-                        final String wordLocaleString = wordLocale.toString();
-                        final int match = LocaleUtils.getMatchLevel(wordLocaleString, inputLocaleString);
-                        if (LocaleUtils.isMatch(match)) {
-                            words.add(localeStringMap.get(wordLocale));
-                        }
-                    }
-            }
-        }
-        return words;
-    }
-
-    /**
-     * Returns the set of shortcuts defined for the given locale and more general locales.
-     *
-     * For example, input locale en_US uses data for en_US, en, and the global dictionary.
-     *
-     * Note that this method returns shortcut keys, not expanded words. Words are handled
-     * by {@link #getWordsForLocale}.
-     *
-     * @param inputLocale the locale to restrict for
-     * @return set of shortcuts that apply to the given locale.
-     */
-    public Set<String> getShortcutsForLocale(@Nonnull final Locale inputLocale) {
-        final Map<Locale, HashMap<String, String>> shortcutsPerLocale = mShortcutsPerLocale;
-        if (CollectionUtils.isNullOrEmpty(shortcutsPerLocale)) {
-            return Collections.emptySet();
-        }
-
-        final Set<String> shortcuts = new HashSet<>();
-        if (!TextUtils.isEmpty(inputLocale.getCountry())) {
-            // First look for the country-specific shortcut: en_US, en_UK, fr_FR, etc.
-            final Map<String, String> countryShortcuts = shortcutsPerLocale.get(inputLocale);
-            if (!CollectionUtils.isNullOrEmpty(countryShortcuts)) {
-                shortcuts.addAll(countryShortcuts.keySet());
-            }
-        }
-
-        // Next look for the language-specific shortcut: en, fr, etc.
-        final Locale languageOnlyLocale =
-                LocaleUtils.constructLocaleFromString(inputLocale.getLanguage());
-        final Map<String, String> languageShortcuts = shortcutsPerLocale.get(languageOnlyLocale);
-        if (!CollectionUtils.isNullOrEmpty(languageShortcuts)) {
-            shortcuts.addAll(languageShortcuts.keySet());
-        }
-
-        // If all else fails, look for a global shortcut.
-        final Map<String, String> globalShortcuts = shortcutsPerLocale.get(ANY_LOCALE);
-        if (!CollectionUtils.isNullOrEmpty(globalShortcuts)) {
-            shortcuts.addAll(globalShortcuts.keySet());
-        }
-
-        return shortcuts;
-    }
-
-    /**
-     * Determines if the given word is a valid word in the given locale based on the dictionary.
-     * It tries hard to find a match: for example, casing is ignored and if the word is present in a
-     * more general locale (e.g. en or all locales), and isValidWord is asking for a more specific
-     * locale (e.g. en_US), it will be considered a match.
-     *
-     * @param word the word to match
-     * @param inputLocale the locale in which to match the word
-     * @return true iff the word has been matched for this locale in the dictionary.
-     */
-    public boolean isValidWord(@Nonnull final String word, @Nonnull final Locale inputLocale) {
-        if (!isLoaded()) {
-            // This is a corner case in the event the initial load of the dictionary has not
-            // completed. In that case, we assume the word is not a valid word in the dictionary.
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "isValidWord() : Initial load not complete");
-            }
-            return false;
-        }
-
-        if (DebugFlags.DEBUG_ENABLED) {
-            Log.d(mTag, "isValidWord() : Word [" + word + "] in Locale [" + inputLocale + "]");
-        }
-        // Atomically obtain the current copy of mDictWords;
-        final HashMap<String, HashMap<Locale, String>> dictWords = mDictWords;
-        // Lowercase the word using the given locale. Note, that dictionary
-        // words are lowercased using their locale, and theoretically the
-        // lowercasing between two matching locales may differ. For simplicity
-        // we ignore that possibility.
-        final String lowercased = word.toLowerCase(inputLocale);
-        final HashMap<Locale, String> dictLocales = dictWords.get(lowercased);
-
-        if (CollectionUtils.isNullOrEmpty(dictLocales)) {
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "isValidWord() : No entry for word [" + word + "]");
-            }
-            return false;
-        } else {
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "isValidWord() : Found entry for word [" + word + "]");
-            }
-            // Iterate over the locales this word is in.
-            for (final Locale dictLocale : dictLocales.keySet()) {
-                final int matchLevel = LocaleUtils.getMatchLevel(dictLocale.toString(),
-                        inputLocale.toString());
-                if (DebugFlags.DEBUG_ENABLED) {
-                    Log.d(mTag, "isValidWord() : MatchLevel for DictLocale [" + dictLocale
-                            + "] and InputLocale [" + inputLocale + "] is " + matchLevel);
-                }
-                if (LocaleUtils.isMatch(matchLevel)) {
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "isValidWord() : MatchLevel " + matchLevel + " IS a match");
-                    }
-                    return true;
-                }
-                if (DebugFlags.DEBUG_ENABLED) {
-                    Log.d(mTag, "isValidWord() : MatchLevel " + matchLevel + " is NOT a match");
-                }
-            }
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "isValidWord() : False, since none of the locales matched");
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Expands the given shortcut for the given locale.
-     *
-     * @param shortcut the shortcut to expand
-     * @param inputLocale the locale in which to expand the shortcut
-     * @return expanded shortcut iff the word is a shortcut in the dictionary.
-     */
-    @Nullable public String expandShortcut(
-            @Nonnull final String shortcut, @Nonnull final Locale inputLocale) {
-        if (DebugFlags.DEBUG_ENABLED) {
-            Log.d(mTag, "expandShortcut() : Shortcut [" + shortcut + "] for [" + inputLocale + "]");
-        }
-
-        // Atomically obtain the current copy of mShortcuts;
-        final HashMap<Locale, HashMap<String, String>> shortcutsPerLocale = mShortcutsPerLocale;
-
-        // Exit as early as possible. Most users don't use shortcuts.
-        if (CollectionUtils.isNullOrEmpty(shortcutsPerLocale)) {
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "expandShortcut() : User has no shortcuts");
-            }
-            return null;
-        }
-
-        if (!TextUtils.isEmpty(inputLocale.getCountry())) {
-            // First look for the country-specific shortcut: en_US, en_UK, fr_FR, etc.
-            final String expansionForCountry = expandShortcut(
-                    shortcutsPerLocale, shortcut, inputLocale);
-            if (!TextUtils.isEmpty(expansionForCountry)) {
-                if (DebugFlags.DEBUG_ENABLED) {
-                    Log.d(mTag, "expandShortcut() : Country expansion is ["
-                            + expansionForCountry + "]");
-                }
-                return expansionForCountry;
-            }
-        }
-
-        // Next look for the language-specific shortcut: en, fr, etc.
-        final Locale languageOnlyLocale =
-                LocaleUtils.constructLocaleFromString(inputLocale.getLanguage());
-        final String expansionForLanguage = expandShortcut(
-                shortcutsPerLocale, shortcut, languageOnlyLocale);
-        if (!TextUtils.isEmpty(expansionForLanguage)) {
-            if (DebugFlags.DEBUG_ENABLED) {
-                Log.d(mTag, "expandShortcut() : Language expansion is ["
-                        + expansionForLanguage + "]");
-            }
-            return expansionForLanguage;
-        }
-
-        // If all else fails, look for a global shortcut.
-        final String expansionForGlobal = expandShortcut(shortcutsPerLocale, shortcut, ANY_LOCALE);
-        if (!TextUtils.isEmpty(expansionForGlobal) && DebugFlags.DEBUG_ENABLED) {
-            Log.d(mTag, "expandShortcut() : Global expansion is [" + expansionForGlobal + "]");
-        }
-        return expansionForGlobal;
-    }
-
-    @Nullable private String expandShortcut(
-            @Nullable final HashMap<Locale, HashMap<String, String>> shortcutsPerLocale,
-            @Nonnull final String shortcut,
-            @Nonnull final Locale locale) {
-        if (CollectionUtils.isNullOrEmpty(shortcutsPerLocale)) {
-            return null;
-        }
-        final HashMap<String, String> localeShortcuts = shortcutsPerLocale.get(locale);
-        if (CollectionUtils.isNullOrEmpty(localeShortcuts)) {
-            return null;
-        }
-        return localeShortcuts.get(shortcut);
-    }
-
-    /**
-     * Loads the personal dictionary in the current thread.
-     *
-     * Only one reload can happen at a time. If already running, will exit quickly.
-     */
-    private void loadPersonalDictionary() {
-        // Bail out if already in the process of loading.
-        if (!mIsLoading.compareAndSet(false, true)) {
-            Log.i(mTag, "loadPersonalDictionary() : Already Loading (exit)");
-            return;
-        }
-        Log.i(mTag, "loadPersonalDictionary() : Start Loading");
-        HashMap<String, HashMap<Locale, String>> dictWords = new HashMap<>();
-        HashMap<Locale, HashMap<String, String>> shortcutsPerLocale = new HashMap<>();
-        // Load the dictionary.  Items are returned in the default sort order (by frequency).
-        Cursor cursor = mResolver.query(UserDictionary.Words.CONTENT_URI,
-                null, null, null, UserDictionary.Words.DEFAULT_SORT_ORDER);
-        if (null == cursor || cursor.getCount() < 1) {
-            Log.i(mTag, "loadPersonalDictionary() : Empty");
-        } else {
-            // Iterate over the entries in the personal dictionary.  Note, that iteration is in
-            // descending frequency by default.
-            while (dictWords.size() < MAX_NUM_ENTRIES && cursor.moveToNext()) {
-                // If there is no column for locale, skip this entry. An empty
-                // locale on the other hand will not be skipped.
-                final int dictLocaleIndex = cursor.getColumnIndex(UserDictionary.Words.LOCALE);
-                if (dictLocaleIndex < 0) {
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "loadPersonalDictionary() : Entry without LOCALE, skipping");
-                    }
-                    continue;
-                }
-                // If there is no column for word, skip this entry.
-                final int dictWordIndex = cursor.getColumnIndex(UserDictionary.Words.WORD);
-                if (dictWordIndex < 0) {
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "loadPersonalDictionary() : Entry without WORD, skipping");
-                    }
-                    continue;
-                }
-                // If the word is null, skip this entry.
-                final String rawDictWord = cursor.getString(dictWordIndex);
-                if (null == rawDictWord) {
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "loadPersonalDictionary() : Null word");
-                    }
-                    continue;
-                }
-                // If the locale is null, that's interpreted to mean all locales. Note, the special
-                // zz locale for an Alphabet (QWERTY) layout will not match any actual language.
-                String localeString = cursor.getString(dictLocaleIndex);
-                if (null == localeString) {
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "loadPersonalDictionary() : Null locale for word [" +
-                                rawDictWord + "], assuming all locales");
-                    }
-                    // For purposes of LocaleUtils, an empty locale matches everything.
-                    localeString = "";
-                }
-                final Locale dictLocale = LocaleUtils.constructLocaleFromString(localeString);
-                // Lowercase the word before storing it.
-                final String dictWord = rawDictWord.toLowerCase(dictLocale);
-                if (DebugFlags.DEBUG_ENABLED) {
-                    Log.d(mTag, "loadPersonalDictionary() : Adding word [" + dictWord
-                            + "] for locale " + dictLocale + "with value" + rawDictWord);
-                }
-                // Check if there is an existing entry for this word.
-                HashMap<Locale, String> dictLocales = dictWords.get(dictWord);
-                if (CollectionUtils.isNullOrEmpty(dictLocales)) {
-                    // If there is no entry for this word, create one.
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "loadPersonalDictionary() : Word [" + dictWord +
-                                "] not seen for other locales, creating new entry");
-                    }
-                    dictLocales = new HashMap<>();
-                    dictWords.put(dictWord, dictLocales);
-                }
-                // Append the locale to the list of locales this word is in.
-                dictLocales.put(dictLocale, rawDictWord);
-
-                // If there is no column for a shortcut, we're done.
-                final int shortcutIndex = cursor.getColumnIndex(UserDictionary.Words.SHORTCUT);
-                if (shortcutIndex < 0) {
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "loadPersonalDictionary() : Entry without SHORTCUT, done");
-                    }
-                    continue;
-                }
-                // If the shortcut is null, we're done.
-                final String shortcut = cursor.getString(shortcutIndex);
-                if (shortcut == null) {
-                    if (DebugFlags.DEBUG_ENABLED) {
-                        Log.d(mTag, "loadPersonalDictionary() : Null shortcut");
-                    }
-                    continue;
-                }
-                // Else, save the shortcut.
-                HashMap<String, String> localeShortcuts = shortcutsPerLocale.get(dictLocale);
-                if (localeShortcuts == null) {
-                    localeShortcuts = new HashMap<>();
-                    shortcutsPerLocale.put(dictLocale, localeShortcuts);
-                }
-                // Map to the raw input, which might be capitalized.
-                // This lets the user create a shortcut from "gm" to "General Motors".
-                localeShortcuts.put(shortcut, rawDictWord);
-            }
-        }
-
-        List<DictionaryStats> stats = new ArrayList<>();
-        stats.add(new DictionaryStats(ANY_LOCALE, Dictionary.TYPE_USER, dictWords.size()));
-        int numShortcuts = 0;
-        for (HashMap<String, String> shortcuts : shortcutsPerLocale.values()) {
-            numShortcuts += shortcuts.size();
-        }
-        stats.add(new DictionaryStats(ANY_LOCALE, Dictionary.TYPE_USER_SHORTCUT, numShortcuts));
-        mDictionaryStats = stats;
-
-        // Atomically replace the copy of mDictWords and mShortcuts.
-        mDictWords = dictWords;
-        mShortcutsPerLocale = shortcutsPerLocale;
-
-        // Allow other calls to loadPersonalDictionary to execute now.
-        mIsLoading.set(false);
-
-        Log.i(mTag, "loadPersonalDictionary() : Loaded " + mDictWords.size()
-                + " words and " + numShortcuts + " shortcuts");
-
-        notifyListeners();
-    }
-}
diff --git a/java-overridable/src/com/android/inputmethod/latin/about/AboutPreferences.java b/java/src/com/android/inputmethod/latin/about/AboutPreferences.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/about/AboutPreferences.java
rename to java/src/com/android/inputmethod/latin/about/AboutPreferences.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/accounts/AccountStateChangedListener.java b/java/src/com/android/inputmethod/latin/accounts/AccountStateChangedListener.java
similarity index 97%
rename from java-overridable/src/com/android/inputmethod/latin/accounts/AccountStateChangedListener.java
rename to java/src/com/android/inputmethod/latin/accounts/AccountStateChangedListener.java
index 60d420f..3c39c9a 100644
--- a/java-overridable/src/com/android/inputmethod/latin/accounts/AccountStateChangedListener.java
+++ b/java/src/com/android/inputmethod/latin/accounts/AccountStateChangedListener.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.latin.accounts;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import javax.annotation.Nullable;
 
diff --git a/java-overridable/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java b/java/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java
rename to java/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/define/DebugFlags.java b/java/src/com/android/inputmethod/latin/define/DebugFlags.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/define/DebugFlags.java
rename to java/src/com/android/inputmethod/latin/define/DebugFlags.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/define/DecoderSpecificConstants.java b/java/src/com/android/inputmethod/latin/define/DecoderSpecificConstants.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/define/DecoderSpecificConstants.java
rename to java/src/com/android/inputmethod/latin/define/DecoderSpecificConstants.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/define/JniLibName.java b/java/src/com/android/inputmethod/latin/define/JniLibName.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/define/JniLibName.java
rename to java/src/com/android/inputmethod/latin/define/JniLibName.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/define/ProductionFlags.java b/java/src/com/android/inputmethod/latin/define/ProductionFlags.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/define/ProductionFlags.java
rename to java/src/com/android/inputmethod/latin/define/ProductionFlags.java
diff --git a/java/src/com/android/inputmethod/latin/permissions/PermissionsActivity.java b/java/src/com/android/inputmethod/latin/permissions/PermissionsActivity.java
index bdd63fa..36d8ed9 100644
--- a/java/src/com/android/inputmethod/latin/permissions/PermissionsActivity.java
+++ b/java/src/com/android/inputmethod/latin/permissions/PermissionsActivity.java
@@ -21,8 +21,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityCompat;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityCompat;
 
 /**
  * An activity to help request permissions. It's used when no other activity is available, e.g. in
diff --git a/java/src/com/android/inputmethod/latin/permissions/PermissionsUtil.java b/java/src/com/android/inputmethod/latin/permissions/PermissionsUtil.java
index 747f64f..9a618a7 100644
--- a/java/src/com/android/inputmethod/latin/permissions/PermissionsUtil.java
+++ b/java/src/com/android/inputmethod/latin/permissions/PermissionsUtil.java
@@ -20,9 +20,9 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/java-overridable/src/com/android/inputmethod/latin/settings/AdditionalFeaturesSettingUtils.java b/java/src/com/android/inputmethod/latin/settings/AdditionalFeaturesSettingUtils.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/settings/AdditionalFeaturesSettingUtils.java
rename to java/src/com/android/inputmethod/latin/settings/AdditionalFeaturesSettingUtils.java
diff --git a/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
index 46fcc71..56e8f16 100644
--- a/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
@@ -26,7 +26,7 @@
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceGroup;
-import android.support.v4.view.ViewCompat;
+import androidx.core.view.ViewCompat;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsActivity.java b/java/src/com/android/inputmethod/latin/settings/SettingsActivity.java
index a7d157a..ac16577 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsActivity.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsActivity.java
@@ -25,7 +25,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.preference.PreferenceActivity;
-import android.support.v4.app.ActivityCompat;
+import androidx.core.app.ActivityCompat;
 import android.view.MenuItem;
 
 public final class SettingsActivity extends PreferenceActivity
diff --git a/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java b/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java
index 73d25f6..789694f 100644
--- a/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java
+++ b/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java
@@ -21,7 +21,7 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.support.v4.view.ViewCompat;
+import androidx.core.view.ViewCompat;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
diff --git a/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java b/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java
index 6734e61..9a39cea 100644
--- a/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java
+++ b/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java
@@ -20,7 +20,7 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.support.v4.view.ViewCompat;
+import androidx.core.view.ViewCompat;
 import android.util.AttributeSet;
 import android.view.View;
 
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java
index 356d9d0..5f99f90 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java
@@ -24,7 +24,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.preference.PreferenceActivity;
-import android.support.v4.app.ActivityCompat;
+import androidx.core.app.ActivityCompat;
 
 /**
  * Spell checker preference screen.
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index c1d1fad..840a4aa 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -21,7 +21,7 @@
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.drawable.Drawable;
-import android.support.v4.view.ViewCompat;
+import androidx.core.view.ViewCompat;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.TypedValue;
diff --git a/java-overridable/src/com/android/inputmethod/latin/touchinputconsumer/GestureConsumer.java b/java/src/com/android/inputmethod/latin/touchinputconsumer/GestureConsumer.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/touchinputconsumer/GestureConsumer.java
rename to java/src/com/android/inputmethod/latin/touchinputconsumer/GestureConsumer.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/DictionaryHeaderUtils.java b/java/src/com/android/inputmethod/latin/utils/DictionaryHeaderUtils.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/utils/DictionaryHeaderUtils.java
rename to java/src/com/android/inputmethod/latin/utils/DictionaryHeaderUtils.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/FeedbackUtils.java b/java/src/com/android/inputmethod/latin/utils/FeedbackUtils.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/utils/FeedbackUtils.java
rename to java/src/com/android/inputmethod/latin/utils/FeedbackUtils.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/FileTransforms.java b/java/src/com/android/inputmethod/latin/utils/FileTransforms.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/utils/FileTransforms.java
rename to java/src/com/android/inputmethod/latin/utils/FileTransforms.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/ManagedProfileUtils.java b/java/src/com/android/inputmethod/latin/utils/ManagedProfileUtils.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/utils/ManagedProfileUtils.java
rename to java/src/com/android/inputmethod/latin/utils/ManagedProfileUtils.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/MetadataFileUriGetter.java b/java/src/com/android/inputmethod/latin/utils/MetadataFileUriGetter.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/utils/MetadataFileUriGetter.java
rename to java/src/com/android/inputmethod/latin/utils/MetadataFileUriGetter.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtils.java b/java/src/com/android/inputmethod/latin/utils/StatsUtils.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/utils/StatsUtils.java
rename to java/src/com/android/inputmethod/latin/utils/StatsUtils.java
diff --git a/java-overridable/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java b/java/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java
similarity index 100%
rename from java-overridable/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java
rename to java/src/com/android/inputmethod/latin/utils/StatsUtilsManager.java
diff --git a/java/src/com/android/inputmethodcommon/InputMethodSettingsActivity.java b/java/src/com/android/inputmethodcommon/InputMethodSettingsActivity.java
new file mode 100644
index 0000000..6e868c9
--- /dev/null
+++ b/java/src/com/android/inputmethodcommon/InputMethodSettingsActivity.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 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
+ */
+
+package com.android.inputmethodcommon;
+
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+/**
+ * This is a helper class for an IME's settings preference activity. It's recommended for every
+ * IME to have its own settings preference activity which inherits this class.
+ */
+public abstract class InputMethodSettingsActivity extends PreferenceActivity
+        implements InputMethodSettingsInterface {
+    private final InputMethodSettingsImpl mSettings = new InputMethodSettingsImpl();
+    @SuppressWarnings("deprecation")
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(this));
+        mSettings.init(this, getPreferenceScreen());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setInputMethodSettingsCategoryTitle(int resId) {
+        mSettings.setInputMethodSettingsCategoryTitle(resId);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setInputMethodSettingsCategoryTitle(CharSequence title) {
+        mSettings.setInputMethodSettingsCategoryTitle(title);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerTitle(int resId) {
+        mSettings.setSubtypeEnablerTitle(resId);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerTitle(CharSequence title) {
+        mSettings.setSubtypeEnablerTitle(title);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerIcon(int resId) {
+        mSettings.setSubtypeEnablerIcon(resId);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerIcon(Drawable drawable) {
+        mSettings.setSubtypeEnablerIcon(drawable);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onResume() {
+        super.onResume();
+        mSettings.updateSubtypeEnabler();
+    }
+}
diff --git a/java/src/com/android/inputmethodcommon/InputMethodSettingsFragment.java b/java/src/com/android/inputmethodcommon/InputMethodSettingsFragment.java
new file mode 100644
index 0000000..49f0b87
--- /dev/null
+++ b/java/src/com/android/inputmethodcommon/InputMethodSettingsFragment.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.android.inputmethodcommon;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.preference.PreferenceFragment;
+
+/**
+ * This is a helper class for an IME's settings preference fragment. It's recommended for every
+ * IME to have its own settings preference fragment which inherits this class.
+ */
+public abstract class InputMethodSettingsFragment extends PreferenceFragment
+        implements InputMethodSettingsInterface {
+    private final InputMethodSettingsImpl mSettings = new InputMethodSettingsImpl();
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        final Context context = getActivity();
+        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(context));
+        mSettings.init(context, getPreferenceScreen());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setInputMethodSettingsCategoryTitle(int resId) {
+        mSettings.setInputMethodSettingsCategoryTitle(resId);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setInputMethodSettingsCategoryTitle(CharSequence title) {
+        mSettings.setInputMethodSettingsCategoryTitle(title);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerTitle(int resId) {
+        mSettings.setSubtypeEnablerTitle(resId);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerTitle(CharSequence title) {
+        mSettings.setSubtypeEnablerTitle(title);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerIcon(int resId) {
+        mSettings.setSubtypeEnablerIcon(resId);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerIcon(Drawable drawable) {
+        mSettings.setSubtypeEnablerIcon(drawable);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onResume() {
+        super.onResume();
+        mSettings.updateSubtypeEnabler();
+    }
+}
diff --git a/java/src/com/android/inputmethodcommon/InputMethodSettingsImpl.java b/java/src/com/android/inputmethodcommon/InputMethodSettingsImpl.java
new file mode 100644
index 0000000..cfa1a65
--- /dev/null
+++ b/java/src/com/android/inputmethodcommon/InputMethodSettingsImpl.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.android.inputmethodcommon;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import java.util.List;
+
+/* package private */ class InputMethodSettingsImpl implements InputMethodSettingsInterface {
+    private Preference mSubtypeEnablerPreference;
+    private int mInputMethodSettingsCategoryTitleRes;
+    private CharSequence mInputMethodSettingsCategoryTitle;
+    private int mSubtypeEnablerTitleRes;
+    private CharSequence mSubtypeEnablerTitle;
+    private int mSubtypeEnablerIconRes;
+    private Drawable mSubtypeEnablerIcon;
+    private InputMethodManager mImm;
+    private InputMethodInfo mImi;
+
+    /**
+     * Initialize internal states of this object.
+     * @param context the context for this application.
+     * @param prefScreen a PreferenceScreen of PreferenceActivity or PreferenceFragment.
+     * @return true if this application is an IME and has two or more subtypes, false otherwise.
+     */
+    public boolean init(final Context context, final PreferenceScreen prefScreen) {
+        mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+        mImi = getMyImi(context, mImm);
+        if (mImi == null || mImi.getSubtypeCount() <= 1) {
+            return false;
+        }
+        final Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS);
+        intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, mImi.getId());
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        mSubtypeEnablerPreference = new Preference(context);
+        mSubtypeEnablerPreference.setIntent(intent);
+        prefScreen.addPreference(mSubtypeEnablerPreference);
+        updateSubtypeEnabler();
+        return true;
+    }
+
+    private static InputMethodInfo getMyImi(Context context, InputMethodManager imm) {
+        final List<InputMethodInfo> imis = imm.getInputMethodList();
+        for (int i = 0; i < imis.size(); ++i) {
+            final InputMethodInfo imi = imis.get(i);
+            if (imis.get(i).getPackageName().equals(context.getPackageName())) {
+                return imi;
+            }
+        }
+        return null;
+    }
+
+    private static String getEnabledSubtypesLabel(
+            Context context, InputMethodManager imm, InputMethodInfo imi) {
+        if (context == null || imm == null || imi == null) return null;
+        final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(imi, true);
+        final StringBuilder sb = new StringBuilder();
+        final int N = subtypes.size();
+        for (int i = 0; i < N; ++i) {
+            final InputMethodSubtype subtype = subtypes.get(i);
+            if (sb.length() > 0) {
+                sb.append(", ");
+            }
+            sb.append(subtype.getDisplayName(context, imi.getPackageName(),
+                    imi.getServiceInfo().applicationInfo));
+        }
+        return sb.toString();
+    }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setInputMethodSettingsCategoryTitle(int resId) {
+        mInputMethodSettingsCategoryTitleRes = resId;
+        updateSubtypeEnabler();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setInputMethodSettingsCategoryTitle(CharSequence title) {
+        mInputMethodSettingsCategoryTitleRes = 0;
+        mInputMethodSettingsCategoryTitle = title;
+        updateSubtypeEnabler();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerTitle(int resId) {
+        mSubtypeEnablerTitleRes = resId;
+        updateSubtypeEnabler();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerTitle(CharSequence title) {
+        mSubtypeEnablerTitleRes = 0;
+        mSubtypeEnablerTitle = title;
+        updateSubtypeEnabler();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerIcon(int resId) {
+        mSubtypeEnablerIconRes = resId;
+        updateSubtypeEnabler();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSubtypeEnablerIcon(Drawable drawable) {
+        mSubtypeEnablerIconRes = 0;
+        mSubtypeEnablerIcon = drawable;
+        updateSubtypeEnabler();
+    }
+
+    public void updateSubtypeEnabler() {
+        final Preference pref = mSubtypeEnablerPreference;
+        if (pref == null) {
+            return;
+        }
+        final Context context = pref.getContext();
+        final CharSequence title;
+        if (mSubtypeEnablerTitleRes != 0) {
+            title = context.getString(mSubtypeEnablerTitleRes);
+        } else {
+            title = mSubtypeEnablerTitle;
+        }
+        pref.setTitle(title);
+        final Intent intent = pref.getIntent();
+        if (intent != null) {
+            intent.putExtra(Intent.EXTRA_TITLE, title);
+        }
+        final String summary = getEnabledSubtypesLabel(context, mImm, mImi);
+        if (!TextUtils.isEmpty(summary)) {
+            pref.setSummary(summary);
+        }
+        if (mSubtypeEnablerIconRes != 0) {
+            pref.setIcon(mSubtypeEnablerIconRes);
+        } else {
+            pref.setIcon(mSubtypeEnablerIcon);
+        }
+    }
+}
diff --git a/java/src/com/android/inputmethodcommon/InputMethodSettingsInterface.java b/java/src/com/android/inputmethodcommon/InputMethodSettingsInterface.java
new file mode 100644
index 0000000..6e97fae
--- /dev/null
+++ b/java/src/com/android/inputmethodcommon/InputMethodSettingsInterface.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 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
+ */
+
+package com.android.inputmethodcommon;
+
+import android.graphics.drawable.Drawable;
+
+/**
+ * InputMethodSettingsInterface is the interface for adding IME related preferences to
+ * PreferenceActivity or PreferenceFragment.
+ */
+public interface InputMethodSettingsInterface {
+    /**
+     * Sets the title for the input method settings category with a resource ID.
+     * @param resId The resource ID of the title.
+     */
+    public void setInputMethodSettingsCategoryTitle(int resId);
+
+    /**
+     * Sets the title for the input method settings category with a CharSequence.
+     * @param title The title for this preference.
+     */
+    public void setInputMethodSettingsCategoryTitle(CharSequence title);
+
+    /**
+     * Sets the title for the input method enabler preference for launching subtype enabler with a
+     * resource ID.
+     * @param resId The resource ID of the title.
+     */
+    public void setSubtypeEnablerTitle(int resId);
+
+    /**
+     * Sets the title for the input method enabler preference for launching subtype enabler with a
+     * CharSequence.
+     * @param title The title for this preference.
+     */
+    public void setSubtypeEnablerTitle(CharSequence title);
+
+    /**
+     * Sets the icon for the preference for launching subtype enabler with a resource ID.
+     * @param resId The resource id of an optional icon for the preference.
+     */
+    public void setSubtypeEnablerIcon(int resId);
+
+    /**
+     * Sets the icon for the Preference for launching subtype enabler with a Drawable.
+     * @param drawable The drawable of an optional icon for the preference.
+     */
+    public void setSubtypeEnablerIcon(Drawable drawable);
+}
diff --git a/native/jni/Android.mk b/native/jni/Android.mk
index 5384648..b9fc414 100644
--- a/native/jni/Android.mk
+++ b/native/jni/Android.mk
@@ -29,7 +29,7 @@
 
 LOCAL_CFLAGS += -Werror -Wall -Wextra -Weffc++ -Wformat=2 -Wcast-qual -Wcast-align \
     -Wwrite-strings -Wfloat-equal -Wpointer-arith -Winit-self -Wredundant-decls \
-    -Woverloaded-virtual -Wsign-promo -Wno-system-headers
+    -Woverloaded-virtual -Wsign-promo -Wno-system-headers -Wno-format-nonliteral
 
 # To suppress compiler warnings for unused variables/functions used for debug features etc.
 LOCAL_CFLAGS += -Wno-unused-parameter -Wno-unused-function
@@ -95,9 +95,6 @@
 #################### Clean up the tmp vars
 include $(LOCAL_PATH)/CleanupNativeFileList.mk
 
-#################### Unit test on host environment
-include $(LOCAL_PATH)/HostUnitTests.mk
-
 #################### Unit test on target environment
 include $(LOCAL_PATH)/TargetUnitTests.mk
 //LOCAL_CFLAGS += -Wall -Werror
diff --git a/native/jni/HostUnitTests.mk b/native/jni/HostUnitTests.mk
deleted file mode 100644
index 94cd764..0000000
--- a/native/jni/HostUnitTests.mk
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright (C) 2014 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Host build is never supported in unbundled (NDK/tapas) build
-ifeq (,$(TARGET_BUILD_APPS))
-
-# HACK: Temporarily disable host tool build on Mac until the build system is ready for C++11.
-LATINIME_HOST_OSNAME := $(shell uname -s)
-ifneq ($(LATINIME_HOST_OSNAME), Darwin) # TODO: Remove this
-
-LOCAL_PATH := $(call my-dir)
-
-######################################
-include $(CLEAR_VARS)
-
-include $(LOCAL_PATH)/NativeFileList.mk
-
-#################### Host library for unit test
-LATIN_IME_SRC_DIR := src
-LOCAL_ADDRESS_SANITIZER := true
-LOCAL_CFLAGS += -Wno-unused-parameter -Wno-unused-function -Wall -Werror
-LOCAL_CXX_STL := libc++
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(LATIN_IME_SRC_DIR)
-LOCAL_MODULE := liblatinime_host_static_for_unittests
-LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := $(addprefix $(LATIN_IME_SRC_DIR)/, $(LATIN_IME_CORE_SRC_FILES))
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-#################### Host native tests
-include $(CLEAR_VARS)
-LATIN_IME_TEST_SRC_DIR := tests
-LOCAL_ADDRESS_SANITIZER := true
-LOCAL_CFLAGS += -Wno-unused-parameter -Wno-unused-function
-LOCAL_CFLAGS += -Wall -Werror
-LOCAL_CXX_STL := libc++
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(LATIN_IME_SRC_DIR)
-LOCAL_MODULE := liblatinime_host_unittests
-LOCAL_MODULE_TAGS := tests
-LOCAL_SRC_FILES := $(addprefix $(LATIN_IME_TEST_SRC_DIR)/, $(LATIN_IME_CORE_TEST_FILES))
-LOCAL_STATIC_LIBRARIES += liblatinime_host_static_for_unittests
-include $(BUILD_HOST_NATIVE_TEST)
-
-include $(LOCAL_PATH)/CleanupNativeFileList.mk
-
-endif # Darwin - TODO: Remove this
-
-endif # TARGET_BUILD_APPS
-
-#################### Clean up the tmp vars
-LATINIME_HOST_OSNAME :=
-LATIN_IME_SRC_DIR :=
-LATIN_IME_TEST_SRC_DIR :=
diff --git a/native/jni/src/defines.h b/native/jni/src/defines.h
index 10b930e..1531b6c 100644
--- a/native/jni/src/defines.h
+++ b/native/jni/src/defines.h
@@ -17,6 +17,8 @@
 #ifndef LATINIME_DEFINES_H
 #define LATINIME_DEFINES_H
 
+#include <cstdint>
+
 #ifdef __GNUC__
 #define AK_FORCE_INLINE __attribute__((always_inline)) __inline__
 #else // __GNUC__
@@ -51,7 +53,7 @@
     int si = 0;
     int di = 0;
     while (si < sourceSize && di < destLimit && 0 != source[si]) {
-        const int codePoint = source[si++];
+        const uint32_t codePoint = static_cast<uint32_t>(source[si++]);
         if (codePoint < 0x7F) { // One byte
             dest[di++] = codePoint;
         } else if (codePoint < 0x7FF) { // Two bytes
diff --git a/tests/Android.mk b/tests/Android.mk
index 7c0bb4f..23b0a93 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -19,6 +19,10 @@
 LOCAL_MODULE_TAGS := tests
 LOCAL_CERTIFICATE := shared
 
+LOCAL_FULL_LIBS_MANIFEST_FILES := \
+    $(LOCAL_PATH)/AndroidManifest.xml \
+    $(LOCAL_PATH)/AndroidManifest_SdkVersion.xml
+
 # Do not compress dictionary files to mmap dict data runtime
 LOCAL_AAPT_FLAGS += -0 .dict
 # Do not compress test data file
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index c7a9e13..cf778c1 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -15,9 +15,8 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.inputmethod.latin.tests">
-
-    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
+    package="com.android.inputmethod.latin.tests"
+    android:versionCode="28">
 
     <uses-permission android:name="android.permission.READ_CONTACTS" />
 
diff --git a/tests/AndroidManifest_SdkVersion.xml b/tests/AndroidManifest_SdkVersion.xml
new file mode 100644
index 0000000..5d3268c
--- /dev/null
+++ b/tests/AndroidManifest_SdkVersion.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.inputmethod.latin.tests">
+    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
+</manifest>
diff --git a/tests/AndroidTest.xml b/tests/AndroidTest.xml
new file mode 100644
index 0000000..d560cb9
--- /dev/null
+++ b/tests/AndroidTest.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Runs Tests for LatinIME.">
+    <!--
+        To run this test with atest, run the following commands:
+
+            tapas adb LatinIME LatinIMETests arm64 userdebug && \
+            DISABLE_PROGUARD=true make -j LatinIME && \
+            adb install -r $OUT/system/app/LatinIME/LatinIME.apk && \
+            atest LatinIMETests
+
+        currently tradefed does not look up files under $OUT/system/
+        hence we cannot rely on "test-file-name" to install LatinIME.apk
+    -->
+
+    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="LatinIMETests.apk" />
+    </target_preparer>
+
+    <option name="test-tag" value="LatinIMETests" />
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="com.android.inputmethod.latin.tests" />
+        <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
+    </test>
+</configuration>
diff --git a/tests/src/com/android/inputmethod/compat/LocaleSpanCompatUtilsTests.java b/tests/src/com/android/inputmethod/compat/LocaleSpanCompatUtilsTests.java
index 67e7646..05c15ec 100644
--- a/tests/src/com/android/inputmethod/compat/LocaleSpanCompatUtilsTests.java
+++ b/tests/src/com/android/inputmethod/compat/LocaleSpanCompatUtilsTests.java
@@ -16,18 +16,29 @@
 
 package com.android.inputmethod.compat;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import android.graphics.Typeface;
 import android.os.Build;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.style.StyleSpan;
 
 import java.util.Locale;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class LocaleSpanCompatUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class LocaleSpanCompatUtilsTests {
+    @Test
     public void testInstantiatable() {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
             // LocaleSpan isn't yet available.
@@ -61,6 +72,7 @@
         assertEquals(expectedCount, spans.length);
     }
 
+    @Test
     public void testUpdateLocaleSpan() {
         if (!LocaleSpanCompatUtils.isLocaleSpanAvailable()) {
             return;
diff --git a/tests/src/com/android/inputmethod/compat/SuggestionSpanUtilsTest.java b/tests/src/com/android/inputmethod/compat/SuggestionSpanUtilsTest.java
index 2d6d28f..820648d 100644
--- a/tests/src/com/android/inputmethod/compat/SuggestionSpanUtilsTest.java
+++ b/tests/src/com/android/inputmethod/compat/SuggestionSpanUtilsTest.java
@@ -16,10 +16,15 @@
 
 package com.android.inputmethod.compat;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import android.annotation.TargetApi;
+import android.content.Context;
 import android.os.Build;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.style.SuggestionSpan;
@@ -33,8 +38,16 @@
 
 import javax.annotation.Nullable;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class SuggestionSpanUtilsTest extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SuggestionSpanUtilsTest {
+
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
 
     /**
      * Helper method to create a dummy {@link SuggestedWordInfo}.
@@ -91,6 +104,7 @@
     }
 
     @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
+    @Test
     public void testGetTextWithAutoCorrectionIndicatorUnderline() {
         final String ORIGINAL_TEXT = "Hey!";
         final Locale NONNULL_LOCALE = new Locale("en", "GB");
@@ -107,6 +121,7 @@
     }
 
     @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
+    @Test
     public void testGetTextWithAutoCorrectionIndicatorUnderlineRootLocale() {
         final String ORIGINAL_TEXT = "Hey!";
         final CharSequence text = SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
@@ -121,6 +136,7 @@
                 new String[]{}, Locale.ROOT, text);
     }
 
+    @Test
     public void testGetTextWithSuggestionSpan() {
         final SuggestedWordInfo prediction1 =
                 createWordInfo("Quality", SuggestedWordInfo.KIND_PREDICTION);
@@ -218,6 +234,7 @@
         }
     }
 
+    @Test
     public void testFindFirstLocaleFromSuggestionSpans() {
         final String[] suggestions = new String[] {"Quality", "Speed", "Price"};
         final SuggestionSpan nullLocaleSpan = new SuggestionSpan((Locale)null, suggestions, 0);
diff --git a/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java b/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java
index c399cce..ec7c2ab 100644
--- a/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java
+++ b/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java
@@ -16,10 +16,12 @@
 
 package com.android.inputmethod.compat;
 
+import static org.junit.Assert.assertTrue;
+
 import android.graphics.Typeface;
 import android.os.Parcel;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextUtils;
@@ -29,8 +31,13 @@
 
 import java.util.Arrays;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class TextInfoCompatUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class TextInfoCompatUtilsTests {
     final private static String TEST_TEXT = "0123456789";
     final private static int TEST_COOKIE = 0x1234;
     final private static int TEST_SEQUENCE_NUMBER = 0x4321;
@@ -45,6 +52,7 @@
     final private static int TEST_URL_SPAN_END = 7;
     final private static int TEST_URL_SPAN_FLAGS = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
 
+    @Test
     public void testGetCharSequence() {
         final SpannableString text = new SpannableString(TEST_TEXT);
         text.setSpan(TEST_STYLE_SPAN, TEST_STYLE_SPAN_START, TEST_STYLE_SPAN_END,
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutTest.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutTest.java
index 1e1f82f..d620a77 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutTest.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutTest.java
@@ -18,15 +18,17 @@
 
 import static org.junit.Assert.assertEquals;
 
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import java.util.ArrayList;
 
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 @SmallTest
+@RunWith(AndroidJUnit4.class)
 public class KeyboardLayoutTest {
-
     @Test
     public void testNewKeyboardLayout() {
         KeyboardLayout keyboardLayout = KeyboardLayout
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
index 33e88c1..5942773 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
@@ -16,22 +16,34 @@
 
 package com.android.inputmethod.keyboard;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_ICS;
 import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_KLP;
 import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_LXX_DARK;
 import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_LXX_LIGHT;
 
+import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Build;
 import android.os.Build.VERSION_CODES;
 import android.preference.PreferenceManager;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import java.util.Arrays;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class KeyboardThemeTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class KeyboardThemeTests {
     private SharedPreferences mPrefs;
 
     private static final int THEME_ID_NULL = -1;
@@ -39,9 +51,12 @@
     private static final int THEME_ID_ILLEGAL = -3;
     private static final String ILLEGAL_THEME_ID_STRING = "ThisCausesNumberFormatExecption";
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
+
+    @Before
+    public void setUp() throws Exception {
         mPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());
     }
 
@@ -110,6 +125,7 @@
         assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
     }
 
+    @Test
     public void testKeyboardThemePreferenceOnKlp() {
         assertKeyboardThemePreferenceOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
         assertKeyboardThemePreferenceOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
@@ -130,6 +146,7 @@
         assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
     }
 
+    @Test
     public void testKeyboardThemePreferenceOnLxx() {
         assertKeyboardThemePreferenceOnLxx(Build.VERSION_CODES.LOLLIPOP);
     }
@@ -165,6 +182,7 @@
         assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_KLP);
     }
 
+    @Test
     public void testDefaultKeyboardThemeOnKlp() {
         assertDefaultKeyboardThemeOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
         assertDefaultKeyboardThemeOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
@@ -183,6 +201,7 @@
         assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_LIGHT);
     }
 
+    @Test
     public void testDefaultKeyboardThemeOnLxx() {
         assertDefaultKeyboardThemeOnLxx(Build.VERSION_CODES.LOLLIPOP);
     }
@@ -231,6 +250,7 @@
     }
 
     // Upgrading keyboard on I,J and K.
+    @Test
     public void testUpgradeKeyboardToLxxOnKlp() {
         assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
         assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
@@ -250,6 +270,7 @@
     }
 
     // Upgrading keyboard on L.
+    @Test
     public void testUpgradeKeyboardToLxxOnLxx() {
         assertUpgradeKeyboardToLxxOnLxx(Build.VERSION_CODES.LOLLIPOP);
     }
@@ -293,6 +314,7 @@
     }
 
     // Update platform from I,J, and K to I,J, and K
+    @Test
     public void testUpgradePlatformToKlpFromKlp() {
         assertUpgradePlatformToKlpFrom(VERSION_CODES.ICE_CREAM_SANDWICH);
         assertUpgradePlatformToKlpFrom(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
@@ -318,6 +340,7 @@
     }
 
     // Update platform from I,J, and K to L
+    @Test
     public void testUpgradePlatformToLxx() {
         assertUpgradePlatformToLxxFrom(VERSION_CODES.ICE_CREAM_SANDWICH);
         assertUpgradePlatformToLxxFrom(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
@@ -328,6 +351,7 @@
     }
 
     // Update platform from L to L.
+    @Test
     public void testUpgradePlatformToLxxFromLxx() {
         final int oldSdkVersion = Build.VERSION_CODES.LOLLIPOP;
         final int newSdkVersion = Build.VERSION_CODES.LOLLIPOP;
@@ -364,10 +388,12 @@
         }
     }
 
+    @Test
     public void testSortedKeyboardTheme() {
         assertSortedKeyboardThemeArray(KeyboardTheme.KEYBOARD_THEMES);
     }
 
+    @Test
     public void testSortedAvailableKeyboardTheme() {
         assertSortedKeyboardThemeArray(KeyboardTheme.getAvailableThemeArray(getContext()));
     }
@@ -384,6 +410,7 @@
         assertSortedKeyboardThemeArray(LIMITED_THEMES);
     }
 
+    @Test
     public void testMissingSelectedThemeIcs() {
         // Clean up preferences.
         setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, THEME_ID_NULL);
@@ -399,6 +426,7 @@
         assertEquals(THEME_ID_KLP, actualTheme.mThemeId);
     }
 
+    @Test
     public void testMissingSelectedThemeKlp() {
         // Clean up preferences.
         setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, THEME_ID_NULL);
@@ -414,6 +442,7 @@
         assertEquals(THEME_ID_KLP, actualTheme.mThemeId);
     }
 
+    @Test
     public void testMissingSelectedThemeLxx() {
         // Clean up preferences.
         setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, THEME_ID_NULL);
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java
index ebefe2d..2c15a02 100644
--- a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderAutoOrderTests.java
@@ -16,13 +16,21 @@
 
 package com.android.inputmethod.keyboard;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.keyboard.MoreKeysKeyboard.MoreKeysKeyboardParams;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @MediumTest
-public class MoreKeysKeyboardBuilderAutoOrderTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class MoreKeysKeyboardBuilderAutoOrderTests {
     private static final int WIDTH = 10;
     private static final int HEIGHT = 10;
 
@@ -38,11 +46,6 @@
     private static final int XPOS_R1 = WIDTH * 8 + WIDTH / 2;
     private static final int XPOS_R0 = WIDTH * 9 + WIDTH / 2;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
     private static MoreKeysKeyboardParams createParams(final int numKeys, final int columnNum,
             final int coordXInParent) {
         final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
@@ -52,6 +55,7 @@
         return params;
     }
 
+    @Test
     public void testLayoutError() {
         MoreKeysKeyboardParams params = null;
         try {
@@ -69,6 +73,7 @@
     // "<1>" is the default key.
 
     // <1>
+    @Test
     public void testLayout1KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_M0);
         assertEquals("1 key auto 5 M0 columns", 1, params.mNumColumns);
@@ -81,6 +86,7 @@
     }
 
     // |<1>
+    @Test
     public void testLayout1KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L0);
         assertEquals("1 key auto 5 L0 columns", 1, params.mNumColumns);
@@ -93,6 +99,7 @@
     }
 
     // |___ <1>
+    @Test
     public void testLayout1KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L1);
         assertEquals("1 key auto 5 L1 columns", 1, params.mNumColumns);
@@ -105,6 +112,7 @@
     }
 
     // |___ ___ <1>
+    @Test
     public void testLayout1KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L2);
         assertEquals("1 key auto 5 L2 columns", 1, params.mNumColumns);
@@ -117,6 +125,7 @@
     }
 
     // <1>|
+    @Test
     public void testLayout1KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R0);
         assertEquals("1 key auto 5 R0 columns", 1, params.mNumColumns);
@@ -129,6 +138,7 @@
     }
 
     // <1> ___|
+    @Test
     public void testLayout1KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R1);
         assertEquals("1 key auto 5 R1 columns", 1, params.mNumColumns);
@@ -141,6 +151,7 @@
     }
 
     // <1> ___ ___|
+    @Test
     public void testLayout1KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R2);
         assertEquals("1 key auto 5 R2 columns", 1, params.mNumColumns);
@@ -153,6 +164,7 @@
     }
 
     // <1> [2]
+    @Test
     public void testLayout2KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_M0);
         assertEquals("2 key auto 5 M0 columns", 2, params.mNumColumns);
@@ -166,6 +178,7 @@
     }
 
     // |<1> [2]
+    @Test
     public void testLayout2KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L0);
         assertEquals("2 key auto 5 L0 columns", 2, params.mNumColumns);
@@ -179,6 +192,7 @@
     }
 
     // |___ <1> [2]
+    @Test
     public void testLayout2KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L1);
         assertEquals("2 key auto 5 L1 columns", 2, params.mNumColumns);
@@ -192,6 +206,7 @@
     }
 
     // |___ ___ <1> [2]
+    @Test
     public void testLayout2KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L2);
         assertEquals("2 key auto 5 L2 columns", 2, params.mNumColumns);
@@ -205,6 +220,7 @@
     }
 
     // [2] <1>|
+    @Test
     public void testLayout2KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R0);
         assertEquals("2 key auto 5 R0 columns", 2, params.mNumColumns);
@@ -218,6 +234,7 @@
     }
 
     // [2] <1> ___|
+    @Test
     public void testLayout2KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R1);
         assertEquals("2 key auto 5 R1 columns", 2, params.mNumColumns);
@@ -231,6 +248,7 @@
     }
 
     // <1> [2] ___|
+    @Test
     public void testLayout2KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R2);
         assertEquals("2 key auto 5 R2 columns", 2, params.mNumColumns);
@@ -244,6 +262,7 @@
     }
 
     // [3] <1> [2]
+    @Test
     public void testLayout3KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_M0);
         assertEquals("3 key auto 5 M0 columns", 3, params.mNumColumns);
@@ -258,6 +277,7 @@
     }
 
     // |<1> [2] [3]
+    @Test
     public void testLayout3KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L0);
         assertEquals("3 key auto 5 L0 columns", 3, params.mNumColumns);
@@ -272,6 +292,7 @@
     }
 
     // |___ <1> [2] [3]
+    @Test
     public void testLayout3KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L1);
         assertEquals("3 key auto 5 L1 columns", 3, params.mNumColumns);
@@ -286,6 +307,7 @@
     }
 
     // |___ [3] <1> [2]
+    @Test
     public void testLayout3KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L2);
         assertEquals("3 key auto 5 L2 columns", 3, params.mNumColumns);
@@ -300,6 +322,7 @@
     }
 
     // [3] [2] <1>|
+    @Test
     public void testLayout3KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R0);
         assertEquals("3 key auto 5 R0 columns", 3, params.mNumColumns);
@@ -314,6 +337,7 @@
     }
 
     // [3] [2] <1> ___|
+    @Test
     public void testLayout3KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R1);
         assertEquals("3 key auto 5 R1 columns", 3, params.mNumColumns);
@@ -328,6 +352,7 @@
     }
 
     // [3] <1> [2] ___|
+    @Test
     public void testLayout3KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R2);
         assertEquals("3 key auto 5 R2 columns", 3, params.mNumColumns);
@@ -343,6 +368,7 @@
 
     // [3]
     // <1> [2]
+    @Test
     public void testLayout3KeyAuto2M0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_M0);
         assertEquals("3 key auto 2 M0 columns", 2, params.mNumColumns);
@@ -358,6 +384,7 @@
 
     // |[3]
     // |<1> [2]
+    @Test
     public void testLayout3KeyAuto2L0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L0);
         assertEquals("3 key auto 2 L0 columns", 2, params.mNumColumns);
@@ -373,6 +400,7 @@
 
     // |___ [3]
     // |___ <1> [2]
+    @Test
     public void testLayout3KeyAuto2L1() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L1);
         assertEquals("3 key auto 2 L1 columns", 2, params.mNumColumns);
@@ -388,6 +416,7 @@
 
     // |        [3]
     // |___ ___ <1> [2]
+    @Test
     public void testLayout3KeyAuto2L2() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L2);
         assertEquals("3 key auto 2 L2 columns", 2, params.mNumColumns);
@@ -403,6 +432,7 @@
 
     //     [3]|
     // [2] <1>|
+    @Test
     public void testLayout3KeyAuto2R0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R0);
         assertEquals("3 key auto 2 R0 columns", 2, params.mNumColumns);
@@ -418,6 +448,7 @@
 
     //     [3]    |
     // [2] <1> ___|
+    @Test
     public void testLayout3KeyAuto2R1() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R1);
         assertEquals("3 key auto 2 R1 columns", 2, params.mNumColumns);
@@ -433,6 +464,7 @@
 
     // [3]        |
     // <1> [2] ___|
+    @Test
     public void testLayout3KeyAuto2R2() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R2);
         assertEquals("3 key auto 2 R2 columns", 2, params.mNumColumns);
@@ -448,6 +480,7 @@
 
     //     [4]
     // [3] <1> [2]
+    @Test
     public void testLayout4KeyAuto3M0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_M0);
         assertEquals("4 key auto 3 M0 columns", 3, params.mNumColumns);
@@ -464,6 +497,7 @@
 
     // |[4]
     // |<1> [2] [3]
+    @Test
     public void testLayout4KeyAuto3L0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L0);
         assertEquals("4 key auto 3 L0 columns", 3, params.mNumColumns);
@@ -480,6 +514,7 @@
 
     // |___ [4]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout4KeyAuto3L1() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L1);
         assertEquals("4 key auto 3 L1 columns", 3, params.mNumColumns);
@@ -496,6 +531,7 @@
 
     // |___ ___ [4]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout4KeyAuto3L2() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L2);
         assertEquals("4 key auto 3 L2 columns", 3, params.mNumColumns);
@@ -512,6 +548,7 @@
 
     //         [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout4KeyAuto3R0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R0);
         assertEquals("4 key auto 3 R0 columns", 3, params.mNumColumns);
@@ -528,6 +565,7 @@
 
     //         [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout4KeyAuto3R1() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R1);
         assertEquals("4 key auto 3 R1 columns", 3, params.mNumColumns);
@@ -544,6 +582,7 @@
 
     //     [4]     ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout4KeyAuto3R2() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R2);
         assertEquals("4 key auto 3 R2 columns", 3, params.mNumColumns);
@@ -559,6 +598,7 @@
     }
 
     // [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyAuto4M0() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_M0);
         assertEquals("4 key auto 4 M0 columns", 4, params.mNumColumns);
@@ -574,6 +614,7 @@
     }
 
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout4KeyAuto4L0() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L0);
         assertEquals("4 key auto 4 L0 columns", 4, params.mNumColumns);
@@ -589,6 +630,7 @@
     }
 
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout4KeyAuto4L1() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L1);
         assertEquals("4 key auto 4 L1 columns", 4, params.mNumColumns);
@@ -604,6 +646,7 @@
     }
 
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyAuto4L2() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L2);
         assertEquals("4 key auto 4 L2 columns", 4, params.mNumColumns);
@@ -619,6 +662,7 @@
     }
 
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout4KeyAuto4R0() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R0);
         assertEquals("4 key auto 4 R0 columns", 4, params.mNumColumns);
@@ -634,6 +678,7 @@
     }
 
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout4KeyAuto4R1() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R1);
         assertEquals("4 key auto 4 R1 columns", 4, params.mNumColumns);
@@ -649,6 +694,7 @@
     }
 
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout4KeyAuto4R2() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R2);
         assertEquals("4 key auto 4 R2 columns", 4, params.mNumColumns);
@@ -664,6 +710,7 @@
     }
 
     // [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_M0);
         assertEquals("4 key auto 5 M0 columns", 4, params.mNumColumns);
@@ -679,6 +726,7 @@
     }
 
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout4KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L0);
         assertEquals("4 key auto 5 L0 columns", 4, params.mNumColumns);
@@ -694,6 +742,7 @@
     }
 
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout4KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L1);
         assertEquals("4 key auto 5 L1 columns", 4, params.mNumColumns);
@@ -709,6 +758,7 @@
     }
 
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L2);
         assertEquals("4 key auto 5 L2 columns", 4, params.mNumColumns);
@@ -724,6 +774,7 @@
     }
 
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout4KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R0);
         assertEquals("4 key auto 5 R0 columns", 4, params.mNumColumns);
@@ -739,6 +790,7 @@
     }
 
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout4KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R1);
         assertEquals("4 key auto 5 R1 columns", 4, params.mNumColumns);
@@ -754,6 +806,7 @@
     }
 
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout4KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R2);
         assertEquals("4 key auto 5 R2 columns", 4, params.mNumColumns);
@@ -770,6 +823,7 @@
 
     //   [4] [5]
     // [3] <1> [2]
+    @Test
     public void testLayout5KeyAuto3M0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_M0);
         assertEquals("5 key auto 3 M0 columns", 3, params.mNumColumns);
@@ -787,6 +841,7 @@
 
     // |[4] [5]
     // |<1> [2] [3]
+    @Test
     public void testLayout5KeyAuto3L0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L0);
         assertEquals("5 key auto 3 L0 columns", 3, params.mNumColumns);
@@ -804,6 +859,7 @@
 
     // |___ [4] [5]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout5KeyAuto3L1() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L1);
         assertEquals("5 key auto 3 L1 columns", 3, params.mNumColumns);
@@ -821,6 +877,7 @@
 
     // |___   [4] [5]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout5KeyAuto3L2() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L2);
         assertEquals("5 key auto 3 L2 columns", 3, params.mNumColumns);
@@ -838,6 +895,7 @@
 
     //     [5] [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout5KeyAuto3R0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R0);
         assertEquals("5 key auto 3 R0 columns", 3, params.mNumColumns);
@@ -855,6 +913,7 @@
 
     //     [5] [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout5KeyAuto3R1() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R1);
         assertEquals("5 key auto 3 R1 columns", 3, params.mNumColumns);
@@ -872,6 +931,7 @@
 
     //   [4] [5]   ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout5KeyAuto3R2() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R2);
         assertEquals("5 key auto 3 R2 columns", 3, params.mNumColumns);
@@ -889,6 +949,7 @@
 
     //     [5]
     // [3] <1> [2] [4]
+    @Test
     public void testLayout5KeyAuto4M0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_M0);
         assertEquals("5 key auto 4 M0 columns", 4, params.mNumColumns);
@@ -906,6 +967,7 @@
 
     // |[5]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout5KeyAuto4L0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L0);
         assertEquals("5 key auto 4 L0 columns", 4, params.mNumColumns);
@@ -923,6 +985,7 @@
 
     // |___ [5]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout5KeyAuto4L1() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L1);
         assertEquals("5 key auto 4 L1 columns", 4, params.mNumColumns);
@@ -940,6 +1003,7 @@
 
     // |___     [5]
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout5KeyAuto4L2() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L2);
         assertEquals("5 key auto 4 L2 columns", 4, params.mNumColumns);
@@ -957,6 +1021,7 @@
 
     //             [5]|
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout5KeyAuto4R0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R0);
         assertEquals("5 key auto 4 R0 columns", 4, params.mNumColumns);
@@ -974,6 +1039,7 @@
 
     //             [5] ___|
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout5KeyAuto4R1() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R1);
         assertEquals("5 key auto 4 R1 columns", 4, params.mNumColumns);
@@ -991,6 +1057,7 @@
 
     //         [5]     ___|
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout5KeyAuto4R2() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R2);
         assertEquals("5 key auto 4 R2 columns", 4, params.mNumColumns);
@@ -1007,6 +1074,7 @@
     }
 
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout5KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_M0);
         assertEquals("5 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -1023,6 +1091,7 @@
     }
 
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout5KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L0);
         assertEquals("5 key auto 5 L0 columns", 5, params.mNumColumns);
@@ -1039,6 +1108,7 @@
     }
 
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout5KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L1);
         assertEquals("5 key auto 5 L1 columns", 5, params.mNumColumns);
@@ -1055,6 +1125,7 @@
     }
 
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout5KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L2);
         assertEquals("5 key auto 5 L2 columns", 5, params.mNumColumns);
@@ -1071,6 +1142,7 @@
     }
 
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout5KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R0);
         assertEquals("5 key auto 5 R0 columns", 5, params.mNumColumns);
@@ -1087,6 +1159,7 @@
     }
 
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout5KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R1);
         assertEquals("5 key auto 5 R1 columns", 5, params.mNumColumns);
@@ -1103,6 +1176,7 @@
     }
 
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout5KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R2);
         assertEquals("5 key auto 5 R2 columns", 5, params.mNumColumns);
@@ -1120,6 +1194,7 @@
 
     //     [5] [6]
     // [3] <1> [2] [4]
+    @Test
     public void testLayout6KeyAuto4M0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_M0);
         assertEquals("6 key auto 4 M0 columns", 4, params.mNumColumns);
@@ -1138,6 +1213,7 @@
 
     // |[5] [6]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout6KeyAuto4L0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L0);
         assertEquals("6 key auto 4 L0 columns", 4, params.mNumColumns);
@@ -1156,6 +1232,7 @@
 
     // |___ [5] [6]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout6KeyAuto4L1() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L1);
         assertEquals("6 key auto 4 L1 columns", 4, params.mNumColumns);
@@ -1174,6 +1251,7 @@
 
     // |___     [5] [6]
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout6KeyAuto4L2() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L2);
         assertEquals("6 key auto 4 L2 columns", 4, params.mNumColumns);
@@ -1192,6 +1270,7 @@
 
     //         [6] [5]|
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout6KeyAuto4R0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R0);
         assertEquals("6 key auto 4 R0 columns", 4, params.mNumColumns);
@@ -1210,6 +1289,7 @@
 
     //         [6] [5] ___|
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout6KeyAuto4R1() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R1);
         assertEquals("6 key auto 4 R1 columns", 4, params.mNumColumns);
@@ -1228,6 +1308,7 @@
 
     //         [5] [6] ___|
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout6KeyAuto4R2() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R2);
         assertEquals("6 key auto 4 R2 columns", 4, params.mNumColumns);
@@ -1246,6 +1327,7 @@
 
     //         [6]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout6KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_M0);
         assertEquals("6 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -1264,6 +1346,7 @@
 
     // |[6]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout6KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L0);
         assertEquals("6 key auto 5 L0 columns", 5, params.mNumColumns);
@@ -1282,6 +1365,7 @@
 
     // |___ [6]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout6KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L1);
         assertEquals("6 key auto 5 L1 columns", 5, params.mNumColumns);
@@ -1300,6 +1384,7 @@
 
     // |___     [6]
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout6KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L2);
         assertEquals("6 key auto 5 L2 columns", 5, params.mNumColumns);
@@ -1318,6 +1403,7 @@
 
     //                 [6]|
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout6KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R0);
         assertEquals("6 key auto 5 R0 columns", 5, params.mNumColumns);
@@ -1336,6 +1422,7 @@
 
     //                 [6] ___|
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout6KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R1);
         assertEquals("6 key auto 5 R1 columns", 5, params.mNumColumns);
@@ -1354,6 +1441,7 @@
 
     //             [6]     ___|
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout6KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R2);
         assertEquals("6 key auto 5 R2 columns", 5, params.mNumColumns);
@@ -1371,6 +1459,7 @@
     }
 
     // |<1> [2] [3] [4] [5] [6] [7] ___ ___ ___|
+    @Test
     public void testLayout7KeyAuto7L0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L0);
         assertEquals("7 key auto 7 L0 columns", 7, params.mNumColumns);
@@ -1389,6 +1478,7 @@
     }
 
     // |___ <1> [2] [3] [4] [5] [6] [7] ___ ___|
+    @Test
     public void testLayout7KeyAuto7L1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L1);
         assertEquals("7 key auto 7 L1 columns", 7, params.mNumColumns);
@@ -1407,6 +1497,7 @@
     }
 
     // |___ [3] <1> [2] [4] [5] [6] [7] ___ ___|
+    @Test
     public void testLayout7KeyAuto7L2() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L2);
         assertEquals("7 key auto 7 L2 columns", 7, params.mNumColumns);
@@ -1425,6 +1516,7 @@
     }
 
     // |___ [5] [3] <1> [2] [4] [6] [7] ___ ___|
+    @Test
     public void testLayout7KeyAuto7L3() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L3);
         assertEquals("7 key auto 7 L3 columns", 7, params.mNumColumns);
@@ -1443,6 +1535,7 @@
     }
 
     // |___ [7] [5] [3] <1> [2] [4] [6] ___ ___|
+    @Test
     public void testLayout7KeyAuto7M0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M0);
         assertEquals("7 key auto 7 M0 columns", 7, params.mNumColumns);
@@ -1461,6 +1554,7 @@
     }
 
     // |___ ___ [7] [5] [3] <1> [2] [4] [6] ___|
+    @Test
     public void testLayout7KeyAuto7M1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M1);
         assertEquals("7 key auto 7 M1 columns", 7, params.mNumColumns);
@@ -1479,6 +1573,7 @@
     }
 
     // |___ ___ [7] [6] [5] [3] <1> [2] [4] ___|
+    @Test
     public void testLayout7KeyAuto7R3() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R3);
         assertEquals("7 key auto 7 R3 columns", 7, params.mNumColumns);
@@ -1497,6 +1592,7 @@
     }
 
     // |___ ___ [7] [6] [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout7KeyAuto7R2() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R2);
         assertEquals("7 key auto 7 R2 columns", 7, params.mNumColumns);
@@ -1515,6 +1611,7 @@
     }
 
     // |___ ___ [7] [6] [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout7KeyAuto7R1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R1);
         assertEquals("7 key auto 7 R1 columns", 7, params.mNumColumns);
@@ -1533,6 +1630,7 @@
     }
 
     // |___ ___ [7] [6] [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout7KeyAuto7R0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R0);
         assertEquals("7 key auto 7 R0 columns", 7, params.mNumColumns);
@@ -1552,6 +1650,7 @@
 
     //       [6] [7]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout7KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_M0);
         assertEquals("7 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -1571,6 +1670,7 @@
 
     // |[6] [7]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout7KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L0);
         assertEquals("7 key auto 5 L0 columns", 5, params.mNumColumns);
@@ -1590,6 +1690,7 @@
 
     // |___ [6] [7]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout7KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L1);
         assertEquals("7 key auto 5 L1 columns", 5, params.mNumColumns);
@@ -1609,6 +1710,7 @@
 
     // |___   [6] [7]
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout7KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L2);
         assertEquals("7 key auto 5 L2 columns", 5, params.mNumColumns);
@@ -1628,6 +1730,7 @@
 
     //             [7] [6]|
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout7KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R0);
         assertEquals("7 key auto 5 R0 columns", 5, params.mNumColumns);
@@ -1647,6 +1750,7 @@
 
     //             [7] [6] ___|
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout7KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R1);
         assertEquals("7 key auto 5 R1 columns", 5, params.mNumColumns);
@@ -1666,6 +1770,7 @@
 
     //           [6] [7]   ___|
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout7KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R2);
         assertEquals("7 key auto 5 R2 columns", 5, params.mNumColumns);
@@ -1686,6 +1791,7 @@
     //     [7]
     // [6] [4] [5]
     // [3] <1> [2]
+    @Test
     public void testLayout7KeyAuto3M0() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_M0);
         assertEquals("7 key auto 3 M0 columns", 3, params.mNumColumns);
@@ -1706,6 +1812,7 @@
     // |[7]
     // |[4] [5] [6]
     // |<1> [2] [3]
+    @Test
     public void testLayout7KeyAuto3L0() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L0);
         assertEquals("7 key auto 3 L0 columns", 3, params.mNumColumns);
@@ -1726,6 +1833,7 @@
     // |___ [7]
     // |___ [4] [5] [6]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout7KeyAuto3L1() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L1);
         assertEquals("7 key auto 3 L1 columns", 3, params.mNumColumns);
@@ -1746,6 +1854,7 @@
     // |___     [7]
     // |___ [6] [4] [5]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout7KeyAuto3L2() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L2);
         assertEquals("7 key auto 3 L2 columns", 3, params.mNumColumns);
@@ -1766,6 +1875,7 @@
     //         [7]|
     // [6] [5] [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout7KeyAuto3R0() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R0);
         assertEquals("7 key auto 3 R0 columns", 3, params.mNumColumns);
@@ -1786,6 +1896,7 @@
     //         [7] ___|
     // [6] [5] [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout7KeyAuto3R1() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R1);
         assertEquals("7 key auto 3 R1 columns", 3, params.mNumColumns);
@@ -1806,6 +1917,7 @@
     //     [7]     ___|
     // [6] [4] [5] ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout7KeyAuto3R2() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R2);
         assertEquals("7 key auto 3 R2 columns", 3, params.mNumColumns);
@@ -1825,6 +1937,7 @@
 
     //     [8] [6] [7]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout8KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_M0);
         assertEquals("8 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -1845,6 +1958,7 @@
 
     // |[6] [7] [8]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout8KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L0);
         assertEquals("8 key auto 5 L0 columns", 5, params.mNumColumns);
@@ -1865,6 +1979,7 @@
 
     // |___ [6] [7] [8]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout8KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L1);
         assertEquals("8 key auto 5 L1 columns", 5, params.mNumColumns);
@@ -1885,6 +2000,7 @@
 
     // |___ [8] [6] [7]
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout8KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L2);
         assertEquals("8 key auto 5 L2 columns", 5, params.mNumColumns);
@@ -1905,6 +2021,7 @@
 
     //         [8] [7] [6]|
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout8KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R0);
         assertEquals("8 key auto 5 R0 columns", 5, params.mNumColumns);
@@ -1925,6 +2042,7 @@
 
     //         [8] [7] [6] ___|
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout8KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R1);
         assertEquals("8 key auto 5 R1 columns", 5, params.mNumColumns);
@@ -1945,6 +2063,7 @@
 
     //         [8] [6] [7] ___|
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout8KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R2);
         assertEquals("8 key auto 5 R2 columns", 5, params.mNumColumns);
@@ -1965,6 +2084,7 @@
 
     //   [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout9KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_M0);
         assertEquals("9 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -1986,6 +2106,7 @@
 
     // |[6] [7] [8] [9]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout9KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L0);
         assertEquals("9 key auto 5 L0 columns", 5, params.mNumColumns);
@@ -2007,6 +2128,7 @@
 
     // |___ [6] [7] [8] [9]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout9KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L1);
         assertEquals("9 key auto 5 L1 columns", 5, params.mNumColumns);
@@ -2028,6 +2150,7 @@
 
     // |___   [6] [7] [8] [9]
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout9KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L2);
         assertEquals("9 key auto 5 L2 columns", 5, params.mNumColumns);
@@ -2049,6 +2172,7 @@
 
     //     [9] [8] [7] [6]|
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout9KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R0);
         assertEquals("9 key auto 5 R0 columns", 5, params.mNumColumns);
@@ -2070,6 +2194,7 @@
 
     //     [9] [8] [7] [6] ___|
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout9KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R1);
         assertEquals("9 key auto 5 R1 columns", 5, params.mNumColumns);
@@ -2091,6 +2216,7 @@
 
     //   [9] [8] [6] [7]   ___|
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout9KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R2);
         assertEquals("9 key auto 5 R2 columns", 5, params.mNumColumns);
@@ -2112,6 +2238,7 @@
 
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout10KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_M0);
         assertEquals("10 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -2134,6 +2261,7 @@
 
     // |[6] [7] [8] [9] [A]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout10KeyAuto5L0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L0);
         assertEquals("10 key auto 5 L0 columns", 5, params.mNumColumns);
@@ -2156,6 +2284,7 @@
 
     // |___ [6] [7] [8] [9] [A]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout10KeyAuto5L1() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L1);
         assertEquals("10 key auto 5 L1 columns", 5, params.mNumColumns);
@@ -2178,6 +2307,7 @@
 
     // |___ [8] [6] [7] [9] [A]
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout10KeyAuto5L2() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L2);
         assertEquals("10 key auto 5 L2 columns", 5, params.mNumColumns);
@@ -2200,6 +2330,7 @@
 
     // [A] [9] [8] [7] [6]|
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout10KeyAuto5R0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R0);
         assertEquals("10 key auto 5 R0 columns", 5, params.mNumColumns);
@@ -2222,6 +2353,7 @@
 
     // [A] [9] [8] [7] [6] ___|
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout10KeyAuto5R1() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R1);
         assertEquals("10 key auto 5 R1 columns", 5, params.mNumColumns);
@@ -2244,6 +2376,7 @@
 
     // [A] [9] [8] [6] [7] ___|
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout10KeyAuto5R2() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R2);
         assertEquals("10 key auto 5 R2 columns", 5, params.mNumColumns);
@@ -2267,6 +2400,7 @@
     //         [B]
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout11KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(11, 5, XPOS_M0);
         assertEquals("11 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -2291,6 +2425,7 @@
     //       [B] [C]
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout12KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(12, 5, XPOS_M0);
         assertEquals("12 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -2316,6 +2451,7 @@
     //     [D] [B] [C]
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout13KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(13, 5, XPOS_M0);
         assertEquals("13 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -2342,6 +2478,7 @@
     //   [D] [B] [C] [E]
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout14KeyAuto5M0() {
         MoreKeysKeyboardParams params = createParams(14, 5, XPOS_M0);
         assertEquals("13 key auto 5 M0 columns", 5, params.mNumColumns);
@@ -2369,6 +2506,7 @@
     //                     [J] [I] [H] ___|
     // [G] [F] [E] [D] [C] [B] [A] [9] ___|
     // [8] [7] [6] [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout19KeyAuto8R1() {
         MoreKeysKeyboardParams params = createParams(19, 8, XPOS_R1);
         assertEquals("19 key auto 8 R1 columns", 8, params.mNumColumns);
@@ -2401,6 +2539,7 @@
     //                   [J] [H] [I]   ___|
     // [G] [F] [E] [D] [C] [B] [9] [A] ___|
     // [8] [7] [6] [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout19KeyAuto8R2() {
         MoreKeysKeyboardParams params = createParams(19, 8, XPOS_R2);
         assertEquals("19 key auto 8 R2 columns", 8, params.mNumColumns);
@@ -2433,6 +2572,7 @@
     //               [J] [H] [I]       ___|
     // [G] [F] [E] [D] [B] [9] [A] [C] ___|
     // [8] [7] [6] [5] [3] <1> [2] [4] ___|
+    @Test
     public void testLayout19KeyAuto8R3() {
         MoreKeysKeyboardParams params = createParams(19, 8, XPOS_R3);
         assertEquals("19 key auto 8 R3 columns", 8, params.mNumColumns);
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
index 7e51d95..2a30448 100644
--- a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
@@ -16,13 +16,21 @@
 
 package com.android.inputmethod.keyboard;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.keyboard.MoreKeysKeyboard.MoreKeysKeyboardParams;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @MediumTest
-public class MoreKeysKeyboardBuilderFixedOrderTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class MoreKeysKeyboardBuilderFixedOrderTests {
     private static final int WIDTH = 10;
     private static final int HEIGHT = 10;
 
@@ -38,11 +46,6 @@
     private static final int XPOS_R1 = WIDTH * 8 + WIDTH / 2;
     private static final int XPOS_R0 = WIDTH * 9 + WIDTH / 2;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
     private static MoreKeysKeyboardParams createParams(final int numKeys, final int columnNum,
             final int coordXInParent) {
         final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
@@ -52,6 +55,7 @@
         return params;
     }
 
+    @Test
     public void testLayoutError() {
         MoreKeysKeyboardParams params = null;
         try {
@@ -69,6 +73,7 @@
     // "<m>" is the default key.
 
     // <1>
+    @Test
     public void testLayout1KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_M0);
         assertEquals("1 key fix 5 M0 columns", 1, params.mNumColumns);
@@ -81,6 +86,7 @@
     }
 
     // |<1>
+    @Test
     public void testLayout1KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L0);
         assertEquals("1 key fix 5 L0 columns", 1, params.mNumColumns);
@@ -93,6 +99,7 @@
     }
 
     // |___ <1>
+    @Test
     public void testLayout1KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L1);
         assertEquals("1 key fix 5 L1 columns", 1, params.mNumColumns);
@@ -105,6 +112,7 @@
     }
 
     // |___ ___ <1>
+    @Test
     public void testLayout1KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L2);
         assertEquals("1 key fix 5 L2 columns", 1, params.mNumColumns);
@@ -117,6 +125,7 @@
     }
 
     // <1>|
+    @Test
     public void testLayout1KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R0);
         assertEquals("1 key fix 5 R0 columns", 1, params.mNumColumns);
@@ -129,6 +138,7 @@
     }
 
     // <1> ___|
+    @Test
     public void testLayout1KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R1);
         assertEquals("1 key fix 5 R1 columns", 1, params.mNumColumns);
@@ -141,6 +151,7 @@
     }
 
     // <1> ___ ___|
+    @Test
     public void testLayout1KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R2);
         assertEquals("1 key fix 5 R2 columns", 1, params.mNumColumns);
@@ -153,6 +164,7 @@
     }
 
     // <1> [2]
+    @Test
     public void testLayout2KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_M0);
         assertEquals("2 key fix 5 M0 columns", 2, params.mNumColumns);
@@ -166,6 +178,7 @@
     }
 
     // |<1> [2]
+    @Test
     public void testLayout2KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L0);
         assertEquals("2 key fix 5 L0 columns", 2, params.mNumColumns);
@@ -179,6 +192,7 @@
     }
 
     // |___ <1> [2]
+    @Test
     public void testLayout2KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L1);
         assertEquals("2 key fix 5 L1 columns", 2, params.mNumColumns);
@@ -192,6 +206,7 @@
     }
 
     // |___ ___ <1> [2]
+    @Test
     public void testLayout2KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L2);
         assertEquals("2 key fix 5 L2 columns", 2, params.mNumColumns);
@@ -205,6 +220,7 @@
     }
 
     // [1] <2>|
+    @Test
     public void testLayout2KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R0);
         assertEquals("2 key fix 5 R0 columns", 2, params.mNumColumns);
@@ -218,6 +234,7 @@
     }
 
     // [1] <2> ___|
+    @Test
     public void testLayout2KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R1);
         assertEquals("2 key fix 5 R1 columns", 2, params.mNumColumns);
@@ -231,6 +248,7 @@
     }
 
     // <1> [2] ___|
+    @Test
     public void testLayout2KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R2);
         assertEquals("2 key fix 5 R2 columns", 2, params.mNumColumns);
@@ -245,6 +263,7 @@
 
     // [3]
     // <1> [2]
+    @Test
     public void testLayout3KeyFix2M0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_M0);
         assertEquals("3 key fix 2 M0 columns", 2, params.mNumColumns);
@@ -260,6 +279,7 @@
 
     // |[3]
     // |<1> [2]
+    @Test
     public void testLayout3KeyFix2L0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L0);
         assertEquals("3 key fix 2 L0 columns", 2, params.mNumColumns);
@@ -275,6 +295,7 @@
 
     // |___ [3]
     // |___ <1> [2]
+    @Test
     public void testLayout3KeyFix2L1() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L1);
         assertEquals("3 key fix 2 L1 columns", 2, params.mNumColumns);
@@ -290,6 +311,7 @@
 
     // |        [3]
     // |___ ___ <1> [2]
+    @Test
     public void testLayout3KeyFix2L2() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L2);
         assertEquals("3 key fix 2 L2 columns", 2, params.mNumColumns);
@@ -305,6 +327,7 @@
 
     //     [3]|
     // [1] <2>|
+    @Test
     public void testLayout3KeyFix2R0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R0);
         assertEquals("3 key fix 2 R0 columns", 2, params.mNumColumns);
@@ -320,6 +343,7 @@
 
     //     [3] ___|
     // [1] <2> ___|
+    @Test
     public void testLayout3KeyFix2R1() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R1);
         assertEquals("3 key fix 2 R1 columns", 2, params.mNumColumns);
@@ -335,6 +359,7 @@
 
     // [3]     ___|
     // <1> [2] ___|
+    @Test
     public void testLayout3KeyFix2R2() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R2);
         assertEquals("3 key fix 2 R2 columns", 2, params.mNumColumns);
@@ -350,6 +375,7 @@
 
     // [3] [4]
     // <1> [2]
+    @Test
     public void testLayout4KeyFix2M0() {
         MoreKeysKeyboardParams params = createParams(4, 2, XPOS_M0);
         assertEquals("3 key fix 2 M0 columns", 2, params.mNumColumns);
@@ -366,6 +392,7 @@
 
     // |[3] [4]
     // |<1> [2]
+    @Test
     public void testLayout4KeyFix2L0() {
         MoreKeysKeyboardParams params = createParams(4, 2, XPOS_L0);
         assertEquals("3 key fix 2 L0 columns", 2, params.mNumColumns);
@@ -382,6 +409,7 @@
 
     // |___ [3] [4]
     // |___ <1> [2]
+    @Test
     public void testLayout4KeyFix2L1() {
         MoreKeysKeyboardParams params = createParams(4, 2, XPOS_L1);
         assertEquals("3 key fix 2 L1 columns", 2, params.mNumColumns);
@@ -398,6 +426,7 @@
 
     // |        [3] [4]
     // |___ ___ <1> [2]
+    @Test
     public void testLayout4KeyFix2L2() {
         MoreKeysKeyboardParams params = createParams(4, 2, XPOS_L2);
         assertEquals("3 key fix 2 L2 columns", 2, params.mNumColumns);
@@ -414,6 +443,7 @@
 
     // [3] [4]|
     // [1] <2>|
+    @Test
     public void testLayout4KeyFix2R0() {
         MoreKeysKeyboardParams params = createParams(4, 2, XPOS_R0);
         assertEquals("3 key fix 2 R0 columns", 2, params.mNumColumns);
@@ -430,6 +460,7 @@
 
     // [3] [4] ___|
     // [1] <2> ___|
+    @Test
     public void testLayout4KeyFix2R1() {
         MoreKeysKeyboardParams params = createParams(4, 2, XPOS_R1);
         assertEquals("3 key fix 2 R1 columns", 2, params.mNumColumns);
@@ -446,6 +477,7 @@
 
     // [3] [4] ___|
     // <1> [2] ___|
+    @Test
     public void testLayout4KeyFix2R2() {
         MoreKeysKeyboardParams params = createParams(4, 2, XPOS_R2);
         assertEquals("3 key fix 2 R2 columns", 2, params.mNumColumns);
@@ -461,6 +493,7 @@
     }
 
     // [1] <2> [3]
+    @Test
     public void testLayout3KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_M0);
         assertEquals("3 key fix 5 columns", 3, params.mNumColumns);
@@ -475,6 +508,7 @@
     }
 
     // |<1> [2] [3]
+    @Test
     public void testLayout3KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L0);
         assertEquals("3 key fix 5 L0 columns", 3, params.mNumColumns);
@@ -489,6 +523,7 @@
     }
 
     // |___ <1> [2] [3]
+    @Test
     public void testLayout3KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L1);
         assertEquals("3 key fix 5 L1 columns", 3, params.mNumColumns);
@@ -503,6 +538,7 @@
     }
 
     // |___ [1] <2> [3]
+    @Test
     public void testLayout3KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L2);
         assertEquals("3 key fix 5 L2 columns", 3, params.mNumColumns);
@@ -517,6 +553,7 @@
     }
 
     // [1] [2] <3>|
+    @Test
     public void testLayout3KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R0);
         assertEquals("3 key fix 5 R0 columns", 3, params.mNumColumns);
@@ -531,6 +568,7 @@
     }
 
     // [1] [2] <3> ___|
+    @Test
     public void testLayout3KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R1);
         assertEquals("3 key fix 5 R1 columns", 3, params.mNumColumns);
@@ -545,6 +583,7 @@
     }
 
     // [1] <2> [3] ___|
+    @Test
     public void testLayout3KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R2);
         assertEquals("3 key fix 5 R2 columns", 3, params.mNumColumns);
@@ -560,6 +599,7 @@
 
     //     [4]
     // [1] <2> [3]
+    @Test
     public void testLayout4KeyFix3M0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_M0);
         assertEquals("4 key fix 3 M0 columns", 3, params.mNumColumns);
@@ -576,6 +616,7 @@
 
     // |[4]
     // |<1> [2] [3]
+    @Test
     public void testLayout4KeyFix3L0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L0);
         assertEquals("4 key fix 3 L0 columns", 3, params.mNumColumns);
@@ -592,6 +633,7 @@
 
     // |___ [4]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout4KeyFix3L1() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L1);
         assertEquals("4 key fix 3 L1 columns", 3, params.mNumColumns);
@@ -608,6 +650,7 @@
 
     // |___ ___     [4]
     // |___ ___ [1] <2> [3]
+    @Test
     public void testLayout4KeyFix3L2() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L2);
         assertEquals("4 key fix 3 L2 columns", 3, params.mNumColumns);
@@ -624,6 +667,7 @@
 
     //         [4]|
     // [1] [2] <3>|
+    @Test
     public void testLayout4KeyFix3R0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R0);
         assertEquals("4 key fix 3 R0 columns", 3, params.mNumColumns);
@@ -640,6 +684,7 @@
 
     //         [4] ___|
     // [1] [2] <3> ___|
+    @Test
     public void testLayout4KeyFix3R1() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R1);
         assertEquals("4 key fix 3 R1 columns", 3, params.mNumColumns);
@@ -656,6 +701,7 @@
 
     //     [4]     ___|
     // [1] <2> [3] ___|
+    @Test
     public void testLayout4KeyFix3R2() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R2);
         assertEquals("4 key fix 3 R2 columns", 3, params.mNumColumns);
@@ -672,6 +718,7 @@
 
     //   [4] [5]
     // [1] <2> [3]
+    @Test
     public void testLayout5KeyFix3M0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_M0);
         assertEquals("5 key fix 3 M0 columns", 3, params.mNumColumns);
@@ -689,6 +736,7 @@
 
     // |[4] [5]
     // |<1> [2] [3]
+    @Test
     public void testLayout5KeyFix3L0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L0);
         assertEquals("5 key fix 3 L0 columns", 3, params.mNumColumns);
@@ -706,6 +754,7 @@
 
     // |___ [4] [5]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout5KeyFix3L1() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L1);
         assertEquals("5 key fix 3 L1 columns", 3, params.mNumColumns);
@@ -723,6 +772,7 @@
 
     // |___   [4] [5]
     // |___ [1] <2> [3]
+    @Test
     public void testLayout5KeyFix3L2() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L2);
         assertEquals("5 key fix 3 L2 columns", 3, params.mNumColumns);
@@ -740,6 +790,7 @@
 
     //     [4] [5]|
     // [1] [2] <3>|
+    @Test
     public void testLayout5KeyFix3R0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R0);
         assertEquals("5 key fix 3 R0 columns", 3, params.mNumColumns);
@@ -757,6 +808,7 @@
 
     //     [4] [5] ___|
     // [1] [2] <3> ___|
+    @Test
     public void testLayout5KeyFix3R1() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R1);
         assertEquals("5 key fix 3 R1 columns", 3, params.mNumColumns);
@@ -774,6 +826,7 @@
 
     //   [4] [5]   ___|
     // [1] <2> [3] ___|
+    @Test
     public void testLayout5KeyFix3R2() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R2);
         assertEquals("5 key fix 3 R2 columns", 3, params.mNumColumns);
@@ -791,6 +844,7 @@
 
     // [4] [5] [6]
     // [1] <2> [3]
+    @Test
     public void testLayout6KeyFix3M0() {
         MoreKeysKeyboardParams params = createParams(6, 3, XPOS_M0);
         assertEquals("6 key fix 3 M0 columns", 3, params.mNumColumns);
@@ -809,6 +863,7 @@
 
     // |[4] [5] [6]
     // |<1> [2] [3]
+    @Test
     public void testLayout6KeyFix3L0() {
         MoreKeysKeyboardParams params = createParams(6, 3, XPOS_L0);
         assertEquals("6 key fix 3 L0 columns", 3, params.mNumColumns);
@@ -827,6 +882,7 @@
 
     // |___ [4] [5] [6]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout6KeyFix3L1() {
         MoreKeysKeyboardParams params = createParams(6, 3, XPOS_L1);
         assertEquals("6 key fix 3 L1 columns", 3, params.mNumColumns);
@@ -845,6 +901,7 @@
 
     // |___ [4] [5] [6]
     // |___ [1] <2> [3]
+    @Test
     public void testLayout6KeyFix3L2() {
         MoreKeysKeyboardParams params = createParams(6, 3, XPOS_L2);
         assertEquals("6 key fix 3 L2 columns", 3, params.mNumColumns);
@@ -863,6 +920,7 @@
 
     // [4] [5] [6]|
     // [1] [2] <3>|
+    @Test
     public void testLayout6KeyFix3R0() {
         MoreKeysKeyboardParams params = createParams(6, 3, XPOS_R0);
         assertEquals("6 key fix 3 R0 columns", 3, params.mNumColumns);
@@ -881,6 +939,7 @@
 
     // [4] [5] [6] ___|
     // [1] [2] <3> ___|
+    @Test
     public void testLayout6KeyFix3R1() {
         MoreKeysKeyboardParams params = createParams(6, 3, XPOS_R1);
         assertEquals("6 key fix 3 R1 columns", 3, params.mNumColumns);
@@ -899,6 +958,7 @@
 
     // [4] [5] [6] ___|
     // [1] <2> [3] ___|
+    @Test
     public void testLayout6KeyFix3R2() {
         MoreKeysKeyboardParams params = createParams(6, 3, XPOS_R2);
         assertEquals("6 key fix 3 R2 columns", 3, params.mNumColumns);
@@ -916,6 +976,7 @@
     }
 
     // <1> [2] [3] [4]
+    @Test
     public void testLayout4KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_M0);
         assertEquals("4 key fix 5 columns", 4, params.mNumColumns);
@@ -931,6 +992,7 @@
     }
 
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout4KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L0);
         assertEquals("4 key fix 5 L0 columns", 4, params.mNumColumns);
@@ -946,6 +1008,7 @@
     }
 
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout4KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L1);
         assertEquals("4 key fix 5 L1 columns", 4, params.mNumColumns);
@@ -961,6 +1024,7 @@
     }
 
     // |___ [1] <2> [3] [4]
+    @Test
     public void testLayout4KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L2);
         assertEquals("4 key fix 5 L2 columns", 4, params.mNumColumns);
@@ -976,6 +1040,7 @@
     }
 
     // [1] [2] [3] <4>|
+    @Test
     public void testLayout4KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R0);
         assertEquals("4 key fix 5 R0 columns", 4, params.mNumColumns);
@@ -991,6 +1056,7 @@
     }
 
     // [1] [2] [3] <4> ___|
+    @Test
     public void testLayout4KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R1);
         assertEquals("4 key fix 5 R1 columns", 4, params.mNumColumns);
@@ -1006,6 +1072,7 @@
     }
 
     // [1] [2] <3> [4] ___|
+    @Test
     public void testLayout4KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R2);
         assertEquals("4 key fix 5 R2 columns", 4, params.mNumColumns);
@@ -1022,6 +1089,7 @@
 
     //     [5]
     // [1] <2> [3] [4]
+    @Test
     public void testLayout5KeyFix4M0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_M0);
         assertEquals("5 key fix 4 M0 columns", 4, params.mNumColumns);
@@ -1039,6 +1107,7 @@
 
     // |[5]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout5KeyFix4L0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L0);
         assertEquals("5 key fix 4 L0 columns", 4, params.mNumColumns);
@@ -1056,6 +1125,7 @@
 
     // |___ [5]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout5KeyFix4L1() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L1);
         assertEquals("5 key fix 4 L1 columns", 4, params.mNumColumns);
@@ -1073,6 +1143,7 @@
 
     // |___     [5]
     // |___ [1] <2> [3] [4]
+    @Test
     public void testLayout5KeyFix4L2() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L2);
         assertEquals("5 key fix 4 L2 columns", 4, params.mNumColumns);
@@ -1090,6 +1161,7 @@
 
     //             [5]|
     // [1] [2] [3] <4>|
+    @Test
     public void testLayout5KeyFix4R0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R0);
         assertEquals("5 key fix 4 R0 columns", 4, params.mNumColumns);
@@ -1107,6 +1179,7 @@
 
     //             [5] ___|
     // [1] [2] [3] <4> ___|
+    @Test
     public void testLayout5KeyFix4R1() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R1);
         assertEquals("5 key fix 4 R1 columns", 4, params.mNumColumns);
@@ -1124,6 +1197,7 @@
 
     //         [5]     ___|
     // [1] [2] <3> [4] ___|
+    @Test
     public void testLayout5KeyFix4R2() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R2);
         assertEquals("5 key fix 4 R2 columns", 4, params.mNumColumns);
@@ -1141,6 +1215,7 @@
 
     //   [5] [6]
     // [1] <2> [3] [4]
+    @Test
     public void testLayout6KeyFix4M0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_M0);
         assertEquals("6 key fix 4 M0 columns", 4, params.mNumColumns);
@@ -1159,6 +1234,7 @@
 
     // |[5] [6]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout6KeyFix4L0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L0);
         assertEquals("6 key fix 4 L0 columns", 4, params.mNumColumns);
@@ -1177,6 +1253,7 @@
 
     // |___ [5] [6]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout6KeyFix4L1() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L1);
         assertEquals("6 key fix 4 L1 columns", 4, params.mNumColumns);
@@ -1195,6 +1272,7 @@
 
     // |___   [5] [6]
     // |___ [1] <2> [3] [4]
+    @Test
     public void testLayout6KeyFix4L2() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L2);
         assertEquals("6 key fix 4 L2 columns", 4, params.mNumColumns);
@@ -1213,6 +1291,7 @@
 
     //         [5] [6]|
     // [1] [2] [3] <4>|
+    @Test
     public void testLayout6KeyFix4R0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R0);
         assertEquals("6 key fix 4 R0 columns", 4, params.mNumColumns);
@@ -1231,6 +1310,7 @@
 
     //         [5] [6] ___|
     // [1] [2] [3] <4> ___|
+    @Test
     public void testLayout6KeyFix4R1() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R1);
         assertEquals("6 key fix 4 R1 columns", 4, params.mNumColumns);
@@ -1249,6 +1329,7 @@
 
     //       [5] [6]   ___|
     // [1] [2] <3> [4] ___|
+    @Test
     public void testLayout6KeyFix4R2() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R2);
         assertEquals("6 key fix 4 R2 columns", 4, params.mNumColumns);
@@ -1267,6 +1348,7 @@
 
     // [5] [6] [7]
     // [1] <2> [3] [4]
+    @Test
     public void testLayout7KeyFix4M0() {
         MoreKeysKeyboardParams params = createParams(7, 4, XPOS_M0);
         assertEquals("7 key fix 4 M0 columns", 4, params.mNumColumns);
@@ -1286,6 +1368,7 @@
 
     // |[5] [6] [7]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout7KeyFix4L0() {
         MoreKeysKeyboardParams params = createParams(7, 4, XPOS_L0);
         assertEquals("7 key fix 4 L0 columns", 4, params.mNumColumns);
@@ -1305,6 +1388,7 @@
 
     // |___ [5] [6] [7]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout7KeyFix4L1() {
         MoreKeysKeyboardParams params = createParams(7, 4, XPOS_L1);
         assertEquals("7 key fix 4 L1 columns", 4, params.mNumColumns);
@@ -1324,6 +1408,7 @@
 
     // |___ [5] [6] [7]
     // |___ [1] <2> [3] [4]
+    @Test
     public void testLayout7KeyFix4L2() {
         MoreKeysKeyboardParams params = createParams(7, 4, XPOS_L2);
         assertEquals("7 key fix 4 L2 columns", 4, params.mNumColumns);
@@ -1343,6 +1428,7 @@
 
     //     [5] [6] [7]|
     // [1] [2] [3] <4>|
+    @Test
     public void testLayout7KeyFix4R0() {
         MoreKeysKeyboardParams params = createParams(7, 4, XPOS_R0);
         assertEquals("7 key fix 4 R0 columns", 4, params.mNumColumns);
@@ -1362,6 +1448,7 @@
 
     //     [5] [6] [7] ___|
     // [1] [2] [3] <4> ___|
+    @Test
     public void testLayout7KeyFix4R1() {
         MoreKeysKeyboardParams params = createParams(7, 4, XPOS_R1);
         assertEquals("7 key fix 4 R1 columns", 4, params.mNumColumns);
@@ -1381,6 +1468,7 @@
 
     //     [5] [6] [7] ___|
     // [1] [2] <3> [4] ___|
+    @Test
     public void testLayout7KeyFix4R2() {
         MoreKeysKeyboardParams params = createParams(7, 4, XPOS_R2);
         assertEquals("7 key fix 4 R2 columns", 4, params.mNumColumns);
@@ -1400,6 +1488,7 @@
 
     // [5] [6] [7] [8]
     // [1] <2> [3] [4]
+    @Test
     public void testLayout8KeyFix4M0() {
         MoreKeysKeyboardParams params = createParams(8, 4, XPOS_M0);
         assertEquals("8 key fix 4 M0 columns", 4, params.mNumColumns);
@@ -1420,6 +1509,7 @@
 
     // |[5] [6] [7] [8]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout8KeyFix4L0() {
         MoreKeysKeyboardParams params = createParams(8, 4, XPOS_L0);
         assertEquals("8 key fix 4 L0 columns", 4, params.mNumColumns);
@@ -1440,6 +1530,7 @@
 
     // |___ [5] [6] [7] [8]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout8KeyFix4L1() {
         MoreKeysKeyboardParams params = createParams(8, 4, XPOS_L1);
         assertEquals("8 key fix 4 L1 columns", 4, params.mNumColumns);
@@ -1460,6 +1551,7 @@
 
     // |___ [5] [6] [7] [8]
     // |___ [1] <2> [3] [4]
+    @Test
     public void testLayout8KeyFix4L2() {
         MoreKeysKeyboardParams params = createParams(8, 4, XPOS_L2);
         assertEquals("8 key fix 4 L2 columns", 4, params.mNumColumns);
@@ -1480,6 +1572,7 @@
 
     // [5] [6] [7] [8]|
     // [1] [2] [3] <4>|
+    @Test
     public void testLayout8KeyFix4R0() {
         MoreKeysKeyboardParams params = createParams(8, 4, XPOS_R0);
         assertEquals("8 key fix 4 R0 columns", 4, params.mNumColumns);
@@ -1500,6 +1593,7 @@
 
     // [5] [6] [7] [8] ___|
     // [1] [2] [3] <4> ___|
+    @Test
     public void testLayout8KeyFix4R1() {
         MoreKeysKeyboardParams params = createParams(8, 4, XPOS_R1);
         assertEquals("8 key fix 4 R1 columns", 4, params.mNumColumns);
@@ -1520,6 +1614,7 @@
 
     // [5] [6] [7] [8] ___|
     // [1] [2] <3> [4] ___|
+    @Test
     public void testLayout8KeyFix4R2() {
         MoreKeysKeyboardParams params = createParams(8, 4, XPOS_R2);
         assertEquals("8 key fix 4 R2 columns", 4, params.mNumColumns);
@@ -1539,6 +1634,7 @@
     }
 
      // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout5KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_M0);
         assertEquals("5 key fix 5 columns", 5, params.mNumColumns);
@@ -1555,6 +1651,7 @@
     }
 
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout5KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L0);
         assertEquals("5 key fix 5 L0 columns", 5, params.mNumColumns);
@@ -1571,6 +1668,7 @@
     }
 
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout5KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L1);
         assertEquals("5 key fix 5 L1 columns", 5, params.mNumColumns);
@@ -1587,6 +1685,7 @@
     }
 
     // |___ [1] <2> [3] [4] [5]
+    @Test
     public void testLayout5KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L2);
         assertEquals("5 key fix 5 L2 columns", 5, params.mNumColumns);
@@ -1603,6 +1702,7 @@
     }
 
     // [1] [2] [3] [4] <5>|
+    @Test
     public void testLayout5KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R0);
         assertEquals("5 key fix 5 R0 columns", 5, params.mNumColumns);
@@ -1619,6 +1719,7 @@
     }
 
     // [1] [2] [3] [4] <5> ___|
+    @Test
     public void testLayout5KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R1);
         assertEquals("5 key fix 5 R1 columns", 5, params.mNumColumns);
@@ -1635,6 +1736,7 @@
     }
 
     // [1] [2] [3] <4> [5] ___|
+    @Test
     public void testLayout5KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R2);
         assertEquals("5 key fix 5 R2 columns", 5, params.mNumColumns);
@@ -1652,6 +1754,7 @@
 
     //         [6]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout6KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_M0);
         assertEquals("6 key fix 5 columns", 5, params.mNumColumns);
@@ -1670,6 +1773,7 @@
 
     // |[6]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout6KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L0);
         assertEquals("6 key fix 5 L0 columns", 5, params.mNumColumns);
@@ -1688,6 +1792,7 @@
 
     // |___ [6]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout6KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L1);
         assertEquals("6 key fix 5 L1 columns", 5, params.mNumColumns);
@@ -1706,6 +1811,7 @@
 
     // |___     [6]
     // |___ [1] <2> [3] [4] [5]
+    @Test
     public void testLayout6KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L2);
         assertEquals("6 key fix 5 L2 columns", 5, params.mNumColumns);
@@ -1724,6 +1830,7 @@
 
     //                 [6]|
     // [1] [2] [3] [4] <5>|
+    @Test
     public void testLayout6KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R0);
         assertEquals("6 key fix 5 R0 columns", 5, params.mNumColumns);
@@ -1742,6 +1849,7 @@
 
     //                 [6] ___|
     // [1] [2] [3] [4] <5> ___|
+    @Test
     public void testLayout6KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R1);
         assertEquals("6 key fix 5 R1 columns", 5, params.mNumColumns);
@@ -1760,6 +1868,7 @@
 
     //             [6]     ___|
     // [1] [2] [3] <4> [5] ___|
+    @Test
     public void testLayout6KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R2);
         assertEquals("6 key fix 5 R2 columns", 5, params.mNumColumns);
@@ -1778,6 +1887,7 @@
 
     //       [6] [7]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout7KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_M0);
         assertEquals("7 key fix 5 columns", 5, params.mNumColumns);
@@ -1797,6 +1907,7 @@
 
     // |[6] [7]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout7KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L0);
         assertEquals("7 key fix 5 L0 columns", 5, params.mNumColumns);
@@ -1816,6 +1927,7 @@
 
     // |___ [6] [7]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout7KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L1);
         assertEquals("7 key fix 5 L1 columns", 5, params.mNumColumns);
@@ -1835,6 +1947,7 @@
 
     // |___   [6] [7]
     // |___ [1] <2> [3] [4] [5]
+    @Test
     public void testLayout7KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L2);
         assertEquals("7 key fix 5 L2 columns", 5, params.mNumColumns);
@@ -1854,6 +1967,7 @@
 
     //             [6] [7]|
     // [1] [2] [3] [4] <5>|
+    @Test
     public void testLayout7KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R0);
         assertEquals("7 key fix 5 R0 columns", 5, params.mNumColumns);
@@ -1873,6 +1987,7 @@
 
     //             [6] [7] ___|
     // [1] [2] [3] [4] <5> ___|
+    @Test
     public void testLayout7KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R1);
         assertEquals("7 key fix 5 R1 columns", 5, params.mNumColumns);
@@ -1892,6 +2007,7 @@
 
     //           [6] [7]   ___|
     // [1] [2] [3] <4> [5] ___|
+    @Test
     public void testLayout7KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R2);
         assertEquals("7 key fix 5 R2 columns",5, params.mNumColumns);
@@ -1911,6 +2027,7 @@
 
     //     [6] [7] [8]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout8KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_M0);
         assertEquals("8 key fix 5 M0 columns", 5, params.mNumColumns);
@@ -1931,6 +2048,7 @@
 
     // |[6] [7] [8]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout8KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L0);
         assertEquals("8 key fix 5 L0 columns", 5, params.mNumColumns);
@@ -1951,6 +2069,7 @@
 
     // |___ [6] [7] [8]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout8KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L1);
         assertEquals("8 key fix 5 L1 columns", 5, params.mNumColumns);
@@ -1971,6 +2090,7 @@
 
     // |___ [6] [7] [8]
     // |___ [1] <2> [3] [4] [5]
+    @Test
     public void testLayout8KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L2);
         assertEquals("8 key fix 5 L2 columns", 5, params.mNumColumns);
@@ -1991,6 +2111,7 @@
 
     //         [6] [7] [8]|
     // [1] [2] [3] [4] <5>|
+    @Test
     public void testLayout8KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R0);
         assertEquals("8 key fix 5 R0 columns", 5, params.mNumColumns);
@@ -2011,6 +2132,7 @@
 
     //         [6] [7] [8] ___|
     // [1] [2] [3] [4] <5> ___|
+    @Test
     public void testLayout8KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R1);
         assertEquals("8 key fix 5 R1 columns", 5, params.mNumColumns);
@@ -2031,6 +2153,7 @@
 
     //         [6] [7] [8] ___|
     // [1] [2] [3] <4> [5] ___|
+    @Test
     public void testLayout8KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R2);
         assertEquals("8 key fix 5 R2 columns", 5, params.mNumColumns);
@@ -2051,6 +2174,7 @@
 
     //   [6] [7] [8] [9]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout9KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_M0);
         assertEquals("9 key fix 5 M0 columns", 5, params.mNumColumns);
@@ -2072,6 +2196,7 @@
 
     // |[6] [7] [8] [9]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout9KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L0);
         assertEquals("9 key fix 5 L0 columns", 5, params.mNumColumns);
@@ -2093,6 +2218,7 @@
 
     // |___ [6] [7] [8] [9]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout9KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L1);
         assertEquals("9 key fix 5 L1 columns", 5, params.mNumColumns);
@@ -2114,6 +2240,7 @@
 
     // |___   [6] [7] [8] [9]
     // |___ [1] <2> [3] [4] [5]
+    @Test
     public void testLayout9KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L2);
         assertEquals("9 key fix 5 L2 columns", 5, params.mNumColumns);
@@ -2135,6 +2262,7 @@
 
     //     [6] [7] [8] [9]|
     // [1] [2] [3] [4] <5>|
+    @Test
     public void testLayout9KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R0);
         assertEquals("9 key fix 5 R0 columns", 5, params.mNumColumns);
@@ -2156,6 +2284,7 @@
 
     //     [6] [7] [8] [9] ___|
     // [1] [2] [3] [4] <5> ___|
+    @Test
     public void testLayout9KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R1);
         assertEquals("9 key fix 5 R1 columns", 5, params.mNumColumns);
@@ -2177,6 +2306,7 @@
 
     //   [6] [7] [8] [9]  ___|
     // [1] [2] [3] <4> [5] ___|
+    @Test
     public void testLayout9KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R2);
         assertEquals("9 key fix 5 R2 columns", 5, params.mNumColumns);
@@ -2198,6 +2328,7 @@
 
     // [6] [7] [8] [9] [A]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout10KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_M0);
         assertEquals("10 key fix 5 M0 columns", 5, params.mNumColumns);
@@ -2220,6 +2351,7 @@
 
     // |[6] [7] [8] [9] [A]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout10KeyFix5L0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L0);
         assertEquals("10 key fix 5 L0 columns", 5, params.mNumColumns);
@@ -2242,6 +2374,7 @@
 
     // |___ [6] [7] [8] [9] [A]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout10KeyFix5L1() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L1);
         assertEquals("10 key fix 5 L1 columns", 5, params.mNumColumns);
@@ -2264,6 +2397,7 @@
 
     // |___ [6] [7] [8] [9] [A]
     // |___ [1] <2> [3] [4] [5]
+    @Test
     public void testLayout10KeyFix5L2() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L2);
         assertEquals("10 key fix 5 L2 columns", 5, params.mNumColumns);
@@ -2286,6 +2420,7 @@
 
     // [6] [7] [8] [9] [A]|
     // [1] [2] [3] [4] <5>|
+    @Test
     public void testLayout10KeyFix5R0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R0);
         assertEquals("10 key fix 5 R0 columns", 5, params.mNumColumns);
@@ -2308,6 +2443,7 @@
 
     // [6] [7] [8] [9] [A] ___|
     // [1] [2] [3] [4] <5> ___|
+    @Test
     public void testLayout10KeyFix5R1() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R1);
         assertEquals("10 key fix 5 R1 columns", 5, params.mNumColumns);
@@ -2330,6 +2466,7 @@
 
     // [6] [7] [8] [9] [A] ___|
     // [1] [2] [3] <4> [5] ___|
+    @Test
     public void testLayout10KeyFix5R2() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R2);
         assertEquals("10 key fix 5 R2 columns", 5, params.mNumColumns);
@@ -2353,6 +2490,7 @@
     //         [B]
     // [6] [7] [8] [9] [A]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout11KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(11, 5, XPOS_M0);
         assertEquals("11 key fix 5 M0 columns", 5, params.mNumColumns);
@@ -2377,6 +2515,7 @@
     //       [B] [C]
     // [6] [7] [8] [9] [A]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout12KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(12, 5, XPOS_M0);
         assertEquals("12 key fix 5 M0 columns", 5, params.mNumColumns);
@@ -2402,6 +2541,7 @@
     //     [B] [C] [D]
     // [6] [7] [8] [9] [A]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout13KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(13, 5, XPOS_M0);
         assertEquals("13 key fix 5 M0 columns", 5, params.mNumColumns);
@@ -2428,6 +2568,7 @@
     //   [B] [C] [D] [E]
     // [6] [7] [8] [9] [A]
     // [1] [2] <3> [4] [5]
+    @Test
     public void testLayout14KeyFix5M0() {
         MoreKeysKeyboardParams params = createParams(14, 5, XPOS_M0);
         assertEquals("14 key fix 5 M0 columns", 5, params.mNumColumns);
@@ -2453,6 +2594,7 @@
     }
 
     // |<1> [2] [3] [4] [5] [6] [7]
+    @Test
     public void testLayout7KeyFix7L0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L0);
         assertEquals("7 key fix 7 L0 columns", 7, params.mNumColumns);
@@ -2471,6 +2613,7 @@
     }
 
     // |___ <1> [2] [3] [4] [5] [6] [7]
+    @Test
     public void testLayout7KeyFix7L1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L1);
         assertEquals("7 key fix 7 L1 columns", 7, params.mNumColumns);
@@ -2489,6 +2632,7 @@
     }
 
     // |___ [1] <2> [3] [4] [5] [6] [7]
+    @Test
     public void testLayout7KeyFix7L2() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L2);
         assertEquals("7 key fix 7 L2 columns", 7, params.mNumColumns);
@@ -2507,6 +2651,7 @@
     }
 
     // |___ [1] [2] <3> [4] [5] [6] [7]
+    @Test
     public void testLayout7KeyFix7L3() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L3);
         assertEquals("7 key fix 7 L3 columns", 7, params.mNumColumns);
@@ -2525,6 +2670,7 @@
     }
 
     // |___ [1] [2] [3] <4> [5] [6] [7] ___ ___|
+    @Test
     public void testLayout7KeyFix7M0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M0);
         assertEquals("7 key fix 7 M0 columns", 7, params.mNumColumns);
@@ -2543,6 +2689,7 @@
     }
 
     // |___ ___ [1] [2] [3] <4> [5] [6] [7] ___|
+    @Test
     public void testLayout7KeyFix7M1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M1);
         assertEquals("7 key fix 7 M1 columns", 7, params.mNumColumns);
@@ -2561,6 +2708,7 @@
     }
 
     // [1] [2] [3] [4] <5> [6] [7] ___|
+    @Test
     public void testLayout7KeyFix7R3() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R3);
         assertEquals("7 key fix 7 R3 columns", 7, params.mNumColumns);
@@ -2579,6 +2727,7 @@
     }
 
     // [1] [2] [3] [4] [5] <6> [7] ___|
+    @Test
     public void testLayout7KeyFix7R2() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R2);
         assertEquals("7 key fix 7 R2 columns", 7, params.mNumColumns);
@@ -2597,6 +2746,7 @@
     }
 
     // [1] [2] [3] [4] [5] [6] <7> ___|
+    @Test
     public void testLayout7KeyFix7R1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R1);
         assertEquals("7 key fix 7 R1 columns", 7, params.mNumColumns);
@@ -2615,6 +2765,7 @@
     }
 
     // [1] [2] [3] [4] [5] [6] <7>|
+    @Test
     public void testLayout7KeyFix7R0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R0);
         assertEquals("7 key fix 7 R0 columns", 7, params.mNumColumns);
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderMaxOrderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderMaxOrderTests.java
index 806790e..0a2076d 100644
--- a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderMaxOrderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderMaxOrderTests.java
@@ -16,13 +16,21 @@
 
 package com.android.inputmethod.keyboard;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.keyboard.MoreKeysKeyboard.MoreKeysKeyboardParams;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @MediumTest
-public class MoreKeysKeyboardBuilderMaxOrderTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class MoreKeysKeyboardBuilderMaxOrderTests {
     private static final int WIDTH = 10;
     private static final int HEIGHT = 10;
 
@@ -38,11 +46,6 @@
     private static final int XPOS_R1 = WIDTH * 8 + WIDTH / 2;
     private static final int XPOS_R0 = WIDTH * 9 + WIDTH / 2;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
     private static MoreKeysKeyboardParams createParams(final int numKeys, final int maxColumns,
             final int coordXInParent) {
         final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
@@ -52,6 +55,7 @@
         return params;
     }
 
+    @Test
     public void testLayoutError() {
         MoreKeysKeyboardParams params = null;
         try {
@@ -69,6 +73,7 @@
     // "<1>" is the default key.
 
     // <1>
+    @Test
     public void testLayout1KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_M0);
         assertEquals("1 key max 5 M0 columns", 1, params.mNumColumns);
@@ -81,6 +86,7 @@
     }
 
     // |<1>
+    @Test
     public void testLayout1KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L0);
         assertEquals("1 key max 5 L0 columns", 1, params.mNumColumns);
@@ -93,6 +99,7 @@
     }
 
     // |___ <1>
+    @Test
     public void testLayout1KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L1);
         assertEquals("1 key max 5 L1 columns", 1, params.mNumColumns);
@@ -105,6 +112,7 @@
     }
 
     // |___ ___ <1>
+    @Test
     public void testLayout1KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_L2);
         assertEquals("1 key max 5 L2 columns", 1, params.mNumColumns);
@@ -117,6 +125,7 @@
     }
 
     // <1>|
+    @Test
     public void testLayout1KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R0);
         assertEquals("1 key max 5 R0 columns", 1, params.mNumColumns);
@@ -129,6 +138,7 @@
     }
 
     // <1> ___|
+    @Test
     public void testLayout1KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R1);
         assertEquals("1 key max 5 R1 columns", 1, params.mNumColumns);
@@ -141,6 +151,7 @@
     }
 
     // <1> ___ ___|
+    @Test
     public void testLayout1KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(1, 5, XPOS_R2);
         assertEquals("1 key max 5 R2 columns", 1, params.mNumColumns);
@@ -153,6 +164,7 @@
     }
 
     // <1> [2]
+    @Test
     public void testLayout2KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_M0);
         assertEquals("2 key max 5 M0 columns", 2, params.mNumColumns);
@@ -166,6 +178,7 @@
     }
 
     // |<1> [2]
+    @Test
     public void testLayout2KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L0);
         assertEquals("2 key max 5 L0 columns", 2, params.mNumColumns);
@@ -179,6 +192,7 @@
     }
 
     // |___ <1> [2]
+    @Test
     public void testLayout2KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L1);
         assertEquals("2 key max 5 L1 columns", 2, params.mNumColumns);
@@ -192,6 +206,7 @@
     }
 
     // |___ ___ <1> [2]
+    @Test
     public void testLayout2KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_L2);
         assertEquals("2 key max 5 L2 columns", 2, params.mNumColumns);
@@ -205,6 +220,7 @@
     }
 
     // [2] <1>|
+    @Test
     public void testLayout2KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R0);
         assertEquals("2 key max 5 R0 columns", 2, params.mNumColumns);
@@ -218,6 +234,7 @@
     }
 
     // [2] <1> ___|
+    @Test
     public void testLayout2KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R1);
         assertEquals("2 key max 5 R1 columns", 2, params.mNumColumns);
@@ -231,6 +248,7 @@
     }
 
     // <1> [2] ___|
+    @Test
     public void testLayout2KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(2, 5, XPOS_R2);
         assertEquals("2 key max 5 R2 columns", 2, params.mNumColumns);
@@ -244,6 +262,7 @@
     }
 
     // [3] <1> [2]
+    @Test
     public void testLayout3KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_M0);
         assertEquals("3 key max 5 M0 columns", 3, params.mNumColumns);
@@ -258,6 +277,7 @@
     }
 
     // |<1> [2] [3]
+    @Test
     public void testLayout3KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L0);
         assertEquals("3 key max 5 L0 columns", 3, params.mNumColumns);
@@ -272,6 +292,7 @@
     }
 
     // |___ <1> [2] [3]
+    @Test
     public void testLayout3KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L1);
         assertEquals("3 key max 5 L1 columns", 3, params.mNumColumns);
@@ -286,6 +307,7 @@
     }
 
     // |___ [3] <1> [2]
+    @Test
     public void testLayout3KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_L2);
         assertEquals("3 key max 5 L2 columns", 3, params.mNumColumns);
@@ -300,6 +322,7 @@
     }
 
     // [3] [2] <1>|
+    @Test
     public void testLayout3KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R0);
         assertEquals("3 key max 5 R0 columns", 3, params.mNumColumns);
@@ -314,6 +337,7 @@
     }
 
     // [3] [2] <1> ___|
+    @Test
     public void testLayout3KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R1);
         assertEquals("3 key max 5 R1 columns", 3, params.mNumColumns);
@@ -328,6 +352,7 @@
     }
 
     // [3] <1> [2] ___|
+    @Test
     public void testLayout3KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(3, 5, XPOS_R2);
         assertEquals("3 key max 5 R2 columns", 3, params.mNumColumns);
@@ -343,6 +368,7 @@
 
     // [3]
     // <1> [2]
+    @Test
     public void testLayout3KeyMax2M0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_M0);
         assertEquals("3 key max 2 M0 columns", 2, params.mNumColumns);
@@ -358,6 +384,7 @@
 
     // |[3]
     // |<1> [2]
+    @Test
     public void testLayout3KeyMax2L0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L0);
         assertEquals("3 key max 2 L0 columns", 2, params.mNumColumns);
@@ -373,6 +400,7 @@
 
     // |___ [3]
     // |___ <1> [2]
+    @Test
     public void testLayout3KeyMax2L1() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L1);
         assertEquals("3 key max 2 L1 columns", 2, params.mNumColumns);
@@ -388,6 +416,7 @@
 
     // |        [3]
     // |___ ___ <1> [2]
+    @Test
     public void testLayout3KeyMax2L2() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_L2);
         assertEquals("3 key max 2 L2 columns", 2, params.mNumColumns);
@@ -403,6 +432,7 @@
 
     //     [3]|
     // [2] <1>|
+    @Test
     public void testLayout3KeyMax2R0() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R0);
         assertEquals("3 key max 2 R0 columns", 2, params.mNumColumns);
@@ -418,6 +448,7 @@
 
     //     [3]    |
     // [2] <1> ___|
+    @Test
     public void testLayout3KeyMax2R1() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R1);
         assertEquals("3 key max 2 R1 columns", 2, params.mNumColumns);
@@ -433,6 +464,7 @@
 
     // [3]        |
     // <1> [2] ___|
+    @Test
     public void testLayout3KeyMax2R2() {
         MoreKeysKeyboardParams params = createParams(3, 2, XPOS_R2);
         assertEquals("3 key max 2 R2 columns", 2, params.mNumColumns);
@@ -448,6 +480,7 @@
 
     // [3] [4]
     // <1> [2]
+    @Test
     public void testLayout4KeyMax3M0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_M0);
         assertEquals("4 key max 3 M0 columns", 2, params.mNumColumns);
@@ -464,6 +497,7 @@
 
     // |[3] [4]
     // |<1> [2]
+    @Test
     public void testLayout4KeyMax3L0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L0);
         assertEquals("4 key max 3 L0 columns", 2, params.mNumColumns);
@@ -480,6 +514,7 @@
 
     // |___ [3] [4]
     // |___ <1> [2]
+    @Test
     public void testLayout4KeyMax3L1() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L1);
         assertEquals("4 key max 3 L1 columns", 2, params.mNumColumns);
@@ -496,6 +531,7 @@
 
     // |___ ___ [3] [4]
     // |___ ___ <1> [2]
+    @Test
     public void testLayout4KeyMax3L2() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_L2);
         assertEquals("4 key max 3 L2 columns", 2, params.mNumColumns);
@@ -512,6 +548,7 @@
 
     // [4] [3]|
     // [2] <1>|
+    @Test
     public void testLayout4KeyMax3R0() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R0);
         assertEquals("4 key max 3 R0 columns", 2, params.mNumColumns);
@@ -528,6 +565,7 @@
 
     // [4] [3] ___|
     // [2] <1> ___|
+    @Test
     public void testLayout4KeyMax3R1() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R1);
         assertEquals("4 key max 3 R1 columns", 2, params.mNumColumns);
@@ -544,6 +582,7 @@
 
     // [3] [4] ___|
     // <1> [2] ___|
+    @Test
     public void testLayout4KeyMax3R2() {
         MoreKeysKeyboardParams params = createParams(4, 3, XPOS_R2);
         assertEquals("4 key max 3 R2 columns", 2, params.mNumColumns);
@@ -559,6 +598,7 @@
     }
 
     // [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyMax4M0() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_M0);
         assertEquals("4 key max 4 M0 columns", 4, params.mNumColumns);
@@ -574,6 +614,7 @@
     }
 
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout4KeyMax4L0() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L0);
         assertEquals("4 key max 4 L0 columns", 4, params.mNumColumns);
@@ -589,6 +630,7 @@
     }
 
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout4KeyMax4L1() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L1);
         assertEquals("4 key max 4 L1 columns", 4, params.mNumColumns);
@@ -604,6 +646,7 @@
     }
 
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyMax4L2() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_L2);
         assertEquals("4 key max 4 L2 columns", 4, params.mNumColumns);
@@ -619,6 +662,7 @@
     }
 
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout4KeyMax4R0() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R0);
         assertEquals("4 key max 4 R0 columns", 4, params.mNumColumns);
@@ -634,6 +678,7 @@
     }
 
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout4KeyMax4R1() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R1);
         assertEquals("4 key max 4 R1 columns", 4, params.mNumColumns);
@@ -649,6 +694,7 @@
     }
 
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout4KeyMax4R2() {
         MoreKeysKeyboardParams params = createParams(4, 4, XPOS_R2);
         assertEquals("4 key max 4 R2 columns", 4, params.mNumColumns);
@@ -664,6 +710,7 @@
     }
 
     // [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_M0);
         assertEquals("4 key max 5 M0 columns", 4, params.mNumColumns);
@@ -679,6 +726,7 @@
     }
 
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout4KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L0);
         assertEquals("4 key max 5 L0 columns", 4, params.mNumColumns);
@@ -694,6 +742,7 @@
     }
 
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout4KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L1);
         assertEquals("4 key max 5 L1 columns", 4, params.mNumColumns);
@@ -709,6 +758,7 @@
     }
 
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout4KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_L2);
         assertEquals("4 key max 5 L2 columns", 4, params.mNumColumns);
@@ -724,6 +774,7 @@
     }
 
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout4KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R0);
         assertEquals("4 key max 5 R0 columns", 4, params.mNumColumns);
@@ -739,6 +790,7 @@
     }
 
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout4KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R1);
         assertEquals("4 key max 5 R1 columns", 4, params.mNumColumns);
@@ -754,6 +806,7 @@
     }
 
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout4KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(4, 5, XPOS_R2);
         assertEquals("4 key max 5 R2 columns", 4, params.mNumColumns);
@@ -770,6 +823,7 @@
 
     //   [4] [5]
     // [3] <1> [2]
+    @Test
     public void testLayout5KeyMax3M0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_M0);
         assertEquals("5 key max 3 M0 columns", 3, params.mNumColumns);
@@ -787,6 +841,7 @@
 
     // |[4] [5]
     // |<1> [2] [3]
+    @Test
     public void testLayout5KeyMax3L0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L0);
         assertEquals("5 key max 3 L0 columns", 3, params.mNumColumns);
@@ -804,6 +859,7 @@
 
     // |___ [4] [5]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout5KeyMax3L1() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L1);
         assertEquals("5 key max 3 L1 columns", 3, params.mNumColumns);
@@ -821,6 +877,7 @@
 
     // |___   [4] [5]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout5KeyMax3L2() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_L2);
         assertEquals("5 key max 3 L2 columns", 3, params.mNumColumns);
@@ -838,6 +895,7 @@
 
     //     [5] [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout5KeyMax3R0() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R0);
         assertEquals("5 key max 3 R0 columns", 3, params.mNumColumns);
@@ -855,6 +913,7 @@
 
     //     [5] [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout5KeyMax3R1() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R1);
         assertEquals("5 key max 3 R1 columns", 3, params.mNumColumns);
@@ -872,6 +931,7 @@
 
     //   [4] [5]   ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout5KeyMax3R2() {
         MoreKeysKeyboardParams params = createParams(5, 3, XPOS_R2);
         assertEquals("5 key max 3 R2 columns", 3, params.mNumColumns);
@@ -889,6 +949,7 @@
 
     //   [4] [5]
     // [3] <1> [2]
+    @Test
     public void testLayout5KeyMax4M0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_M0);
         assertEquals("5 key max 4 M0 columns", 3, params.mNumColumns);
@@ -906,6 +967,7 @@
 
     // |[4] [5]
     // |<1> [2] [3]
+    @Test
     public void testLayout5KeyMax4L0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L0);
         assertEquals("5 key max 4 L0 columns", 3, params.mNumColumns);
@@ -923,6 +985,7 @@
 
     // |___ [4] [5]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout5KeyMax4L1() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L1);
         assertEquals("5 key max 4 L1 columns", 3, params.mNumColumns);
@@ -940,6 +1003,7 @@
 
     // |___   [4] [5]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout5KeyMax4L2() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_L2);
         assertEquals("5 key max 4 L2 columns", 3, params.mNumColumns);
@@ -957,6 +1021,7 @@
 
     //     [5] [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout5KeyMax4R0() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R0);
         assertEquals("5 key max 4 R0 columns", 3, params.mNumColumns);
@@ -974,6 +1039,7 @@
 
     //     [5] [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout5KeyMax4R1() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R1);
         assertEquals("5 key max 4 R1 columns", 3, params.mNumColumns);
@@ -991,6 +1057,7 @@
 
     //   [4] [5]   ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout5KeyMax4R2() {
         MoreKeysKeyboardParams params = createParams(5, 4, XPOS_R2);
         assertEquals("5 key max 4 R2 columns", 3, params.mNumColumns);
@@ -1007,6 +1074,7 @@
     }
 
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout5KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_M0);
         assertEquals("5 key max 5 M0 columns", 5, params.mNumColumns);
@@ -1023,6 +1091,7 @@
     }
 
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout5KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L0);
         assertEquals("5 key max 5 L0 columns", 5, params.mNumColumns);
@@ -1039,6 +1108,7 @@
     }
 
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout5KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L1);
         assertEquals("5 key max 5 L1 columns", 5, params.mNumColumns);
@@ -1055,6 +1125,7 @@
     }
 
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout5KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_L2);
         assertEquals("5 key max 5 L2 columns", 5, params.mNumColumns);
@@ -1071,6 +1142,7 @@
     }
 
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout5KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R0);
         assertEquals("5 key max 5 R0 columns", 5, params.mNumColumns);
@@ -1087,6 +1159,7 @@
     }
 
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout5KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R1);
         assertEquals("5 key max 5 R1 columns", 5, params.mNumColumns);
@@ -1103,6 +1176,7 @@
     }
 
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout5KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(5, 5, XPOS_R2);
         assertEquals("5 key max 5 R2 columns", 5, params.mNumColumns);
@@ -1120,6 +1194,7 @@
 
     // [6] [4] [5]
     // [3] <1> [2]
+    @Test
     public void testLayout6KeyMax4M0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_M0);
         assertEquals("6 key max 4 M0 columns", 3, params.mNumColumns);
@@ -1138,6 +1213,7 @@
 
     // |[4] [5] [6]
     // |<1> [2] [3]
+    @Test
     public void testLayout6KeyMax4L0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L0);
         assertEquals("6 key max 4 L0 columns", 3, params.mNumColumns);
@@ -1156,6 +1232,7 @@
 
     // |___ [4] [5] [6]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout6KeyMax4L1() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L1);
         assertEquals("6 key max 4 L1 columns", 3, params.mNumColumns);
@@ -1174,6 +1251,7 @@
 
     // |___ [6] [4] [5]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout6KeyMax4L2() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_L2);
         assertEquals("6 key max 4 L2 columns", 3, params.mNumColumns);
@@ -1192,6 +1270,7 @@
 
     // [6] [5] [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout6KeyMax4R0() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R0);
         assertEquals("6 key max 4 R0 columns", 3, params.mNumColumns);
@@ -1210,6 +1289,7 @@
 
     // [6] [5] [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout6KeyMax4R1() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R1);
         assertEquals("6 key max 4 R1 columns", 3, params.mNumColumns);
@@ -1228,6 +1308,7 @@
 
     // [6] [4] [5] ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout6KeyMax4R2() {
         MoreKeysKeyboardParams params = createParams(6, 4, XPOS_R2);
         assertEquals("6 key max 4 R2 columns", 3, params.mNumColumns);
@@ -1246,6 +1327,7 @@
 
     // [6] [4] [5]
     // [3] <1> [2]
+    @Test
     public void testLayout6KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_M0);
         assertEquals("6 key max 5 M0 columns", 3, params.mNumColumns);
@@ -1264,6 +1346,7 @@
 
     // |[4] [5] [6]
     // |<1> [2] [3]
+    @Test
     public void testLayout6KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L0);
         assertEquals("6 key max 5 L0 columns", 3, params.mNumColumns);
@@ -1282,6 +1365,7 @@
 
     // |___ [4] [5] [6]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout6KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L1);
         assertEquals("6 key max 5 L1 columns", 3, params.mNumColumns);
@@ -1300,6 +1384,7 @@
 
     // |___ [6] [4] [5]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout6KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_L2);
         assertEquals("6 key max 5 L2 columns", 3, params.mNumColumns);
@@ -1318,6 +1403,7 @@
 
     // [6] [5] [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout6KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R0);
         assertEquals("6 key max 5 R0 columns", 3, params.mNumColumns);
@@ -1336,6 +1422,7 @@
 
     // [6] [5] [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout6KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R1);
         assertEquals("6 key max 5 R1 columns", 3, params.mNumColumns);
@@ -1354,6 +1441,7 @@
 
     // [6] [4] [5] ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout6KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(6, 5, XPOS_R2);
         assertEquals("6 key max 5 R2 columns", 3, params.mNumColumns);
@@ -1371,6 +1459,7 @@
     }
 
     // |<1> [2] [3] [4] [5] [6] [7] ___ ___ ___|
+    @Test
     public void testLayout7KeyMax7L0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L0);
         assertEquals("7 key max 7 L0 columns", 7, params.mNumColumns);
@@ -1389,6 +1478,7 @@
     }
 
     // |___ <1> [2] [3] [4] [5] [6] [7] ___ ___|
+    @Test
     public void testLayout7KeyMax7L1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L1);
         assertEquals("7 key max 7 L1 columns", 7, params.mNumColumns);
@@ -1407,6 +1497,7 @@
     }
 
     // |___ [3] <1> [2] [4] [5] [6] [7] ___ ___|
+    @Test
     public void testLayout7KeyMax7L2() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L2);
         assertEquals("7 key max 7 L2 columns", 7, params.mNumColumns);
@@ -1425,6 +1516,7 @@
     }
 
     // |___ [5] [3] <1> [2] [4] [6] [7] ___ ___|
+    @Test
     public void testLayout7KeyMax7L3() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_L3);
         assertEquals("7 key max 7 L3 columns", 7, params.mNumColumns);
@@ -1443,6 +1535,7 @@
     }
 
     // |___ [7] [5] [3] <1> [2] [4] [6] ___ ___|
+    @Test
     public void testLayout7KeyMax7M0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M0);
         assertEquals("7 key max 7 M0 columns", 7, params.mNumColumns);
@@ -1461,6 +1554,7 @@
     }
 
     // |___ ___ [7] [5] [3] <1> [2] [4] [6] ___|
+    @Test
     public void testLayout7KeyMax7M1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_M1);
         assertEquals("7 key max 7 M1 columns", 7, params.mNumColumns);
@@ -1479,6 +1573,7 @@
     }
 
     // |___ ___ [7] [6] [5] [3] <1> [2] [4] ___|
+    @Test
     public void testLayout7KeyMax7R3() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R3);
         assertEquals("7 key max 7 R3 columns", 7, params.mNumColumns);
@@ -1497,6 +1592,7 @@
     }
 
     // |___ ___ [7] [6] [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout7KeyMax7R2() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R2);
         assertEquals("7 key max 7 R2 columns", 7, params.mNumColumns);
@@ -1515,6 +1611,7 @@
     }
 
     // |___ ___ [7] [6] [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout7KeyMax7R1() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R1);
         assertEquals("7 key max 7 R1 columns", 7, params.mNumColumns);
@@ -1533,6 +1630,7 @@
     }
 
     // |___ ___ [7] [6] [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout7KeyMax7R0() {
         MoreKeysKeyboardParams params = createParams(7, 7, XPOS_R0);
         assertEquals("7 key max 7 R0 columns", 7, params.mNumColumns);
@@ -1552,6 +1650,7 @@
 
     //   [5] [6] [7]
     // [3] <1> [2] [4]
+    @Test
     public void testLayout7KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_M0);
         assertEquals("7 key max 5 M0 columns", 4, params.mNumColumns);
@@ -1571,6 +1670,7 @@
 
     // |[5] [6] [7]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout7KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L0);
         assertEquals("7 key max 5 L0 columns", 4, params.mNumColumns);
@@ -1590,6 +1690,7 @@
 
     // |___ [5] [6] [7]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout7KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L1);
         assertEquals("7 key max 5 L1 columns", 4, params.mNumColumns);
@@ -1609,6 +1710,7 @@
 
     // |___   [5] [6] [7]
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout7KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_L2);
         assertEquals("7 key max 5 L2 columns", 4, params.mNumColumns);
@@ -1628,6 +1730,7 @@
 
     //     [7] [6] [5]|
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout7KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R0);
         assertEquals("7 key max 5 R0 columns", 4, params.mNumColumns);
@@ -1647,6 +1750,7 @@
 
     //     [7] [6] [5] ___|
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout7KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R1);
         assertEquals("7 key max 5 R1 columns", 4, params.mNumColumns);
@@ -1666,6 +1770,7 @@
 
     //   [7] [5] [6]   ___|
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout7KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(7, 5, XPOS_R2);
         assertEquals("7 key max 5 R2 columns", 4, params.mNumColumns);
@@ -1686,6 +1791,7 @@
     //     [7]
     // [6] [4] [5]
     // [3] <1> [2]
+    @Test
     public void testLayout7KeyMax3M0() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_M0);
         assertEquals("7 key max 3 M0 columns", 3, params.mNumColumns);
@@ -1706,6 +1812,7 @@
     // |[7]
     // |[4] [5] [6]
     // |<1> [2] [3]
+    @Test
     public void testLayout7KeyMax3L0() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L0);
         assertEquals("7 key max 3 L0 columns", 3, params.mNumColumns);
@@ -1726,6 +1833,7 @@
     // |___ [7]
     // |___ [4] [5] [6]
     // |___ <1> [2] [3]
+    @Test
     public void testLayout7KeyMax3L1() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L1);
         assertEquals("7 key max 3 L1 columns", 3, params.mNumColumns);
@@ -1746,6 +1854,7 @@
     // |___     [7]
     // |___ [6] [4] [5]
     // |___ [3] <1> [2]
+    @Test
     public void testLayout7KeyMax3L2() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_L2);
         assertEquals("7 key max 3 L2 columns", 3, params.mNumColumns);
@@ -1766,6 +1875,7 @@
     //         [7]|
     // [6] [5] [4]|
     // [3] [2] <1>|
+    @Test
     public void testLayout7KeyMax3R0() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R0);
         assertEquals("7 key max 3 R0 columns", 3, params.mNumColumns);
@@ -1786,6 +1896,7 @@
     //         [7] ___|
     // [6] [5] [4] ___|
     // [3] [2] <1> ___|
+    @Test
     public void testLayout7KeyMax3R1() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R1);
         assertEquals("7 key max 3 R1 columns", 3, params.mNumColumns);
@@ -1806,6 +1917,7 @@
     //     [7]     ___|
     // [6] [4] [5] ___|
     // [3] <1> [2] ___|
+    @Test
     public void testLayout7KeyMax3R2() {
         MoreKeysKeyboardParams params = createParams(7, 3, XPOS_R2);
         assertEquals("7 key max 3 R2 columns", 3, params.mNumColumns);
@@ -1825,6 +1937,7 @@
 
     // [7] [5] [6] [8]
     // [3] <1> [2] [4]
+    @Test
     public void testLayout8KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_M0);
         assertEquals("8 key max 5 M0 columns", 4, params.mNumColumns);
@@ -1845,6 +1958,7 @@
 
     // |[5] [6] [7] [8]
     // |<1> [2] [3] [4]
+    @Test
     public void testLayout8KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L0);
         assertEquals("8 key max 5 L0 columns", 4, params.mNumColumns);
@@ -1865,6 +1979,7 @@
 
     // |___ [5] [6] [7] [8]
     // |___ <1> [2] [3] [4]
+    @Test
     public void testLayout8KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L1);
         assertEquals("8 key max 5 L1 columns", 4, params.mNumColumns);
@@ -1885,6 +2000,7 @@
 
     // |___ [7] [5] [6] [8]
     // |___ [3] <1> [2] [4]
+    @Test
     public void testLayout8KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_L2);
         assertEquals("8 key max 5 L2 columns", 4, params.mNumColumns);
@@ -1905,6 +2021,7 @@
 
     // [8] [7] [6] [5]|
     // [4] [3] [2] <1>|
+    @Test
     public void testLayout8KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R0);
         assertEquals("8 key max 5 R0 columns", 4, params.mNumColumns);
@@ -1925,6 +2042,7 @@
 
     // [8] [7] [6] [5] ___|
     // [4] [3] [2] <1> ___|
+    @Test
     public void testLayout8KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R1);
         assertEquals("8 key max 5 R1 columns", 4, params.mNumColumns);
@@ -1945,6 +2063,7 @@
 
     // [8] [7] [5] [6] ___|
     // [4] [3] <1> [2] ___|
+    @Test
     public void testLayout8KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(8, 5, XPOS_R2);
         assertEquals("8 key max 5 R2 columns", 4, params.mNumColumns);
@@ -1965,6 +2084,7 @@
 
     //   [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout9KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_M0);
         assertEquals("9 key max 5 M0 columns", 5, params.mNumColumns);
@@ -1986,6 +2106,7 @@
 
     // |[6] [7] [8] [9]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout9KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L0);
         assertEquals("9 key max 5 L0 columns", 5, params.mNumColumns);
@@ -2007,6 +2128,7 @@
 
     // |___ [6] [7] [8] [9]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout9KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L1);
         assertEquals("9 key max 5 L1 columns", 5, params.mNumColumns);
@@ -2028,6 +2150,7 @@
 
     // |___   [6] [7] [8] [9]
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout9KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_L2);
         assertEquals("9 key max 5 L2 columns", 5, params.mNumColumns);
@@ -2049,6 +2172,7 @@
 
     //     [9] [8] [7] [6]|
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout9KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R0);
         assertEquals("9 key max 5 R0 columns", 5, params.mNumColumns);
@@ -2070,6 +2194,7 @@
 
     //     [9] [8] [7] [6] ___|
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout9KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R1);
         assertEquals("9 key max 5 R1 columns", 5, params.mNumColumns);
@@ -2091,6 +2216,7 @@
 
     //   [9] [8] [6] [7]   ___|
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout9KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(9, 5, XPOS_R2);
         assertEquals("9 key max 5 R2 columns", 5, params.mNumColumns);
@@ -2112,6 +2238,7 @@
 
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout10KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_M0);
         assertEquals("10 key max 5 M0 columns", 5, params.mNumColumns);
@@ -2134,6 +2261,7 @@
 
     // |[6] [7] [8] [9] [A]
     // |<1> [2] [3] [4] [5]
+    @Test
     public void testLayout10KeyMax5L0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L0);
         assertEquals("10 key max 5 L0 columns", 5, params.mNumColumns);
@@ -2156,6 +2284,7 @@
 
     // |___ [6] [7] [8] [9] [A]
     // |___ <1> [2] [3] [4] [5]
+    @Test
     public void testLayout10KeyMax5L1() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L1);
         assertEquals("10 key max 5 L1 columns", 5, params.mNumColumns);
@@ -2178,6 +2307,7 @@
 
     // |___ [8] [6] [7] [9] [A]
     // |___ [3] <1> [2] [4] [5]
+    @Test
     public void testLayout10KeyMax5L2() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_L2);
         assertEquals("10 key max 5 L2 columns", 5, params.mNumColumns);
@@ -2200,6 +2330,7 @@
 
     // [A] [9] [8] [7] [6]|
     // [5] [4] [3] [2] <1>|
+    @Test
     public void testLayout10KeyMax5R0() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R0);
         assertEquals("10 key max 5 R0 columns", 5, params.mNumColumns);
@@ -2222,6 +2353,7 @@
 
     // [A] [9] [8] [7] [6] ___|
     // [5] [4] [3] [2] <1> ___|
+    @Test
     public void testLayout10KeyMax5R1() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R1);
         assertEquals("10 key max 5 R1 columns", 5, params.mNumColumns);
@@ -2244,6 +2376,7 @@
 
     // [A] [9] [8] [6] [7] ___|
     // [5] [4] [3] <1> [2] ___|
+    @Test
     public void testLayout10KeyMax5R2() {
         MoreKeysKeyboardParams params = createParams(10, 5, XPOS_R2);
         assertEquals("10 key max 5 R2 columns", 5, params.mNumColumns);
@@ -2267,6 +2400,7 @@
     //   [9] [A] [B]
     // [7] [5] [6] [8]
     // [3] <1> [2] [4]
+    @Test
     public void testLayout11KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(11, 5, XPOS_M0);
         assertEquals("11 key max 5 M0 columns", 4, params.mNumColumns);
@@ -2291,6 +2425,7 @@
     // [B] [9] [A] [C]
     // [7] [5] [6] [8]
     // [3] <1> [2] [4]
+    @Test
     public void testLayout12KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(12, 5, XPOS_M0);
         assertEquals("12 key max 5 M0 columns", 4, params.mNumColumns);
@@ -2316,6 +2451,7 @@
     //     [D] [B] [C]
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout13KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(13, 5, XPOS_M0);
         assertEquals("13 key max 5 M0 columns", 5, params.mNumColumns);
@@ -2342,6 +2478,7 @@
     //   [D] [B] [C] [E]
     // [A] [8] [6] [7] [9]
     // [5] [3] <1> [2] [4]
+    @Test
     public void testLayout14KeyMax5M0() {
         MoreKeysKeyboardParams params = createParams(14, 5, XPOS_M0);
         assertEquals("13 key max 5 M0 columns", 5, params.mNumColumns);
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/HermiteInterpolatorTests.java b/tests/src/com/android/inputmethod/keyboard/internal/HermiteInterpolatorTests.java
index 3ff5aa4..814ecd4 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/HermiteInterpolatorTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/HermiteInterpolatorTests.java
@@ -16,25 +16,20 @@
 
 package com.android.inputmethod.keyboard.internal;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 @SmallTest
-public class HermiteInterpolatorTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class HermiteInterpolatorTests {
     private final HermiteInterpolator mInterpolator = new HermiteInterpolator();
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    private static final float EPSLION = 0.0000005f;
-
-    private static void assertFloatEquals(final String message, float expected, float actual) {
-        if (Math.abs(expected - actual) >= EPSLION) {
-            fail(String.format("%s expected:<%s> but was:<%s>", message, expected, actual));
-        }
-    }
+    private static final float EPSILON = 0.0000005f;
 
     // t=0 p0=(0,1)
     // t=1 p1=(1,0)
@@ -57,6 +52,7 @@
     private static final int p2 = 2;
     private static final int p3 = 3;
 
+    @Test
     public void testP0P1() {
         // [(p0 p1) p2 p3]
         mInterpolator.reset(mXCoords, mYCoords, p0, p3 + 1);
@@ -66,33 +62,34 @@
         assertEquals("p1x", mXCoords[p1], mInterpolator.mP2X);
         assertEquals("p1y", mYCoords[p1], mInterpolator.mP2Y);
         // XY-slope at p0=3.0 (-0.75/-0.25)
-        assertFloatEquals("slope x p0", -0.25f, mInterpolator.mSlope1X);
-        assertFloatEquals("slope y p0", -0.75f, mInterpolator.mSlope1Y);
+        assertEquals("slope x p0", -0.25f, mInterpolator.mSlope1X, EPSILON);
+        assertEquals("slope y p0", -0.75f, mInterpolator.mSlope1Y, EPSILON);
         // XY-slope at p1=1/3.0 (0.50/1.50)
-        assertFloatEquals("slope x p1",  1.50f, mInterpolator.mSlope2X);
-        assertFloatEquals("slope y p1",  0.50f, mInterpolator.mSlope2Y);
+        assertEquals("slope x p1",  1.50f, mInterpolator.mSlope2X, EPSILON);
+        assertEquals("slope y p1",  0.50f, mInterpolator.mSlope2Y, EPSILON);
         // t=0.0 (p0)
         mInterpolator.interpolate(0.0f);
-        assertFloatEquals("t=0.0 x", 0.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.0 y", 1.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.0 x", 0.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.0 y", 1.0f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.2
         mInterpolator.interpolate(0.2f);
-        assertFloatEquals("t=0.2 x", 0.02400f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.2 y", 0.78400f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.2 x", 0.02400f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.2 y", 0.78400f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.5
         mInterpolator.interpolate(0.5f);
-        assertFloatEquals("t=0.5 x", 0.28125f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.5 y", 0.34375f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.5 x", 0.28125f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.5 y", 0.34375f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.8
         mInterpolator.interpolate(0.8f);
-        assertFloatEquals("t=0.8 x", 0.69600f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.8 y", 0.01600f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.8 x", 0.69600f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.8 y", 0.01600f, mInterpolator.mInterpolatedY, EPSILON);
         // t=1.0 (p1)
         mInterpolator.interpolate(1.0f);
-        assertFloatEquals("t=1.0 x", 1.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=1.0 y", 0.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=1.0 x", 1.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=1.0 y", 0.0f, mInterpolator.mInterpolatedY, EPSILON);
     }
 
+    @Test
     public void testP1P2() {
         // [p0 (p1 p2) p3]
         mInterpolator.reset(mXCoords, mYCoords, p0, p3 + 1);
@@ -102,33 +99,34 @@
         assertEquals("p2x", mXCoords[p2], mInterpolator.mP2X);
         assertEquals("p2y", mYCoords[p2], mInterpolator.mP2Y);
         // XY-slope at p1=1/3.0 (0.50/1.50)
-        assertFloatEquals("slope x p1",  1.50f, mInterpolator.mSlope1X);
-        assertFloatEquals("slope y p1",  0.50f, mInterpolator.mSlope1Y);
+        assertEquals("slope x p1",  1.50f, mInterpolator.mSlope1X, EPSILON);
+        assertEquals("slope y p1",  0.50f, mInterpolator.mSlope1Y, EPSILON);
         // XY-slope at p2=3.0 (1.50/0.50)
-        assertFloatEquals("slope x p2",  0.50f, mInterpolator.mSlope2X);
-        assertFloatEquals("slope y p2",  1.50f, mInterpolator.mSlope2Y);
+        assertEquals("slope x p2",  0.50f, mInterpolator.mSlope2X, EPSILON);
+        assertEquals("slope y p2",  1.50f, mInterpolator.mSlope2Y, EPSILON);
         // t=0.0 (p1)
         mInterpolator.interpolate(0.0f);
-        assertFloatEquals("t=0.0 x", 1.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.0 y", 0.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.0 x", 1.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.0 y", 0.0f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.2
         mInterpolator.interpolate(0.2f);
-        assertFloatEquals("t=0.2 x", 1.384f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.2 y", 0.224f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.2 x", 1.384f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.2 y", 0.224f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.5
         mInterpolator.interpolate(0.5f);
-        assertFloatEquals("t=0.5 x", 2.125f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.5 y", 0.875f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.5 x", 2.125f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.5 y", 0.875f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.8
         mInterpolator.interpolate(0.8f);
-        assertFloatEquals("t=0.8 x", 2.776f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.8 y", 1.616f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.8 x", 2.776f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.8 y", 1.616f, mInterpolator.mInterpolatedY, EPSILON);
         // t=1.0 (p2)
         mInterpolator.interpolate(1.0f);
-        assertFloatEquals("t=1.0 x", 3.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=1.0 y", 2.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=1.0 x", 3.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=1.0 y", 2.0f, mInterpolator.mInterpolatedY, EPSILON);
     }
 
+    @Test
     public void testP2P3() {
         // [p0 p1 (p2 p3)]
         mInterpolator.reset(mXCoords, mYCoords, p0, p3 + 1);
@@ -138,33 +136,34 @@
         assertEquals("p3x", mXCoords[p3], mInterpolator.mP2X);
         assertEquals("p3y", mYCoords[p3], mInterpolator.mP2Y);
         // XY-slope at p2=3.0 (1.50/0.50)
-        assertFloatEquals("slope x p2",  0.50f, mInterpolator.mSlope1X);
-        assertFloatEquals("slope y p2",  1.50f, mInterpolator.mSlope1Y);
+        assertEquals("slope x p2",  0.50f, mInterpolator.mSlope1X, EPSILON);
+        assertEquals("slope y p2",  1.50f, mInterpolator.mSlope1Y, EPSILON);
         // XY-slope at p3=1/3.0 (-0.25/-0.75)
-        assertFloatEquals("slope x p3", -0.75f, mInterpolator.mSlope2X);
-        assertFloatEquals("slope y p3", -0.25f, mInterpolator.mSlope2Y);
+        assertEquals("slope x p3", -0.75f, mInterpolator.mSlope2X, EPSILON);
+        assertEquals("slope y p3", -0.25f, mInterpolator.mSlope2Y, EPSILON);
         // t=0.0 (p2)
         mInterpolator.interpolate(0.0f);
-        assertFloatEquals("t=0.0 x", 3.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.0 y", 2.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.0 x", 3.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.0 y", 2.0f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.2
         mInterpolator.interpolate(0.2f);
-        assertFloatEquals("t=0.2 x", 2.98400f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.2 y", 2.30400f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.2 x", 2.98400f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.2 y", 2.30400f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.5
         mInterpolator.interpolate(0.5f);
-        assertFloatEquals("t=0.5 x", 2.65625f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.5 y", 2.71875f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.5 x", 2.65625f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.5 y", 2.71875f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.8
         mInterpolator.interpolate(0.8f);
-        assertFloatEquals("t=0.8 x", 2.21600f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.8 y", 2.97600f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.8 x", 2.21600f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.8 y", 2.97600f, mInterpolator.mInterpolatedY, EPSILON);
         // t=1.0 (p3)
         mInterpolator.interpolate(1.0f);
-        assertFloatEquals("t=1.0 x", 2.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=1.0 y", 3.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=1.0 x", 2.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=1.0 y", 3.0f, mInterpolator.mInterpolatedY, EPSILON);
     }
 
+    @Test
     public void testJustP1P2() {
         // [(p1 p2)]
         mInterpolator.reset(mXCoords, mYCoords, p1, p2 + 1);
@@ -174,30 +173,30 @@
         assertEquals("p2x", mXCoords[p2], mInterpolator.mP2X);
         assertEquals("p2y", mYCoords[p2], mInterpolator.mP2Y);
         // XY-slope at p1=1.0 (2.0/2.0)
-        assertFloatEquals("slope x p1", 2.00f, mInterpolator.mSlope1X);
-        assertFloatEquals("slope y p1", 2.00f, mInterpolator.mSlope1Y);
+        assertEquals("slope x p1", 2.00f, mInterpolator.mSlope1X, EPSILON);
+        assertEquals("slope y p1", 2.00f, mInterpolator.mSlope1Y, EPSILON);
         // XY-slope at p2=1.0 (2.0/2.0)
-        assertFloatEquals("slope x p2", 2.00f, mInterpolator.mSlope2X);
-        assertFloatEquals("slope y p2", 2.00f, mInterpolator.mSlope2Y);
+        assertEquals("slope x p2", 2.00f, mInterpolator.mSlope2X, EPSILON);
+        assertEquals("slope y p2", 2.00f, mInterpolator.mSlope2Y, EPSILON);
         // t=0.0 (p1)
         mInterpolator.interpolate(0.0f);
-        assertFloatEquals("t=0.0 x", 1.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.0 y", 0.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.0 x", 1.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.0 y", 0.0f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.2
         mInterpolator.interpolate(0.2f);
-        assertFloatEquals("t=0.2 x", 1.4f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.2 y", 0.4f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.2 x", 1.4f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.2 y", 0.4f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.5
         mInterpolator.interpolate(0.5f);
-        assertFloatEquals("t=0.5 x", 2.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.5 y", 1.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.5 x", 2.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.5 y", 1.0f, mInterpolator.mInterpolatedY, EPSILON);
         // t=0.8
         mInterpolator.interpolate(0.8f);
-        assertFloatEquals("t=0.8 x", 2.6f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=0.8 y", 1.6f, mInterpolator.mInterpolatedY);
+        assertEquals("t=0.8 x", 2.6f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=0.8 y", 1.6f, mInterpolator.mInterpolatedY, EPSILON);
         // t=1.0 (p2)
         mInterpolator.interpolate(1.0f);
-        assertFloatEquals("t=1.0 x", 3.0f, mInterpolator.mInterpolatedX);
-        assertFloatEquals("t=1.0 y", 2.0f, mInterpolator.mInterpolatedY);
+        assertEquals("t=1.0 x", 3.0f, mInterpolator.mInterpolatedX, EPSILON);
+        assertEquals("t=1.0 y", 2.0f, mInterpolator.mInterpolatedY, EPSILON);
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
index 7221101..9921192 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
@@ -16,9 +16,13 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
 import android.content.Context;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
@@ -30,14 +34,22 @@
 import java.util.List;
 import java.util.Locale;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public final class KeyboardTextsSetTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public final class KeyboardTextsSetTests {
     // All input method subtypes of LatinIME.
     private List<InputMethodSubtype> mAllSubtypesList;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
+
+    @Before
+    public void setUp() throws Exception {
         RichInputMethodManager.init(getContext());
         final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
 
@@ -54,6 +66,7 @@
     // Test that the text {@link KeyboardTextsSet#SWITCH_TO_ALPHA_KEY_LABEL} exists for all
     // subtypes. The text is needed to implement Emoji Keyboard, see
     // {@link KeyboardSwitcher#setEmojiKeyboard()}.
+    @Test
     public void testSwitchToAlphaKeyLabel() {
         final Context context = getContext();
         final KeyboardTextsSet textsSet = new KeyboardTextsSet();
@@ -80,6 +93,7 @@
     };
 
     // Test that the text from resources are correctly loaded for all subtypes.
+    @Test
     public void testTextFromResources() {
         final Context context = getContext();
         final KeyboardTextsSet textsSet = new KeyboardTextsSet();
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MatrixUtilsTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MatrixUtilsTests.java
index e2a11ab..ba45a1b 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MatrixUtilsTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MatrixUtilsTests.java
@@ -16,25 +16,26 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import com.android.inputmethod.keyboard.internal.MatrixUtils.MatrixOperationFailedException;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 
 @SmallTest
-public class MatrixUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class MatrixUtilsTests {
     // "run tests" -c com.android.inputmethod.keyboard.internal.MatrixUtilsTests
     private static final boolean DEBUG = false;
     private static final float EPSILON = 0.00001f;
 
-    private static void assertEqualsFloat(float f0, float f1) {
-        assertEqualsFloat(f0, f1, EPSILON);
-    }
-
-    /* package */ static void assertEqualsFloat(float f0, float f1, float error) {
-        assertTrue(Math.abs(f0 - f1) < error);
-    }
-
+    @Test
     public void testMulti() {
         final float[][] matrixA = {{1, 2}, {3, 4}};
         final float[][] matrixB = {{5, 6}, {7, 8}};
@@ -47,12 +48,13 @@
         if (DEBUG) {
             MatrixUtils.dump("multi", retval);
         }
-        assertEqualsFloat(retval[0][0], 19);
-        assertEqualsFloat(retval[0][1], 22);
-        assertEqualsFloat(retval[1][0], 43);
-        assertEqualsFloat(retval[1][1], 50);
+        assertEquals(retval[0][0], 19, EPSILON);
+        assertEquals(retval[0][1], 22, EPSILON);
+        assertEquals(retval[1][0], 43, EPSILON);
+        assertEquals(retval[1][1], 50, EPSILON);
     }
 
+    @Test
     public void testInverse() {
         final int N = 4;
         final float[][] matrix =
@@ -77,7 +79,7 @@
         }
         for (int i = 0; i < N; ++i) {
             for (int j = 0; j < N; ++j) {
-                assertEqualsFloat(((i == j) ? 1.0f : 0.0f), retval[i][j]);
+                assertEquals(((i == j) ? 1.0f : 0.0f), retval[i][j], EPSILON);
             }
         }
     }
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
index 8f4648c..4cab29a 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
@@ -16,26 +16,33 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
 import android.content.Context;
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.R;
 
 import java.util.Arrays;
 import java.util.Locale;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class MoreKeySpecSplitTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class MoreKeySpecSplitTests {
     private static final Locale TEST_LOCALE = Locale.ENGLISH;
     private final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        final Context targetContext = getContext();
+    @Before
+    public void setUp() throws Exception {
+        final Context targetContext = InstrumentationRegistry.getTargetContext();
         final Resources targetRes = targetContext.getResources();
         final String targetPackageName = targetRes.getResourcePackageName(
                 R.string.english_ime_name);
@@ -90,6 +97,7 @@
     private static final String SURROGATE1 = PAIR1 + PAIR2;
     private static final String SURROGATE2 = PAIR1 + PAIR2 + PAIR3;
 
+    @Test
     public void testSplitZero() {
         assertTextArray("Empty string", "");
         assertTextArray("Empty entry", ",");
@@ -99,6 +107,7 @@
         assertTextArray("Empty entries with escape", ",a,b\\,c,,d,", "a", "b\\,c", "d");
     }
 
+    @Test
     public void testSplitSingle() {
         assertTextArray("Single char", "a", "a");
         assertTextArray("Surrogate pair", PAIR1, PAIR1);
@@ -128,6 +137,7 @@
         assertTextArray("Incomplete resource reference 4", "!" + SURROGATE2, "!" + SURROGATE2);
     }
 
+    @Test
     public void testSplitSingleEscaped() {
         assertTextArray("Escaped char", "\\a", "\\a");
         assertTextArray("Escaped surrogate pair", "\\" + PAIR1, "\\" + PAIR1);
@@ -163,6 +173,7 @@
         assertTextArray("Escaped !TEXT/NAME", "\\!TEXT/EMPTY_STRING", "\\!TEXT/EMPTY_STRING");
     }
 
+    @Test
     public void testSplitMulti() {
         assertTextArray("Multiple chars", "a,b,c", "a", "b", "c");
         assertTextArray("Multiple chars", "a,b,\\c", "a", "b", "\\c");
@@ -178,6 +189,7 @@
                 " abc ", " def ", " ghi ");
     }
 
+    @Test
     public void testSplitMultiEscaped() {
         assertTextArray("Multiple chars with comma", "a,\\,,c", "a", "\\,", "c");
         assertTextArray("Multiple chars with comma surrounded by spaces", " a , \\, , c ",
@@ -197,16 +209,19 @@
                 "\\!", "\\!TEXT/EMPTY_STRING");
     }
 
+    @Test
     public void testSplitTextReferenceError() {
         assertError("Incomplete text name", "!text/", "!text/");
         assertError("Non existing text", "!text/non_existing");
     }
 
+    @Test
     public void testSplitEmptyTextReference() {
         // Note that morekeys_q of English locale is empty.
         assertTextArray("Empty string", "!text/morekeys_q");
     }
 
+    @Test
     public void testLabelReferece() {
         assertTextArray("Label time am", "!text/keylabel_time_am", "AM");
 
@@ -217,6 +232,7 @@
                 "!icon/settings_key|!code/key_settings");
     }
 
+    @Test
     public void testUselessUpperCaseSpecifier() {
         assertTextArray("EMPTY STRING",
                 "!TEXT/EMPTY_STRING", "!TEXT/EMPTY_STRING");
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java
index e06ecae..0ffc96a 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecStringReferenceTests.java
@@ -16,26 +16,33 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
 import android.app.Instrumentation;
 import android.content.Context;
 import android.content.res.Resources;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.tests.R;
 
 import java.util.Locale;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class MoreKeySpecStringReferenceTests extends InstrumentationTestCase {
+@RunWith(AndroidJUnit4.class)
+public class MoreKeySpecStringReferenceTests {
     private static final Locale TEST_LOCALE = Locale.ENGLISH;
     private final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        final Instrumentation instrumentation = getInstrumentation();
+    @Before
+    public void setUp() throws Exception {
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         final Context testContext = instrumentation.getContext();
         final Resources testRes = testContext.getResources();
         final String testPackageName = testRes.getResourcePackageName(R.string.empty_string);
@@ -59,16 +66,19 @@
         }
     }
 
+    @Test
     public void testResolveNullText() {
         assertEquals("resolve null",
                 mTextsSet.resolveTextReference(null), null);
     }
 
+    @Test
     public void testResolveEmptyText() {
         assertEquals("resolve empty text",
                 mTextsSet.resolveTextReference("!string/empty_string"), null);
     }
 
+    @Test
     public void testSplitSingleEscaped() {
         assertTextArray("Escaped !string", "\\!string",
                 "\\!string");
@@ -82,6 +92,7 @@
                 "\\!STRING/EMPTY_STRING");
     }
 
+    @Test
     public void testSplitMultiEscaped() {
         assertTextArray("Multiple escaped !string", "\\!,\\!string/empty_string",
                 "\\!", "\\!string/empty_string");
@@ -89,15 +100,18 @@
                 "\\!", "\\!STRING/EMPTY_STRING");
     }
 
+    @Test
     public void testSplitStringReferenceError() {
         assertError("Incomplete resource name", "!string/", "!string/");
         assertError("Non existing resource", "!string/non_existing");
     }
 
+    @Test
     public void testSplitEmptyStringReference() {
         assertTextArray("Empty string", "!string/empty_string");
     }
 
+    @Test
     public void testSplitResourceSingle() {
         assertTextArray("Single char", "!string/single_char",
                 "a");
@@ -119,6 +133,7 @@
                 "\\\\a");
     }
 
+    @Test
     public void testSplitResourceSingleEscaped() {
         assertTextArray("Escaped char",
                 "!string/escaped_char", "\\a");
@@ -146,6 +161,7 @@
                 "!string/escaped_label_with_escape", "a\\\\c");
     }
 
+    @Test
     public void testSplitResourceMulti() {
         assertTextArray("Multiple chars",
                 "!string/multiple_chars", "a", "b", "c");
@@ -158,6 +174,7 @@
                 "!string/multiple_labels_surrounded_by_spaces", " abc ", " def ", " ghi ");
     }
 
+    @Test
     public void testSplitResourcetMultiEscaped() {
         assertTextArray("Multiple chars with comma",
                 "!string/multiple_chars_with_comma",
@@ -179,6 +196,7 @@
                 " ab\\\\ ", " d\\\\\\, ", " g\\,i ");
     }
 
+    @Test
     public void testSplitMultipleResources() {
         assertTextArray("Literals and resources",
                 "1,!string/multiple_chars,z",
@@ -203,6 +221,7 @@
                 "abcabc", "def", "ghi");
     }
 
+    @Test
     public void testSplitIndirectReference() {
         assertTextArray("Indirect",
                 "!string/indirect_string", "a", "b", "c");
@@ -212,11 +231,13 @@
                 "!string/indirect2_string", "a", "b", "c");
     }
 
+    @Test
     public void testSplitInfiniteIndirectReference() {
         assertError("Infinite indirection",
                 "1,!string/infinite_indirection,2", "1", "infinite", "<infinite>", "loop", "2");
     }
 
+    @Test
     public void testLabelReferece() {
         assertTextArray("Indirect naviagte actions as more key",
                 "!string/keyspec_indirect_navigate_actions",
@@ -225,6 +246,7 @@
                 "!hasLabels!", "ActionNext|!code/key_action_next");
     }
 
+    @Test
     public void testUselessUpperCaseSpecifier() {
         assertTextArray("EMPTY STRING",
                 "!STRING/EMPTY_STRING", "!STRING/EMPTY_STRING");
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueueTests.java b/tests/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueueTests.java
index 7908b26..f4885ff 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueueTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueueTests.java
@@ -16,11 +16,19 @@
 
 package com.android.inputmethod.keyboard.internal;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 @SmallTest
-public class PointerTrackerQueueTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class PointerTrackerQueueTests {
     public static class Element implements PointerTrackerQueue.Element {
         public static int sPhantomUpCount;
         public static final long NOT_HAPPENED = -1;
@@ -65,11 +73,13 @@
     private final Element mElement4 = new Element(4);
     private final PointerTrackerQueue mQueue = new PointerTrackerQueue();
 
+    @Test
     public void testEmpty() {
         assertEquals(0, mQueue.size());
         assertEquals("[]", mQueue.toString());
     }
 
+    @Test
     public void testAdd() {
         mQueue.add(mElement1);
         assertEquals(1, mQueue.size());
@@ -85,6 +95,7 @@
         assertEquals("[1 2 3 4]", mQueue.toString());
     }
 
+    @Test
     public void testRemove() {
         Element.sPhantomUpCount = 0;
 
@@ -119,6 +130,7 @@
         assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testAddAndRemove() {
         Element.sPhantomUpCount = 0;
 
@@ -158,6 +170,7 @@
         assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testReleaseAllPointers() {
         mElement2.mIsModifier = true;
         mQueue.add(mElement1);
@@ -177,6 +190,7 @@
         assertEquals(eventTime + 4, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testReleaseAllPointersOlderThanFirst() {
         mElement2.mIsModifier = true;
         mQueue.add(mElement1);
@@ -194,6 +208,7 @@
         assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
     }
 
+    @Test
     public void testReleaseAllPointersOlderThanLast() {
         mElement2.mIsModifier = true;
         mQueue.add(mElement1);
@@ -213,6 +228,7 @@
         assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testReleaseAllPointersOlderThanWithoutModifierMiddle() {
         mQueue.add(mElement1);
         mQueue.add(mElement2);
@@ -231,6 +247,7 @@
         assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testReleaseAllPointersOlderThanWithoutModifierLast() {
         mQueue.add(mElement1);
         mQueue.add(mElement2);
@@ -249,6 +266,7 @@
         assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testReleaseAllPointersExcept() {
         mElement2.mIsModifier = true;
         mQueue.add(mElement1);
@@ -268,6 +286,7 @@
         assertEquals(eventTime + 3, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testHasModifierKeyOlderThan() {
         Element.sPhantomUpCount = 0;
         assertFalse("hasModifierKeyOlderThan empty", mQueue.hasModifierKeyOlderThan(mElement1));
@@ -297,6 +316,7 @@
         assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
     }
 
+    @Test
     public void testIsAnyInDraggingFinger() {
         Element.sPhantomUpCount = 0;
         assertFalse(mQueue.isAnyInDraggingFinger());
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/SmoothingUtilsTests.java b/tests/src/com/android/inputmethod/keyboard/internal/SmoothingUtilsTests.java
index 293741a..6bf98d4 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/SmoothingUtilsTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/SmoothingUtilsTests.java
@@ -16,16 +16,24 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import com.android.inputmethod.keyboard.internal.MatrixUtils.MatrixOperationFailedException;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 @SmallTest
-public class SmoothingUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SmoothingUtilsTests {
     // "run tests" -c com.android.inputmethod.keyboard.internal.SmoothingUtilsTests
     private static final boolean DEBUG = false;
 
+    @Test
     public void testGet3DParamaters() {
         final float[] xs = new float[] {0, 1, 2, 3, 4};
         final float[] ys = new float[] {1, 4, 15, 40, 85}; // y = x^3 + x^2 + x + 1
@@ -36,7 +44,7 @@
                 MatrixUtils.dump("3d", retval);
             }
             for (int i = 0; i < 4; ++i) {
-                MatrixUtilsTests.assertEqualsFloat(retval[i][0], 1.0f, 0.001f);
+                assertEquals(retval[i][0], 1.0f, 0.001f);
             }
         } catch (MatrixOperationFailedException e) {
             assertTrue(false);
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
index e96c934..2954273 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
@@ -16,8 +16,14 @@
 
 package com.android.inputmethod.latin;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.text.TextUtils;
 import android.util.Pair;
 
@@ -38,27 +44,31 @@
 import java.util.Locale;
 import java.util.Random;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @LargeTest
-public class BinaryDictionaryTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class BinaryDictionaryTests {
     private static final String TEST_DICT_FILE_EXTENSION = ".testDict";
     private static final String TEST_LOCALE = "test";
     private static final String DICTIONARY_ID = "TestBinaryDictionary";
 
     private HashSet<File> mDictFilesToBeDeleted = new HashSet<>();
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
         mDictFilesToBeDeleted.clear();
     }
 
-    @Override
-    protected void tearDown() throws Exception {
+    @After
+    public void tearDown() throws Exception {
         for (final File dictFile : mDictFilesToBeDeleted) {
             dictFile.delete();
         }
         mDictFilesToBeDeleted.clear();
-        super.tearDown();
     }
 
     private File createEmptyDictionaryAndGetFile(final int formatVersion) {
@@ -82,7 +92,7 @@
     private File createEmptyVer4DictionaryAndGetFile(final int formatVersion,
             final HashMap<String, String> attributeMap) throws IOException {
         final File file = File.createTempFile(DICTIONARY_ID, TEST_DICT_FILE_EXTENSION,
-                getContext().getCacheDir());
+                InstrumentationRegistry.getTargetContext().getCacheDir());
         file.delete();
         file.mkdir();
         if (BinaryDictionaryUtils.createEmptyDictFile(file.getAbsolutePath(), formatVersion,
@@ -106,6 +116,7 @@
                 Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
     }
 
+    @Test
     public void testIsValidDictionary() {
         final File dictFile = createEmptyDictionaryAndGetFile(FormatSpec.VERSION403);
         BinaryDictionary binaryDictionary = getBinaryDictionary(dictFile);
@@ -121,6 +132,7 @@
         binaryDictionary.close();
     }
 
+    @Test
     public void testConstructingDictionaryOnMemory() {
         final File dictFile = createEmptyDictionaryAndGetFile(FormatSpec.VERSION403);
         FileUtils.deleteRecursively(dictFile);
@@ -142,6 +154,7 @@
         binaryDictionary.close();
     }
 
+    @Test
     public void testAddTooLongWord() {
         final BinaryDictionary binaryDictionary = getEmptyBinaryDictionary(FormatSpec.VERSION403);
         final StringBuffer stringBuilder = new StringBuffer();
@@ -209,6 +222,7 @@
                 new NgramContext(new WordInfo(word1), new WordInfo(word0)), word2);
     }
 
+    @Test
     public void testAddUnigramWord() {
         final BinaryDictionary binaryDictionary = getEmptyBinaryDictionary(FormatSpec.VERSION403);
         final int probability = 100;
@@ -236,6 +250,7 @@
         assertEquals(updatedProbability, binaryDictionary.getFrequency("aaa"));
     }
 
+    @Test
     public void testRandomlyAddUnigramWord() {
         final int wordCount = 1000;
         final int codePointSetSize = 50;
@@ -258,6 +273,7 @@
         }
     }
 
+    @Test
     public void testAddBigramWords() {
         final BinaryDictionary binaryDictionary = getEmptyBinaryDictionary(FormatSpec.VERSION403);
 
@@ -311,6 +327,7 @@
                 getBigramProbability(binaryDictionary, "abcde", "fghij"));
     }
 
+    @Test
     public void testRandomlyAddBigramWords() {
         final int wordCount = 100;
         final int bigramCount = 1000;
@@ -357,6 +374,7 @@
         }
     }
 
+    @Test
     public void testAddTrigramWords() {
         final BinaryDictionary binaryDictionary = getEmptyBinaryDictionary(FormatSpec.VERSION403);
         final int unigramProbability = 100;
@@ -383,6 +401,7 @@
                 getTrigramProbability(binaryDictionary, "bcc", "abb", "aaa"));
     }
 
+    @Test
     public void testFlushDictionary() {
         final File dictFile = createEmptyDictionaryAndGetFile(FormatSpec.VERSION403);
         BinaryDictionary binaryDictionary = getBinaryDictionary(dictFile);
@@ -417,6 +436,7 @@
         binaryDictionary.close();
     }
 
+    @Test
     public void testFlushWithGCDictionary() {
         final File dictFile = createEmptyDictionaryAndGetFile(FormatSpec.VERSION403);
         BinaryDictionary binaryDictionary = getBinaryDictionary(dictFile);
@@ -447,6 +467,7 @@
         binaryDictionary.close();
     }
 
+    @Test
     public void testAddBigramWordsAndFlashWithGC() {
         final int wordCount = 100;
         final int bigramCount = 1000;
@@ -499,6 +520,7 @@
         }
     }
 
+    @Test
     public void testRandomOperationsAndFlashWithGC() {
         final int maxUnigramCount = 5000;
         final int maxBigramCount = 10000;
@@ -593,6 +615,7 @@
         }
     }
 
+    @Test
     public void testAddManyUnigramsAndFlushWithGC() {
         final int flashWithGCIterationCount = 3;
         final int codePointSetSize = 50;
@@ -628,6 +651,7 @@
         }
     }
 
+    @Test
     public void testUnigramAndBigramCount() {
         final int maxUnigramCount = 5000;
         final int maxBigramCount = 10000;
@@ -684,6 +708,7 @@
         }
     }
 
+    @Test
     public void testGetWordProperties() {
         final long seed = System.currentTimeMillis();
         final Random random = new Random(seed);
@@ -769,6 +794,7 @@
         }
     }
 
+    @Test
     public void testIterateAllWords() {
         final long seed = System.currentTimeMillis();
         final Random random = new Random(seed);
@@ -852,6 +878,7 @@
         assertTrue(bigramSet.isEmpty());
     }
 
+    @Test
     public void testPossiblyOffensiveAttributeMaintained() {
         final BinaryDictionary binaryDictionary =
                 getEmptyBinaryDictionary(FormatSpec.VERSION403);
@@ -860,6 +887,7 @@
         assertEquals(true, wordProperty.mIsPossiblyOffensive);
     }
 
+    @Test
     public void testBeginningOfSentence() {
         final BinaryDictionary binaryDictionary = getEmptyBinaryDictionary(FormatSpec.VERSION403);
         final int dummyProbability = 0;
diff --git a/tests/src/com/android/inputmethod/latin/ContactsContentObserverTest.java b/tests/src/com/android/inputmethod/latin/ContactsContentObserverTest.java
index f90a18b..be039c4 100644
--- a/tests/src/com/android/inputmethod/latin/ContactsContentObserverTest.java
+++ b/tests/src/com/android/inputmethod/latin/ContactsContentObserverTest.java
@@ -24,11 +24,13 @@
 
 import android.content.Context;
 import android.provider.ContactsContract.Contacts;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -38,6 +40,7 @@
  * Tests for {@link ContactsContentObserver}.
  */
 @SmallTest
+@RunWith(AndroidJUnit4.class)
 public class ContactsContentObserverTest {
     private static final int UPDATED_CONTACT_COUNT = 10;
     private static final int STALE_CONTACT_COUNT = 8;
diff --git a/tests/src/com/android/inputmethod/latin/ContactsDictionaryUtilsTest.java b/tests/src/com/android/inputmethod/latin/ContactsDictionaryUtilsTest.java
index 9b49f1a..57d5def 100644
--- a/tests/src/com/android/inputmethod/latin/ContactsDictionaryUtilsTest.java
+++ b/tests/src/com/android/inputmethod/latin/ContactsDictionaryUtilsTest.java
@@ -20,9 +20,11 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import java.util.Locale;
 
@@ -30,6 +32,7 @@
  * Tests for {@link ContactsDictionaryUtils}
  */
 @SmallTest
+@RunWith(AndroidJUnit4.class)
 public class ContactsDictionaryUtilsTest {
 
     @Test
diff --git a/tests/src/com/android/inputmethod/latin/ContactsManagerTest.java b/tests/src/com/android/inputmethod/latin/ContactsManagerTest.java
index f987e0c..1cc289a 100644
--- a/tests/src/com/android/inputmethod/latin/ContactsManagerTest.java
+++ b/tests/src/com/android/inputmethod/latin/ContactsManagerTest.java
@@ -16,6 +16,10 @@
 
 package com.android.inputmethod.latin;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.Cursor;
@@ -23,34 +27,38 @@
 import android.net.Uri;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Contacts;
-import android.test.AndroidTestCase;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.test.RenamingDelegatingContext;
 import android.test.mock.MockContentProvider;
 import android.test.mock.MockContentResolver;
-import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.latin.ContactsDictionaryConstants;
 import com.android.inputmethod.latin.ContactsManager;
 
-import org.junit.Before;
-import org.junit.Test;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.concurrent.TimeUnit;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Tests for {@link ContactsManager}
  */
 @SmallTest
-public class ContactsManagerTest extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class ContactsManagerTest {
 
     private ContactsManager mManager;
     private FakeContactsContentProvider mFakeContactsContentProvider;
     private MatrixCursor mMatrixCursor;
 
+    private final static float EPSILON = 0.00001f;
+
     @Before
-    @Override
     public void setUp() throws Exception {
         // Fake content provider
         mFakeContactsContentProvider = new FakeContactsContentProvider();
@@ -59,7 +67,8 @@
         final MockContentResolver contentResolver = new MockContentResolver();
         contentResolver.addProvider(ContactsContract.AUTHORITY, mFakeContactsContentProvider);
         // Add the fake content resolver to a fake context.
-        final ContextWithMockContentResolver context = new ContextWithMockContentResolver(mContext);
+        final ContextWithMockContentResolver context =
+                new ContextWithMockContentResolver(InstrumentationRegistry.getTargetContext());
         context.setContentResolver(contentResolver);
 
         mManager = new ContactsManager(context);
@@ -113,9 +122,10 @@
         cursor.moveToFirst();
         ContactsManager.RankedContact contact = new ContactsManager.RankedContact(cursor);
         contact.computeAffinity(1, month_ago);
-        assertEquals(contact.getAffinity(), 1.0f);
+        assertEquals(contact.getAffinity(), 1.0f, EPSILON);
         contact.computeAffinity(2, now);
-        assertEquals(contact.getAffinity(), (2.0f/3.0f + (float)Math.pow(0.5, 3) + 1.0f) / 3);
+        assertEquals(contact.getAffinity(), (2.0f/3.0f + (float)Math.pow(0.5, 3) + 1.0f) / 3,
+                EPSILON);
     }
 
     @Test
diff --git a/tests/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCacheTests.java b/tests/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCacheTests.java
index 6b0bbc2..cdb5b8e 100644
--- a/tests/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCacheTests.java
+++ b/tests/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCacheTests.java
@@ -16,16 +16,26 @@
 
 package com.android.inputmethod.latin;
 
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import java.util.Locale;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 @LargeTest
-public class DictionaryFacilitatorLruCacheTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class DictionaryFacilitatorLruCacheTests {
+
+    @Test
     public void testGetFacilitator() {
         final DictionaryFacilitatorLruCache cache =
-                new DictionaryFacilitatorLruCache(getContext(), "");
+                new DictionaryFacilitatorLruCache(InstrumentationRegistry.getTargetContext(), "");
 
         final DictionaryFacilitator dictionaryFacilitatorEnUs = cache.get(Locale.US);
         assertNotNull(dictionaryFacilitatorEnUs);
diff --git a/tests/src/com/android/inputmethod/latin/NgramContextTests.java b/tests/src/com/android/inputmethod/latin/NgramContextTests.java
index 0a662db..6fa8a5a 100644
--- a/tests/src/com/android/inputmethod/latin/NgramContextTests.java
+++ b/tests/src/com/android/inputmethod/latin/NgramContextTests.java
@@ -16,15 +16,26 @@
 
 package com.android.inputmethod.latin;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import com.android.inputmethod.latin.NgramContext.WordInfo;
 import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
 import com.android.inputmethod.latin.utils.NgramContextUtils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 @SmallTest
-public class NgramContextTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class NgramContextTests {
+
+    @Test
     public void testConstruct() {
         assertEquals(new NgramContext(new WordInfo("a")), new NgramContext(new WordInfo("a")));
         assertEquals(new NgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO),
@@ -35,6 +46,7 @@
                 new NgramContext(WordInfo.EMPTY_WORD_INFO));
     }
 
+    @Test
     public void testIsBeginningOfSentenceContext() {
         assertFalse(new NgramContext().isBeginningOfSentenceContext());
         assertTrue(new NgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO)
@@ -52,6 +64,7 @@
                 .isBeginningOfSentenceContext());
     }
 
+    @Test
     public void testGetNextNgramContext() {
         final NgramContext ngramContext_a = new NgramContext(new WordInfo("a"));
         final NgramContext ngramContext_b_a =
@@ -67,6 +80,7 @@
         assertEquals("c", ngramContext_c_bos.getNthPrevWord(1));
     }
 
+    @Test
     public void testExtractPrevWordsContextTest() {
         final NgramContext ngramContext_bos =
                 new NgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO);
@@ -92,6 +106,7 @@
         assertEquals("a", ngramContext_a_empty.extractPrevWordsContext());
     }
 
+    @Test
     public void testExtractPrevWordsContextArray() {
         final NgramContext ngramContext_bos =
                 new NgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO);
@@ -123,9 +138,10 @@
         assertEquals("a", ngramContext_a_empty.extractPrevWordsContextArray()[0]);
     }
 
+    @Test
     public void testGetNgramContextFromNthPreviousWord() {
         SpacingAndPunctuations spacingAndPunctuations = new SpacingAndPunctuations(
-                mContext.getResources());
+                InstrumentationRegistry.getTargetContext().getResources());
         assertEquals("<S>", NgramContextUtils.getNgramContextFromNthPreviousWord("",
                 spacingAndPunctuations, 1).extractPrevWordsContext());
         assertEquals("<S> b", NgramContextUtils.getNgramContextFromNthPreviousWord("a. b ",
diff --git a/tests/src/com/android/inputmethod/latin/PersonalDictionaryLookupTest.java b/tests/src/com/android/inputmethod/latin/PersonalDictionaryLookupTest.java
deleted file mode 100644
index c06aded..0000000
--- a/tests/src/com/android/inputmethod/latin/PersonalDictionaryLookupTest.java
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin;
-
-import static com.android.inputmethod.latin.PersonalDictionaryLookup.ANY_LOCALE;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.annotation.SuppressLint;
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.UserDictionary;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
-
-import com.android.inputmethod.latin.PersonalDictionaryLookup.PersonalDictionaryListener;
-import com.android.inputmethod.latin.utils.ExecutorUtils;
-
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-/**
- * Unit tests for {@link PersonalDictionaryLookup}.
- *
- * Note, this test doesn't mock out the ContentResolver, in order to make sure
- * {@link PersonalDictionaryLookup} works in a real setting.
- */
-@SmallTest
-public class PersonalDictionaryLookupTest extends AndroidTestCase {
-    private static final String TAG = PersonalDictionaryLookupTest.class.getSimpleName();
-
-    private ContentResolver mContentResolver;
-    private HashSet<Uri> mAddedBackup;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mContentResolver = mContext.getContentResolver();
-        mAddedBackup = new HashSet<Uri>();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        // Remove all entries added during this test.
-        for (Uri row : mAddedBackup) {
-            mContentResolver.delete(row, null, null);
-        }
-        mAddedBackup.clear();
-
-        super.tearDown();
-    }
-
-    /**
-     * Adds the given word to the personal dictionary.
-     *
-     * @param word the word to add
-     * @param locale the locale of the word to add
-     * @param frequency the frequency of the word to add
-     * @return the Uri for the given word
-     */
-    @SuppressLint("NewApi")
-    private Uri addWord(final String word, final Locale locale, int frequency, String shortcut) {
-        // Add the given word for the given locale.
-        UserDictionary.Words.addWord(mContext, word, frequency, shortcut, locale);
-        // Obtain an Uri for the given word.
-        Cursor cursor = mContentResolver.query(UserDictionary.Words.CONTENT_URI, null,
-                UserDictionary.Words.WORD + "='" + word + "'", null, null);
-        assertTrue(cursor.moveToFirst());
-        Uri uri = Uri.withAppendedPath(UserDictionary.Words.CONTENT_URI,
-                cursor.getString(cursor.getColumnIndex(UserDictionary.Words._ID)));
-        // Add the row to the backup for later clearing.
-        mAddedBackup.add(uri);
-        return uri;
-    }
-
-    /**
-     * Deletes the entry for the given word from UserDictionary.
-     *
-     * @param uri the Uri for the word as returned by addWord
-     */
-    private void deleteWord(Uri uri) {
-        // Remove the word from the backup so that it's not cleared again later.
-        mAddedBackup.remove(uri);
-        // Remove the word from the personal dictionary.
-        mContentResolver.delete(uri, null, null);
-    }
-
-    private PersonalDictionaryLookup setUpWord(final Locale locale) {
-        // Insert "foo" in the personal dictionary for the given locale.
-        addWord("foo", locale, 17, null);
-
-        // Create the PersonalDictionaryLookup and wait until it's loaded.
-        PersonalDictionaryLookup lookup =
-                new PersonalDictionaryLookup(mContext, ExecutorUtils.SPELLING);
-        lookup.open();
-        return lookup;
-    }
-
-    private PersonalDictionaryLookup setUpShortcut(final Locale locale) {
-        // Insert "shortcut" => "Expansion" in the personal dictionary for the given locale.
-        addWord("Expansion", locale, 17, "shortcut");
-
-        // Create the PersonalDictionaryLookup and wait until it's loaded.
-        PersonalDictionaryLookup lookup =
-                new PersonalDictionaryLookup(mContext, ExecutorUtils.SPELLING);
-        lookup.open();
-        return lookup;
-    }
-
-    private void verifyWordExists(final Set<String> set, final String word) {
-        assertTrue(set.contains(word));
-    }
-
-    private void verifyWordDoesNotExist(final Set<String> set, final String word) {
-        assertFalse(set.contains(word));
-    }
-
-    public void testShortcutKeyMatching() {
-        Log.d(TAG, "testShortcutKeyMatching");
-        PersonalDictionaryLookup lookup = setUpShortcut(Locale.US);
-
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.US));
-        assertNull(lookup.expandShortcut("Shortcut", Locale.US));
-        assertNull(lookup.expandShortcut("SHORTCUT", Locale.US));
-        assertNull(lookup.expandShortcut("shortcu", Locale.US));
-        assertNull(lookup.expandShortcut("shortcutt", Locale.US));
-
-        lookup.close();
-    }
-
-    public void testShortcutMatchesInputCountry() {
-        Log.d(TAG, "testShortcutMatchesInputCountry");
-        PersonalDictionaryLookup lookup = setUpShortcut(Locale.US);
-
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.US), "shortcut");
-        assertTrue(lookup.getShortcutsForLocale(Locale.UK).isEmpty());
-        assertTrue(lookup.getShortcutsForLocale(Locale.ENGLISH).isEmpty());
-        assertTrue(lookup.getShortcutsForLocale(Locale.FRENCH).isEmpty());
-        assertTrue(lookup.getShortcutsForLocale(ANY_LOCALE).isEmpty());
-
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.US));
-        assertNull(lookup.expandShortcut("shortcut", Locale.UK));
-        assertNull(lookup.expandShortcut("shortcut", Locale.ENGLISH));
-        assertNull(lookup.expandShortcut("shortcut", Locale.FRENCH));
-        assertNull(lookup.expandShortcut("shortcut", ANY_LOCALE));
-
-        lookup.close();
-    }
-
-    public void testShortcutMatchesInputLanguage() {
-        Log.d(TAG, "testShortcutMatchesInputLanguage");
-        PersonalDictionaryLookup lookup = setUpShortcut(Locale.ENGLISH);
-
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.US), "shortcut");
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.UK), "shortcut");
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.ENGLISH), "shortcut");
-        assertTrue(lookup.getShortcutsForLocale(Locale.FRENCH).isEmpty());
-        assertTrue(lookup.getShortcutsForLocale(ANY_LOCALE).isEmpty());
-
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.US));
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.UK));
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.ENGLISH));
-        assertNull(lookup.expandShortcut("shortcut", Locale.FRENCH));
-        assertNull(lookup.expandShortcut("shortcut", ANY_LOCALE));
-
-        lookup.close();
-    }
-
-    public void testShortcutMatchesAnyLocale() {
-        PersonalDictionaryLookup lookup = setUpShortcut(PersonalDictionaryLookup.ANY_LOCALE);
-
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.US), "shortcut");
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.UK), "shortcut");
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.ENGLISH), "shortcut");
-        verifyWordExists(lookup.getShortcutsForLocale(Locale.FRENCH), "shortcut");
-        verifyWordExists(lookup.getShortcutsForLocale(ANY_LOCALE), "shortcut");
-
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.US));
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.UK));
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.ENGLISH));
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", Locale.FRENCH));
-        assertEquals("Expansion", lookup.expandShortcut("shortcut", ANY_LOCALE));
-
-        lookup.close();
-    }
-
-    public void testExactLocaleMatch() {
-        Log.d(TAG, "testExactLocaleMatch");
-        PersonalDictionaryLookup lookup = setUpWord(Locale.US);
-
-        verifyWordExists(lookup.getWordsForLocale(Locale.US), "foo");
-        verifyWordDoesNotExist(lookup.getWordsForLocale(Locale.UK), "foo");
-        verifyWordDoesNotExist(lookup.getWordsForLocale(Locale.ENGLISH), "foo");
-        verifyWordDoesNotExist(lookup.getWordsForLocale(Locale.FRENCH), "foo");
-        verifyWordDoesNotExist(lookup.getWordsForLocale(ANY_LOCALE), "foo");
-
-        // Any capitalization variation should match.
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-        assertTrue(lookup.isValidWord("Foo", Locale.US));
-        assertTrue(lookup.isValidWord("FOO", Locale.US));
-        // But similar looking words don't match.
-        assertFalse(lookup.isValidWord("fo", Locale.US));
-        assertFalse(lookup.isValidWord("fop", Locale.US));
-        assertFalse(lookup.isValidWord("fooo", Locale.US));
-        // Other locales, including more general locales won't match.
-        assertFalse(lookup.isValidWord("foo", Locale.ENGLISH));
-        assertFalse(lookup.isValidWord("foo", Locale.UK));
-        assertFalse(lookup.isValidWord("foo", Locale.FRENCH));
-        assertFalse(lookup.isValidWord("foo", ANY_LOCALE));
-
-        lookup.close();
-    }
-
-    public void testSubLocaleMatch() {
-        Log.d(TAG, "testSubLocaleMatch");
-        PersonalDictionaryLookup lookup = setUpWord(Locale.ENGLISH);
-
-        verifyWordExists(lookup.getWordsForLocale(Locale.US), "foo");
-        verifyWordExists(lookup.getWordsForLocale(Locale.UK), "foo");
-        verifyWordExists(lookup.getWordsForLocale(Locale.ENGLISH), "foo");
-        verifyWordDoesNotExist(lookup.getWordsForLocale(Locale.FRENCH), "foo");
-        verifyWordDoesNotExist(lookup.getWordsForLocale(ANY_LOCALE), "foo");
-
-        // Any capitalization variation should match for both en and en_US.
-        assertTrue(lookup.isValidWord("foo", Locale.ENGLISH));
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-        assertTrue(lookup.isValidWord("Foo", Locale.US));
-        assertTrue(lookup.isValidWord("FOO", Locale.US));
-        // But similar looking words don't match.
-        assertFalse(lookup.isValidWord("fo", Locale.US));
-        assertFalse(lookup.isValidWord("fop", Locale.US));
-        assertFalse(lookup.isValidWord("fooo", Locale.US));
-
-        lookup.close();
-    }
-
-    public void testAllLocalesMatch() {
-        Log.d(TAG, "testAllLocalesMatch");
-        PersonalDictionaryLookup lookup = setUpWord(null);
-
-        verifyWordExists(lookup.getWordsForLocale(Locale.US), "foo");
-        verifyWordExists(lookup.getWordsForLocale(Locale.UK), "foo");
-        verifyWordExists(lookup.getWordsForLocale(Locale.ENGLISH), "foo");
-        verifyWordExists(lookup.getWordsForLocale(Locale.FRENCH), "foo");
-        verifyWordExists(lookup.getWordsForLocale(ANY_LOCALE), "foo");
-
-        // Any capitalization variation should match for fr, en and en_US.
-        assertTrue(lookup.isValidWord("foo", ANY_LOCALE));
-        assertTrue(lookup.isValidWord("foo", Locale.FRENCH));
-        assertTrue(lookup.isValidWord("foo", Locale.ENGLISH));
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-        assertTrue(lookup.isValidWord("Foo", Locale.US));
-        assertTrue(lookup.isValidWord("FOO", Locale.US));
-        // But similar looking words don't match.
-        assertFalse(lookup.isValidWord("fo", Locale.US));
-        assertFalse(lookup.isValidWord("fop", Locale.US));
-        assertFalse(lookup.isValidWord("fooo", Locale.US));
-
-        lookup.close();
-    }
-
-    public void testMultipleLocalesMatch() {
-        Log.d(TAG, "testMultipleLocalesMatch");
-
-        // Insert "Foo" as capitalized in the personal dictionary under the en_US and en_CA and fr
-        // locales.
-        addWord("Foo", Locale.US, 17, null);
-        addWord("foO", Locale.CANADA, 17, null);
-        addWord("fOo", Locale.FRENCH, 17, null);
-
-        // Create the PersonalDictionaryLookup and wait until it's loaded.
-        PersonalDictionaryLookup lookup = new PersonalDictionaryLookup(mContext,
-                ExecutorUtils.SPELLING);
-        lookup.open();
-
-        // Both en_CA and en_US match.
-        assertTrue(lookup.isValidWord("foo", Locale.CANADA));
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-        assertTrue(lookup.isValidWord("foo", Locale.FRENCH));
-        // Other locales, including more general locales won't match.
-        assertFalse(lookup.isValidWord("foo", Locale.ENGLISH));
-        assertFalse(lookup.isValidWord("foo", Locale.UK));
-        assertFalse(lookup.isValidWord("foo", ANY_LOCALE));
-
-        lookup.close();
-    }
-
-
-    public void testCaseMatchingForWordsAndShortcuts() {
-        Log.d(TAG, "testCaseMatchingForWordsAndShortcuts");
-        addWord("Foo", Locale.US, 17, "f");
-        addWord("bokabu", Locale.US, 17, "Bu");
-
-        // Create the PersonalDictionaryLookup and wait until it's loaded.
-        PersonalDictionaryLookup lookup = new PersonalDictionaryLookup(mContext,
-                ExecutorUtils.SPELLING);
-        lookup.open();
-
-        // Valid, inspite of capitalization in US but not in other
-        // locales.
-        assertTrue(lookup.isValidWord("Foo", Locale.US));
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-        assertFalse(lookup.isValidWord("Foo", Locale.UK));
-        assertFalse(lookup.isValidWord("foo", Locale.UK));
-
-        // Valid in all forms in US.
-        assertTrue(lookup.isValidWord("bokabu", Locale.US));
-        assertTrue(lookup.isValidWord("BOKABU", Locale.US));
-        assertTrue(lookup.isValidWord("BokaBU", Locale.US));
-
-        // Correct capitalization; sensitive to shortcut casing & locale.
-        assertEquals("Foo", lookup.expandShortcut("f", Locale.US));
-        assertNull(lookup.expandShortcut("f", Locale.UK));
-
-        // Correct capitalization; sensitive to shortcut casing & locale.
-        assertEquals("bokabu", lookup.expandShortcut("Bu", Locale.US));
-        assertNull(lookup.expandShortcut("Bu", Locale.UK));
-        assertNull(lookup.expandShortcut("bu", Locale.US));
-
-        // Verify that raw strings are retained for #getWordsForLocale.
-        verifyWordExists(lookup.getWordsForLocale(Locale.US), "Foo");
-        verifyWordDoesNotExist(lookup.getWordsForLocale(Locale.US), "foo");
-    }
-
-    public void testManageListeners() {
-        Log.d(TAG, "testManageListeners");
-
-        PersonalDictionaryLookup lookup =
-                new PersonalDictionaryLookup(mContext, ExecutorUtils.SPELLING);
-
-        PersonalDictionaryListener listener = mock(PersonalDictionaryListener.class);
-        // Add the same listener a bunch of times. It doesn't make a difference.
-        lookup.addListener(listener);
-        lookup.addListener(listener);
-        lookup.addListener(listener);
-        lookup.notifyListeners();
-
-        verify(listener, times(1)).onUpdate();
-
-        // Remove the same listener a bunch of times. It doesn't make a difference.
-        lookup.removeListener(listener);
-        lookup.removeListener(listener);
-        lookup.removeListener(listener);
-        lookup.notifyListeners();
-
-        verifyNoMoreInteractions(listener);
-    }
-
-    public void testReload() {
-        Log.d(TAG, "testReload");
-
-        // Insert "foo".
-        Uri uri = addWord("foo", Locale.US, 17, null);
-
-        // Create the PersonalDictionaryLookup and wait until it's loaded.
-        PersonalDictionaryLookup lookup =
-                new PersonalDictionaryLookup(mContext, ExecutorUtils.SPELLING);
-        lookup.open();
-
-        // "foo" should match.
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-
-        // "bar" shouldn't match.
-        assertFalse(lookup.isValidWord("bar", Locale.US));
-
-        // Now delete "foo" and add "bar".
-        deleteWord(uri);
-        addWord("bar", Locale.US, 18, null);
-
-        // Wait a little bit before expecting a change. The time we wait should be greater than
-        // PersonalDictionaryLookup.RELOAD_DELAY_MS.
-        try {
-            Thread.sleep(PersonalDictionaryLookup.RELOAD_DELAY_MS + 1000);
-        } catch (InterruptedException e) {
-        }
-
-        // Perform lookups again. Reload should have occured.
-        //
-        // "foo" should not match.
-        assertFalse(lookup.isValidWord("foo", Locale.US));
-
-        // "bar" should match.
-        assertTrue(lookup.isValidWord("bar", Locale.US));
-
-        lookup.close();
-    }
-
-    public void testDictionaryStats() {
-        Log.d(TAG, "testDictionaryStats");
-
-        // Insert "foo" and "bar". Only "foo" has a shortcut.
-        Uri uri = addWord("foo", Locale.GERMANY, 17, "f");
-        addWord("bar", Locale.GERMANY, 17, null);
-
-        // Create the PersonalDictionaryLookup and wait until it's loaded.
-        PersonalDictionaryLookup lookup =
-                new PersonalDictionaryLookup(mContext, ExecutorUtils.SPELLING);
-        lookup.open();
-
-        // "foo" should match.
-        assertTrue(lookup.isValidWord("foo", Locale.GERMANY));
-
-        // "bar" should match.
-        assertTrue(lookup.isValidWord("bar", Locale.GERMANY));
-
-        // "foo" should have a shortcut.
-        assertEquals("foo", lookup.expandShortcut("f", Locale.GERMANY));
-
-        // Now delete "foo".
-        deleteWord(uri);
-
-        // Wait a little bit before expecting a change. The time we wait should be greater than
-        // PersonalDictionaryLookup.RELOAD_DELAY_MS.
-        try {
-            Thread.sleep(PersonalDictionaryLookup.RELOAD_DELAY_MS + 1000);
-        } catch (InterruptedException e) {
-        }
-
-        // Perform lookups again. Reload should have occured.
-        //
-        // "foo" should not match.
-        assertFalse(lookup.isValidWord("foo", Locale.GERMANY));
-
-        // "foo" should not have a shortcut.
-        assertNull(lookup.expandShortcut("f", Locale.GERMANY));
-
-        // "bar" should still match.
-        assertTrue(lookup.isValidWord("bar", Locale.GERMANY));
-
-        lookup.close();
-    }
-
-    public void testClose() {
-        Log.d(TAG, "testClose");
-
-        // Insert "foo".
-        Uri uri = addWord("foo", Locale.US, 17, null);
-
-        // Create the PersonalDictionaryLookup and wait until it's loaded.
-        PersonalDictionaryLookup lookup =
-                new PersonalDictionaryLookup(mContext, ExecutorUtils.SPELLING);
-        lookup.open();
-
-        // "foo" should match.
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-
-        // "bar" shouldn't match.
-        assertFalse(lookup.isValidWord("bar", Locale.US));
-
-        // Now close (prevents further reloads).
-        lookup.close();
-
-        // Now delete "foo" and add "bar".
-        deleteWord(uri);
-        addWord("bar", Locale.US, 18, null);
-
-        // Wait a little bit before expecting a change. The time we wait should be greater than
-        // PersonalDictionaryLookup.RELOAD_DELAY_MS.
-        try {
-            Thread.sleep(PersonalDictionaryLookup.RELOAD_DELAY_MS + 1000);
-        } catch (InterruptedException e) {
-        }
-
-        // Perform lookups again. Reload should not have occurred.
-        //
-        // "foo" should stil match.
-        assertTrue(lookup.isValidWord("foo", Locale.US));
-
-        // "bar" should still not match.
-        assertFalse(lookup.isValidWord("bar", Locale.US));
-    }
-}
diff --git a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
index 128f9f7..51a217b 100644
--- a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
+++ b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
@@ -16,12 +16,16 @@
 
 package com.android.inputmethod.latin;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import android.content.res.Resources;
 import android.inputmethodservice.InputMethodService;
 import android.os.Parcel;
-import android.test.AndroidTestCase;
-import android.test.MoreAsserts;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.text.SpannableString;
 import android.text.TextUtils;
 import android.text.style.SuggestionSpan;
@@ -40,23 +44,27 @@
 
 import java.util.Locale;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class RichInputConnectionAndTextRangeTests {
 
     // The following is meant to be a reasonable default for
     // the "word_separators" resource.
     private SpacingAndPunctuations mSpacingAndPunctuations;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
         final RunInLocale<SpacingAndPunctuations> job = new RunInLocale<SpacingAndPunctuations>() {
             @Override
             protected SpacingAndPunctuations job(final Resources res) {
                 return new SpacingAndPunctuations(res);
             }
         };
-        final Resources res = getContext().getResources();
+        final Resources res = InstrumentationRegistry.getTargetContext().getResources();
         mSpacingAndPunctuations = job.runInLocale(res, Locale.ENGLISH);
     }
 
@@ -156,6 +164,7 @@
     /**
      * Test for getting previous word (for bigram suggestions)
      */
+    @Test
     public void testGetPreviousWord() {
         // If one of the following cases breaks, the bigram suggestions won't work.
         assertEquals(NgramContextUtils.getNgramContextFromNthPreviousWord(
@@ -218,6 +227,7 @@
                 "abc 'def", mSpacingAndPunctuations, 2), NgramContext.EMPTY_PREV_WORDS_INFO);
     }
 
+    @Test
     public void testGetWordRangeAtCursor() {
         /**
          * Test logic in getting the word range at the cursor.
@@ -282,6 +292,7 @@
     /**
      * Test logic in getting the word range at the cursor.
      */
+    @Test
     public void testGetSuggestionSpansAtWord() {
         helpTestGetSuggestionSpansAtWord(10);
         helpTestGetSuggestionSpansAtWord(12);
@@ -309,7 +320,7 @@
         r = ic.getWordRangeAtCursor(SPACE, ScriptUtils.SCRIPT_LATIN);
         suggestions = r.getSuggestionSpansAtWord();
         assertEquals(suggestions.length, 1);
-        MoreAsserts.assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
+        assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
 
         // Test the case with 2 suggestion spans in the same place.
         text = new SpannableString("This is a string for test");
@@ -321,8 +332,8 @@
         r = ic.getWordRangeAtCursor(SPACE, ScriptUtils.SCRIPT_LATIN);
         suggestions = r.getSuggestionSpansAtWord();
         assertEquals(suggestions.length, 2);
-        MoreAsserts.assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
-        MoreAsserts.assertEquals(suggestions[1].getSuggestions(), SUGGESTIONS2);
+        assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
+        assertEquals(suggestions[1].getSuggestions(), SUGGESTIONS2);
 
         // Test a case with overlapping spans, 2nd extending past the start of the word
         text = new SpannableString("This is a string for test");
@@ -334,7 +345,7 @@
         r = ic.getWordRangeAtCursor(SPACE, ScriptUtils.SCRIPT_LATIN);
         suggestions = r.getSuggestionSpansAtWord();
         assertEquals(suggestions.length, 1);
-        MoreAsserts.assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
+        assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
 
         // Test a case with overlapping spans, 2nd extending past the end of the word
         text = new SpannableString("This is a string for test");
@@ -346,7 +357,7 @@
         r = ic.getWordRangeAtCursor(SPACE, ScriptUtils.SCRIPT_LATIN);
         suggestions = r.getSuggestionSpansAtWord();
         assertEquals(suggestions.length, 1);
-        MoreAsserts.assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
+        assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
 
         // Test a case with overlapping spans, 2nd extending past both ends of the word
         text = new SpannableString("This is a string for test");
@@ -358,7 +369,7 @@
         r = ic.getWordRangeAtCursor(SPACE, ScriptUtils.SCRIPT_LATIN);
         suggestions = r.getSuggestionSpansAtWord();
         assertEquals(suggestions.length, 1);
-        MoreAsserts.assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
+        assertEquals(suggestions[0].getSuggestions(), SUGGESTIONS1);
 
         // Test a case with overlapping spans, none right on the word
         text = new SpannableString("This is a string for test");
@@ -372,6 +383,7 @@
         assertEquals(suggestions.length, 0);
     }
 
+    @Test
     public void testCursorTouchingWord() {
         final MockInputMethodService ims = new MockInputMethodService();
         final RichInputConnection ic = new RichInputConnection(ims);
diff --git a/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java b/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java
index af94be6..2b787ea 100644
--- a/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java
+++ b/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java
@@ -16,12 +16,18 @@
 
 package com.android.inputmethod.latin;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import android.content.Context;
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.RichInputMethodManager;
@@ -33,8 +39,14 @@
 import java.util.ArrayList;
 import java.util.Locale;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class RichInputMethodSubtypeTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class RichInputMethodSubtypeTests {
     // All input method subtypes of LatinIME.
     private final ArrayList<RichInputMethodSubtype> mSubtypesList = new ArrayList<>();
 
@@ -67,10 +79,9 @@
     RichInputMethodSubtype HI_LATN_DVORAK;
     RichInputMethodSubtype SR_LATN_QWERTY;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final Context context = getContext();
+    @Before
+    public void setUp() throws Exception {
+        final Context context = InstrumentationRegistry.getTargetContext();
         mRes = context.getResources();
         RichInputMethodManager.init(context);
         mRichImm = RichInputMethodManager.getInstance();
@@ -152,13 +163,13 @@
         }
     }
 
-    @Override
-    protected void tearDown() throws Exception {
+    @After
+    public void tearDown() throws Exception {
         // Restore additional subtypes.
         mRichImm.setAdditionalInputMethodSubtypes(mSavedAddtionalSubtypes);
-        super.tearDown();
     }
 
+    @Test
     public void testAllFullDisplayNameForSpacebar() {
         for (final RichInputMethodSubtype subtype : mSubtypesList) {
             final String subtypeName = SubtypeLocaleUtils
@@ -174,7 +185,8 @@
         }
     }
 
-   public void testAllMiddleDisplayNameForSpacebar() {
+    @Test
+    public void testAllMiddleDisplayNameForSpacebar() {
         for (final RichInputMethodSubtype subtype : mSubtypesList) {
             final String subtypeName = SubtypeLocaleUtils
                     .getSubtypeDisplayNameInSystemLocale(subtype.getRawSubtype());
@@ -293,22 +305,27 @@
         }
     };
 
+    @Test
     public void testPredefinedSubtypesForSpacebarInEnglish() {
         testsPredefinedSubtypesForSpacebar.runInLocale(mRes, Locale.ENGLISH);
     }
 
+    @Test
     public void testAdditionalSubtypeForSpacebarInEnglish() {
         testsAdditionalSubtypesForSpacebar.runInLocale(mRes, Locale.ENGLISH);
     }
 
+    @Test
     public void testPredefinedSubtypesForSpacebarInFrench() {
         testsPredefinedSubtypesForSpacebar.runInLocale(mRes, Locale.FRENCH);
     }
 
+    @Test
     public void testAdditionalSubtypeForSpacebarInFrench() {
         testsAdditionalSubtypesForSpacebar.runInLocale(mRes, Locale.FRENCH);
     }
 
+    @Test
     public void testRichInputMethodSubtypeForNullInputMethodSubtype() {
         RichInputMethodSubtype subtype = RichInputMethodSubtype.getRichInputMethodSubtype(null);
         assertNotNull(subtype);
diff --git a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
index d465ce6..967b17f 100644
--- a/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
+++ b/tests/src/com/android/inputmethod/latin/SuggestedWordsTests.java
@@ -16,16 +16,24 @@
 
 package com.android.inputmethod.latin;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import java.util.ArrayList;
 import java.util.Locale;
 
 @SmallTest
-public class SuggestedWordsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SuggestedWordsTests {
 
     /**
      * Helper method to create a dummy {@link SuggestedWordInfo} with specifying
@@ -80,30 +88,35 @@
         return returnedWordInfo;
     }
 
+    @Test
     public void testRemoveDupesNoDupes() {
         final ArrayList<SuggestedWordInfo> infos = createCorrectionWordInfos("a", "c");
         assertEquals(-1, SuggestedWordInfo.removeDups("b", infos));
         assertEquals(2, infos.size());
     }
 
+    @Test
     public void testRemoveDupesTypedWordNotDupe() {
         final ArrayList<SuggestedWordInfo> infos = createCorrectionWordInfos("a", "a", "c");
         assertEquals(-1, SuggestedWordInfo.removeDups("b", infos));
         assertEquals(2, infos.size());
     }
 
+    @Test
     public void testRemoveDupesTypedWordOnlyDupe() {
         final ArrayList<SuggestedWordInfo> infos = createCorrectionWordInfos("a", "b", "c");
         assertEquals(1, SuggestedWordInfo.removeDups("b", infos));
         assertEquals(2, infos.size());
     }
 
+    @Test
     public void testRemoveDupesTypedWordNotOnlyDupe() {
         final ArrayList<SuggestedWordInfo> infos = createCorrectionWordInfos("a", "b", "b", "c");
         assertEquals(1, SuggestedWordInfo.removeDups("b", infos));
         assertEquals(2, infos.size());
     }
 
+    @Test
     public void testGetTransformedSuggestedWordInfo() {
         SuggestedWordInfo result = transformWordInfo("word", 0);
         assertEquals(result.mWord, "word");
@@ -119,6 +132,7 @@
         assertEquals(result.mWord, "didn't''");
     }
 
+    @Test
     public void testGetTypedWordInfoOrNull() {
         final String TYPED_WORD = "typed";
         final SuggestedWordInfo TYPED_WORD_INFO = createTypedWordInfo(TYPED_WORD);
diff --git a/tests/src/com/android/inputmethod/latin/WordComposerTests.java b/tests/src/com/android/inputmethod/latin/WordComposerTests.java
index 8ae475f..25e57ee 100644
--- a/tests/src/com/android/inputmethod/latin/WordComposerTests.java
+++ b/tests/src/com/android/inputmethod/latin/WordComposerTests.java
@@ -16,18 +16,29 @@
 
 package com.android.inputmethod.latin;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.common.Constants;
 import com.android.inputmethod.latin.common.CoordinateUtils;
 import com.android.inputmethod.latin.common.StringUtils;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Unit tests for WordComposer.
  */
 @SmallTest
-public class WordComposerTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class WordComposerTests {
+
+    @Test
     public void testMoveCursor() {
         final WordComposer wc = new WordComposer();
         // BMP is the Basic Multilingual Plane, as defined by Unicode. This includes
diff --git a/tests/src/com/android/inputmethod/latin/accounts/AccountsChangedReceiverTests.java b/tests/src/com/android/inputmethod/latin/accounts/AccountsChangedReceiverTests.java
index 8328179..aa2a5c2 100644
--- a/tests/src/com/android/inputmethod/latin/accounts/AccountsChangedReceiverTests.java
+++ b/tests/src/com/android/inputmethod/latin/accounts/AccountsChangedReceiverTests.java
@@ -16,40 +16,54 @@
 
 package com.android.inputmethod.latin.accounts;
 
+import static org.junit.Assert.assertEquals;
+
 import android.accounts.AccountManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
-import android.test.AndroidTestCase;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.settings.LocalSettingsConstants;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Tests for {@link AccountsChangedReceiver}.
  */
-public class AccountsChangedReceiverTests extends AndroidTestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AccountsChangedReceiverTests {
     private static final String ACCOUNT_1 = "account1@example.com";
     private static final String ACCOUNT_2 = "account2@example.com";
 
     private SharedPreferences mPrefs;
     private String mLastKnownAccount = null;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
+
+    @Before
+    public void setUp() throws Exception {
         mPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());
         // Keep track of the current account so that we restore it when the test finishes.
         mLastKnownAccount = mPrefs.getString(LocalSettingsConstants.PREF_ACCOUNT_NAME, null);
     }
 
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
+    @After
+    public void tearDown() throws Exception {
         // Restore the account that was present before running the test.
         updateAccountName(mLastKnownAccount);
     }
 
+    @Test
     public void testUnknownIntent() {
         updateAccountName(ACCOUNT_1);
         AccountsChangedReceiver reciever = new AccountsChangedReceiver();
@@ -58,6 +72,7 @@
         assertAccountName(ACCOUNT_1);
     }
 
+    @Test
     public void testAccountRemoved() {
         updateAccountName(ACCOUNT_1);
         AccountsChangedReceiver reciever = new AccountsChangedReceiver() {
@@ -71,6 +86,7 @@
         assertAccountName(null);
     }
 
+    @Test
     public void testAccountRemoved_noAccounts() {
         updateAccountName(ACCOUNT_2);
         AccountsChangedReceiver reciever = new AccountsChangedReceiver() {
@@ -84,6 +100,7 @@
         assertAccountName(null);
     }
 
+    @Test
     public void testAccountNotRemoved() {
         updateAccountName(ACCOUNT_2);
         AccountsChangedReceiver reciever = new AccountsChangedReceiver() {
diff --git a/tests/src/com/android/inputmethod/latin/common/InputPointersTests.java b/tests/src/com/android/inputmethod/latin/common/InputPointersTests.java
index 6b3490d..9ead0ae 100644
--- a/tests/src/com/android/inputmethod/latin/common/InputPointersTests.java
+++ b/tests/src/com/android/inputmethod/latin/common/InputPointersTests.java
@@ -16,15 +16,27 @@
 
 package com.android.inputmethod.latin.common;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import java.util.Arrays;
 
 @SmallTest
-public class InputPointersTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class InputPointersTests {
     private static final int DEFAULT_CAPACITY = 48;
 
+    @Test
     public void testNewInstance() {
         final InputPointers src = new InputPointers(DEFAULT_CAPACITY);
         assertEquals("new instance size", 0, src.getPointerSize());
@@ -34,6 +46,7 @@
         assertNotNull("new instance times", src.getTimes());
     }
 
+    @Test
     public void testReset() {
         final InputPointers src = new InputPointers(DEFAULT_CAPACITY);
         final int[] xCoordinates = src.getXCoordinates();
@@ -49,6 +62,7 @@
         assertNotSame("times after reset", times, src.getTimes());
     }
 
+    @Test
     public void testAdd() {
         final InputPointers src = new InputPointers(DEFAULT_CAPACITY);
         final int limit = src.getXCoordinates().length * 2 + 10;
@@ -72,6 +86,7 @@
         }
     }
 
+    @Test
     public void testAddAt() {
         final InputPointers src = new InputPointers(DEFAULT_CAPACITY);
         final int limit = 1000, step = 100;
@@ -95,6 +110,7 @@
         }
     }
 
+    @Test
     public void testSet() {
         final InputPointers src = new InputPointers(DEFAULT_CAPACITY);
         final int limit = src.getXCoordinates().length * 2 + 10;
@@ -114,6 +130,7 @@
         assertSame("times after set", dst.getTimes(), src.getTimes());
     }
 
+    @Test
     public void testCopy() {
         final InputPointers src = new InputPointers(DEFAULT_CAPACITY);
         final int limit = 100;
@@ -142,6 +159,7 @@
                 dst.getTimes(), 0, src.getTimes(), 0, size);
     }
 
+    @Test
     public void testAppend() {
         final int dstLength = 50;
         final InputPointers dst = new InputPointers(DEFAULT_CAPACITY);
@@ -211,6 +229,7 @@
                 srcTimes.getPrimitiveArray(), startPos, dst.getTimes(), dstLength, srcLength);
     }
 
+    @Test
     public void testAppendResizableIntArray() {
         final int dstLength = 50;
         final InputPointers dst = new InputPointers(DEFAULT_CAPACITY);
@@ -296,6 +315,7 @@
         }
     }
 
+    @Test
     public void testShift() {
         final InputPointers src = new InputPointers(DEFAULT_CAPACITY);
         final int limit = 100;
diff --git a/tests/src/com/android/inputmethod/latin/common/ResizableIntArrayTests.java b/tests/src/com/android/inputmethod/latin/common/ResizableIntArrayTests.java
index bd1629f..d9b6bad 100644
--- a/tests/src/com/android/inputmethod/latin/common/ResizableIntArrayTests.java
+++ b/tests/src/com/android/inputmethod/latin/common/ResizableIntArrayTests.java
@@ -16,15 +16,27 @@
 
 package com.android.inputmethod.latin.common;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import java.util.Arrays;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class ResizableIntArrayTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class ResizableIntArrayTests {
     private static final int DEFAULT_CAPACITY = 48;
 
+    @Test
     public void testNewInstance() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         final int[] array = src.getPrimitiveArray();
@@ -33,6 +45,7 @@
         assertEquals("new instance array length", DEFAULT_CAPACITY, array.length);
     }
 
+    @Test
     public void testAdd() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         final int[] array = src.getPrimitiveArray();
@@ -62,6 +75,7 @@
         }
     }
 
+    @Test
     public void testAddAt() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         final int limit = DEFAULT_CAPACITY * 10, step = DEFAULT_CAPACITY * 2;
@@ -76,6 +90,7 @@
         }
     }
 
+    @Test
     public void testGet() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         try {
@@ -105,6 +120,7 @@
         }
     }
 
+    @Test
     public void testReset() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         final int[] array = src.getPrimitiveArray();
@@ -136,6 +152,7 @@
         }
     }
 
+    @Test
     public void testSetLength() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         final int[] array = src.getPrimitiveArray();
@@ -172,6 +189,7 @@
         }
     }
 
+    @Test
     public void testSet() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         final int limit = DEFAULT_CAPACITY * 2 + 10;
@@ -186,6 +204,7 @@
         assertSame("array after set", dst.getPrimitiveArray(), src.getPrimitiveArray());
     }
 
+    @Test
     public void testCopy() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         for (int i = 0; i < DEFAULT_CAPACITY; i++) {
@@ -214,6 +233,7 @@
                 dst.getPrimitiveArray(), 0, src.getPrimitiveArray(), 0, dst.getLength());
     }
 
+    @Test
     public void testAppend() {
         final int srcLength = DEFAULT_CAPACITY;
         final ResizableIntArray src = new ResizableIntArray(srcLength);
@@ -264,6 +284,7 @@
                 srcLength);
     }
 
+    @Test
     public void testFill() {
         final int srcLength = DEFAULT_CAPACITY;
         final ResizableIntArray src = new ResizableIntArray(srcLength);
@@ -359,6 +380,7 @@
         }
     }
 
+    @Test
     public void testShift() {
         final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
         final int limit = DEFAULT_CAPACITY * 10;
diff --git a/tests/src/com/android/inputmethod/latin/common/StringUtilsTests.java b/tests/src/com/android/inputmethod/latin/common/StringUtilsTests.java
index ec9d4be..393efe6 100644
--- a/tests/src/com/android/inputmethod/latin/common/StringUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/common/StringUtilsTests.java
@@ -16,13 +16,21 @@
 
 package com.android.inputmethod.latin.common;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import java.util.Locale;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class StringUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class StringUtilsTests {
     private static final Locale US = Locale.US;
     private static final Locale GERMAN = Locale.GERMAN;
     private static final Locale TURKEY = new Locale("tr", "TR");
@@ -34,6 +42,7 @@
                 StringUtils.toTitleCaseOfKeyLabel(lowerCase, locale));
     }
 
+    @Test
     public void test_toTitleCaseOfKeyLabel() {
         assert_toTitleCaseOfKeyLabel(US, null, null);
         assert_toTitleCaseOfKeyLabel(US, "", "");
@@ -116,6 +125,7 @@
                 StringUtils.toTitleCaseOfKeyCode(lowerCase, locale));
     }
 
+    @Test
     public void test_toTitleCaseOfKeyCode() {
         assert_toTitleCaseOfKeyCode(US, Constants.CODE_ENTER, Constants.CODE_ENTER);
         assert_toTitleCaseOfKeyCode(US, Constants.CODE_SPACE, Constants.CODE_SPACE);
@@ -148,6 +158,7 @@
                 StringUtils.capitalizeFirstCodePoint(text, locale));
     }
 
+    @Test
     public void test_capitalizeFirstCodePoint() {
         assert_capitalizeFirstCodePoint(US, "", "");
         assert_capitalizeFirstCodePoint(US, "a", "A");
@@ -167,6 +178,7 @@
                 StringUtils.capitalizeFirstAndDowncaseRest(text, locale));
     }
 
+    @Test
     public void test_capitalizeFirstAndDowncaseRest() {
         assert_capitalizeFirstAndDowncaseRest(US, "", "");
         assert_capitalizeFirstAndDowncaseRest(US, "a", "A");
@@ -185,6 +197,7 @@
         assert_capitalizeFirstAndDowncaseRest(GREECE, "ΆΝΕΣΗ", "Άνεση");
     }
 
+    @Test
     public void testContainsInArray() {
         assertFalse("empty array", StringUtils.containsInArray("key", new String[0]));
         assertFalse("not in 1 element", StringUtils.containsInArray("key", new String[] {
@@ -202,6 +215,7 @@
         }));
     }
 
+    @Test
     public void testContainsInCommaSplittableText() {
         assertFalse("null", StringUtils.containsInCommaSplittableText("key", null));
         assertFalse("empty", StringUtils.containsInCommaSplittableText("key", ""));
@@ -214,6 +228,7 @@
         assertTrue("in 2 elements", StringUtils.containsInCommaSplittableText("key", "key1,key"));
     }
 
+    @Test
     public void testRemoveFromCommaSplittableTextIfExists() {
         assertEquals("null", "", StringUtils.removeFromCommaSplittableTextIfExists("key", null));
         assertEquals("empty", "", StringUtils.removeFromCommaSplittableTextIfExists("key", ""));
@@ -239,7 +254,7 @@
                         "key", "key1,key,key3,key,key5"));
     }
 
-
+    @Test
     public void testCapitalizeFirstCodePoint() {
         assertEquals("SSaa",
                 StringUtils.capitalizeFirstCodePoint("ßaa", Locale.GERMAN));
@@ -259,6 +274,7 @@
                 StringUtils.capitalizeFirstCodePoint("A", Locale.ENGLISH));
     }
 
+    @Test
     public void testCapitalizeFirstAndDowncaseRest() {
         assertEquals("SSaa",
                 StringUtils.capitalizeFirstAndDowncaseRest("ßaa", Locale.GERMAN));
@@ -278,6 +294,7 @@
                 StringUtils.capitalizeFirstAndDowncaseRest("A", Locale.ENGLISH));
     }
 
+    @Test
     public void testGetCapitalizationType() {
         assertEquals(StringUtils.CAPITALIZE_NONE,
                 StringUtils.getCapitalizationType("capitalize"));
@@ -301,6 +318,7 @@
                 StringUtils.getCapitalizationType(""));
     }
 
+    @Test
     public void testIsIdenticalAfterUpcaseIsIdenticalAfterDowncase() {
         assertFalse(StringUtils.isIdenticalAfterUpcase("capitalize"));
         assertTrue(StringUtils.isIdenticalAfterDowncase("capitalize"));
@@ -337,6 +355,7 @@
             StringUtils.toSortedCodePointArray(" \n.!?*()&");
     private static final int[] WORD_SEPARATORS = StringUtils.toSortedCodePointArray(" \n.!?*,();&");
 
+    @Test
     public void testCapitalizeEachWord() {
         checkCapitalize("", "", SPACE, Locale.ENGLISH);
         checkCapitalize("test", "Test", SPACE, Locale.ENGLISH);
@@ -367,6 +386,7 @@
                 WORD_SEPARATORS, Locale.ENGLISH);
     }
 
+    @Test
     public void testLooksLikeURL() {
         assertTrue(StringUtils.lastPartLooksLikeURL("http://www.google."));
         assertFalse(StringUtils.lastPartLooksLikeURL("word wo"));
@@ -389,6 +409,7 @@
         assertTrue(StringUtils.lastPartLooksLikeURL(".abc/def"));
     }
 
+    @Test
     public void testHexStringUtils() {
         final byte[] bytes = new byte[] { (byte)0x01, (byte)0x11, (byte)0x22, (byte)0x33,
                 (byte)0x55, (byte)0x88, (byte)0xEE };
@@ -401,6 +422,7 @@
         assertTrue(bytesStr.equals(bytesStr2));
     }
 
+    @Test
     public void testToCodePointArray() {
         final String STR_WITH_SUPPLEMENTARY_CHAR = "abcde\uD861\uDED7fgh\u0000\u2002\u2003\u3000xx";
         final int[] EXPECTED_RESULT = new int[] { 'a', 'b', 'c', 'd', 'e', 0x286D7, 'f', 'g', 'h',
@@ -414,6 +436,7 @@
         }
     }
 
+    @Test
     public void testCopyCodePointsAndReturnCodePointCount() {
         final String STR_WITH_SUPPLEMENTARY_CHAR = "AbcDE\uD861\uDED7fGh\u0000\u2002\u3000あx";
         final int[] EXPECTED_RESULT = new int[] { 'A', 'b', 'c', 'D', 'E', 0x286D7,
@@ -465,6 +488,7 @@
                 exceptionHappened);
     }
 
+    @Test
     public void testGetTrailingSingleQuotesCount() {
         assertEquals(0, StringUtils.getTrailingSingleQuotesCount(""));
         assertEquals(1, StringUtils.getTrailingSingleQuotesCount("'"));
diff --git a/tests/src/com/android/inputmethod/latin/common/UnicodeSurrogateTests.java b/tests/src/com/android/inputmethod/latin/common/UnicodeSurrogateTests.java
index 59bb082..43fdeec 100644
--- a/tests/src/com/android/inputmethod/latin/common/UnicodeSurrogateTests.java
+++ b/tests/src/com/android/inputmethod/latin/common/UnicodeSurrogateTests.java
@@ -16,18 +16,28 @@
 
 package com.android.inputmethod.latin.common;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 @SmallTest
-public class UnicodeSurrogateTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class UnicodeSurrogateTests {
 
+    @Test
     public void testIsLowSurrogate() {
         assertFalse(UnicodeSurrogate.isLowSurrogate('\uD7FF'));
         assertTrue(UnicodeSurrogate.isLowSurrogate('\uD83D'));
         assertFalse(UnicodeSurrogate.isLowSurrogate('\uDC00'));
     }
 
+    @Test
     public void testIsHighSurrogate() {
         assertFalse(UnicodeSurrogate.isHighSurrogate('\uDBFF'));
         assertTrue(UnicodeSurrogate.isHighSurrogate('\uDE25'));
diff --git a/tests/src/com/android/inputmethod/latin/network/BlockingHttpClientTests.java b/tests/src/com/android/inputmethod/latin/network/BlockingHttpClientTests.java
index 8f24cdb..bdbbaf2 100644
--- a/tests/src/com/android/inputmethod/latin/network/BlockingHttpClientTests.java
+++ b/tests/src/com/android/inputmethod/latin/network/BlockingHttpClientTests.java
@@ -16,13 +16,16 @@
 
 package com.android.inputmethod.latin.network;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.network.BlockingHttpClient.ResponseProcessor;
 
@@ -40,19 +43,24 @@
 import java.util.Arrays;
 import java.util.Random;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Tests for {@link BlockingHttpClient}.
  */
 @SmallTest
-public class BlockingHttpClientTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class BlockingHttpClientTests {
     @Mock HttpURLConnection mMockHttpConnection;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
     }
 
+    @Test
     public void testError_badGateway() throws IOException, AuthException {
         when(mMockHttpConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_BAD_GATEWAY);
         final BlockingHttpClient client = new BlockingHttpClient(mMockHttpConnection);
@@ -67,6 +75,7 @@
         }
     }
 
+    @Test
     public void testError_clientTimeout() throws Exception {
         when(mMockHttpConnection.getResponseCode()).thenReturn(
                 HttpURLConnection.HTTP_CLIENT_TIMEOUT);
@@ -82,6 +91,7 @@
         }
     }
 
+    @Test
     public void testError_forbiddenWithRequest() throws Exception {
         final OutputStream mockOutputStream = Mockito.mock(OutputStream.class);
         when(mMockHttpConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_FORBIDDEN);
@@ -98,6 +108,7 @@
         verify(mockOutputStream).write(any(byte[].class), eq(0), eq(100));
     }
 
+    @Test
     public void testSuccess_emptyRequest() throws Exception {
         final Random rand = new Random();
         byte[] response = new byte[100];
@@ -112,6 +123,7 @@
         assertTrue("ResponseProcessor was not invoked", processor.mInvoked);
     }
 
+    @Test
     public void testSuccess() throws Exception {
         final OutputStream mockOutputStream = Mockito.mock(OutputStream.class);
         final Random rand = new Random();
diff --git a/tests/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilderTests.java b/tests/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilderTests.java
index 5b3e78e..fce812e 100644
--- a/tests/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilderTests.java
+++ b/tests/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilderTests.java
@@ -20,25 +20,28 @@
 import static com.android.inputmethod.latin.network.HttpUrlConnectionBuilder.MODE_DOWNLOAD_ONLY;
 import static com.android.inputmethod.latin.network.HttpUrlConnectionBuilder.MODE_UPLOAD_ONLY;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 /**
  * Tests for {@link HttpUrlConnectionBuilder}.
  */
 @SmallTest
-public class HttpUrlConnectionBuilderTests extends AndroidTestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
+@RunWith(AndroidJUnit4.class)
+public class HttpUrlConnectionBuilderTests {
+    @Test
     public void testSetUrl_malformed() {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         try {
@@ -49,6 +52,7 @@
         }
     }
 
+    @Test
     public void testSetConnectTimeout_invalid() {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         try {
@@ -59,6 +63,7 @@
         }
     }
 
+    @Test
     public void testSetConnectTimeout() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("https://www.example.com");
@@ -67,6 +72,7 @@
         assertEquals(8765, connection.getConnectTimeout());
     }
 
+    @Test
     public void testSetReadTimeout_invalid() {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         try {
@@ -77,6 +83,7 @@
         }
     }
 
+    @Test
     public void testSetReadTimeout() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("https://www.example.com");
@@ -85,6 +92,7 @@
         assertEquals(8765, connection.getReadTimeout());
     }
 
+    @Test
     public void testAddHeader() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("http://www.example.com");
@@ -93,6 +101,7 @@
         assertEquals("some-random-value", connection.getRequestProperty("some-random-key"));
     }
 
+    @Test
     public void testSetUseCache_notSet() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("http://www.example.com");
@@ -100,6 +109,7 @@
         assertFalse(connection.getUseCaches());
     }
 
+    @Test
     public void testSetUseCache_false() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("http://www.example.com");
@@ -108,6 +118,7 @@
         assertFalse(connection.getUseCaches());
     }
 
+    @Test
     public void testSetUseCache_true() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("http://www.example.com");
@@ -116,6 +127,7 @@
         assertTrue(connection.getUseCaches());
     }
 
+    @Test
     public void testSetMode_uploadOnly() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("http://www.example.com");
@@ -125,6 +137,7 @@
         assertFalse(connection.getDoOutput());
     }
 
+    @Test
     public void testSetMode_downloadOnly() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("https://www.example.com");
@@ -134,6 +147,7 @@
         assertTrue(connection.getDoOutput());
     }
 
+    @Test
     public void testSetMode_bidirectional() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("https://www.example.com");
@@ -143,6 +157,7 @@
         assertTrue(connection.getDoOutput());
     }
 
+    @Test
     public void testSetAuthToken() throws IOException {
         HttpUrlConnectionBuilder builder = new HttpUrlConnectionBuilder();
         builder.setUrl("https://www.example.com");
diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
index 559f286..8f786d5 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
@@ -16,8 +16,12 @@
 
 package com.android.inputmethod.latin.personalization;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.util.Log;
 
 import com.android.inputmethod.latin.ExpandableBinaryDictionary;
@@ -27,17 +31,27 @@
 import java.util.Locale;
 import java.util.Random;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Unit tests for UserHistoryDictionary
  */
 @LargeTest
-public class UserHistoryDictionaryTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class UserHistoryDictionaryTests {
     private static final String TAG = UserHistoryDictionaryTests.class.getSimpleName();
     private static final int WAIT_FOR_WRITING_FILE_IN_MILLISECONDS = 3000;
     private static final String TEST_ACCOUNT = "account@example.com";
 
     private int mCurrentTime = 0;
 
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
+
     private static void printAllFiles(final File dir) {
         Log.d(TAG, dir.getAbsolutePath());
         for (final File file : dir.listFiles()) {
@@ -62,20 +76,18 @@
         assertTrue("Following dictionary file doesn't exist: " + dictFile, dictFile.exists());
     }
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
         resetCurrentTimeForTestMode();
         UserHistoryDictionaryTestsHelper.removeAllTestDictFiles(
-                UserHistoryDictionaryTestsHelper.TEST_LOCALE_PREFIX, mContext);
+                UserHistoryDictionaryTestsHelper.TEST_LOCALE_PREFIX, getContext());
     }
 
-    @Override
-    protected void tearDown() throws Exception {
+    @After
+    public void tearDown() throws Exception {
         UserHistoryDictionaryTestsHelper.removeAllTestDictFiles(
-                UserHistoryDictionaryTestsHelper.TEST_LOCALE_PREFIX, mContext);
+                UserHistoryDictionaryTestsHelper.TEST_LOCALE_PREFIX, getContext());
         stopTestModeInNativeCode();
-        super.tearDown();
     }
 
     private void resetCurrentTimeForTestMode() {
@@ -111,7 +123,7 @@
                 null /* dictFile */,
                 testAccount /* account */);
         final File dictFile = ExpandableBinaryDictionary.getDictFile(
-                mContext, dictName, null /* dictFile */);
+                getContext(), dictName, null /* dictFile */);
         final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary(
                 getContext(), dummyLocale, testAccount);
         clearHistory(dict);
@@ -123,18 +135,22 @@
         assertDictionaryExists(dict, dictFile);
     }
 
+    @Test
     public void testRandomWords_NullAccount() {
         doTestRandomWords(null /* testAccount */);
     }
 
+    @Test
     public void testRandomWords() {
         doTestRandomWords(TEST_ACCOUNT);
     }
 
+    @Test
     public void testStressTestForSwitchingLanguagesAndAddingWords() {
         doTestStressTestForSwitchingLanguagesAndAddingWords(TEST_ACCOUNT);
     }
 
+    @Test
     public void testStressTestForSwitchingLanguagesAndAddingWords_NullAccount() {
         doTestStressTestForSwitchingLanguagesAndAddingWords(null /* testAccount */);
     }
@@ -158,7 +174,7 @@
                         UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */,
                         testAccount /* account */);
                 dictFiles[i] = ExpandableBinaryDictionary.getDictFile(
-                        mContext, dictName, null /* dictFile */);
+                        getContext(), dictName, null /* dictFile */);
                 dicts[i] = PersonalizationHelper.getUserHistoryDictionary(getContext(),
                         dummyLocale, testAccount);
                 clearHistory(dicts[i]);
@@ -186,10 +202,12 @@
         }
     }
 
+    @Test
     public void testAddManyWords() {
         doTestAddManyWords(TEST_ACCOUNT);
     }
 
+    @Test
     public void testAddManyWords_NullAccount() {
         doTestAddManyWords(null /* testAccount */);
     }
@@ -200,7 +218,7 @@
         final String dictName = UserHistoryDictionary.getUserHistoryDictName(
                 UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */, testAccount);
         final File dictFile = ExpandableBinaryDictionary.getDictFile(
-                mContext, dictName, null /* dictFile */);
+                getContext(), dictName, null /* dictFile */);
         final int numberOfWords = 10000;
         final Random random = new Random(123456);
         final UserHistoryDictionary dict = PersonalizationHelper.getUserHistoryDictionary(
diff --git a/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java b/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java
index f2d8973..49a9a25 100644
--- a/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java
+++ b/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java
@@ -16,6 +16,9 @@
 
 package com.android.inputmethod.latin.settings;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.when;
 
@@ -23,13 +26,18 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.view.View;
 import android.widget.ListView;
 
 import com.android.inputmethod.latin.utils.ManagedProfileUtils;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -37,36 +45,41 @@
 import java.util.concurrent.TimeUnit;
 
 @MediumTest
-public class AccountsSettingsFragmentTests
-        extends ActivityInstrumentationTestCase2<TestFragmentActivity> {
+@RunWith(AndroidJUnit4.class)
+public class AccountsSettingsFragmentTests {
     private static final String FRAG_NAME = AccountsSettingsFragment.class.getName();
     private static final long TEST_TIMEOUT_MILLIS = 5000;
 
     @Mock private ManagedProfileUtils mManagedProfileUtils;
 
-    public AccountsSettingsFragmentTests() {
-        super(TestFragmentActivity.class);
+    private TestFragmentActivity mActivity;
+    private TestFragmentActivity getActivity() {
+        return mActivity;
     }
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
+    @Before
+    public void setUp() throws Exception {
         // Initialize the mocks.
         MockitoAnnotations.initMocks(this);
         ManagedProfileUtils.setTestInstance(mManagedProfileUtils);
 
-        Intent intent = new Intent();
-        intent.putExtra(TestFragmentActivity.EXTRA_SHOW_FRAGMENT, FRAG_NAME);
-        setActivityIntent(intent);
+        final Intent intent = new Intent()
+                .setAction(Intent.ACTION_MAIN)
+                .setClass(InstrumentationRegistry.getTargetContext(), TestFragmentActivity.class)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                .addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
+                .putExtra(TestFragmentActivity.EXTRA_SHOW_FRAGMENT, FRAG_NAME);
+        mActivity = (TestFragmentActivity) InstrumentationRegistry.getInstrumentation()
+                .startActivitySync(intent);
     }
 
-    @Override
+    @After
     public void tearDown() throws Exception {
         ManagedProfileUtils.setTestInstance(null);
-        super.tearDown();
+        mActivity = null;
     }
 
+    @Test
     public void testEmptyAccounts() {
         final AccountsSettingsFragment fragment =
                 (AccountsSettingsFragment) getActivity().mFragment;
@@ -83,6 +96,7 @@
         DialogHolder() {}
     }
 
+    @Test
     public void testMultipleAccounts_noSettingsForManagedProfile() {
         when(mManagedProfileUtils.hasWorkProfile(any(Context.class))).thenReturn(true);
 
@@ -95,6 +109,7 @@
         assertNull(fragment.findPreference(AccountsSettingsFragment.PREF_ACCCOUNT_SWITCHER));
     }
 
+    @Test
     public void testMultipleAccounts_noCurrentAccount() {
         when(mManagedProfileUtils.hasWorkProfile(any(Context.class))).thenReturn(false);
 
@@ -116,6 +131,7 @@
                 dialog.getButton(DialogInterface.BUTTON_POSITIVE).getVisibility());
     }
 
+    @Test
     public void testMultipleAccounts_currentAccount() {
         when(mManagedProfileUtils.hasWorkProfile(any(Context.class))).thenReturn(false);
 
@@ -164,7 +180,7 @@
         } catch (InterruptedException ex) {
             fail();
         }
-        getInstrumentation().waitForIdleSync();
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         return dialogHolder;
     }
 }
diff --git a/tests/src/com/android/inputmethod/latin/settings/SpacingAndPunctuationsTests.java b/tests/src/com/android/inputmethod/latin/settings/SpacingAndPunctuationsTests.java
index ed632db..52ed2ae 100644
--- a/tests/src/com/android/inputmethod/latin/settings/SpacingAndPunctuationsTests.java
+++ b/tests/src/com/android/inputmethod/latin/settings/SpacingAndPunctuationsTests.java
@@ -16,9 +16,16 @@
 
 package com.android.inputmethod.latin.settings;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.content.Context;
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.SuggestedWords;
 import com.android.inputmethod.latin.common.Constants;
@@ -28,13 +35,22 @@
 
 import java.util.Locale;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class SpacingAndPunctuationsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SpacingAndPunctuationsTests {
     private static final int ARMENIAN_FULL_STOP = '\u0589';
     private static final int ARMENIAN_COMMA = '\u055D';
 
     private int mScreenMetrics;
 
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
+
     private boolean isPhone() {
         return Constants.isPhone(mScreenMetrics);
     }
@@ -63,10 +79,8 @@
     private SpacingAndPunctuations CAMBODIA_KHMER;
     private SpacingAndPunctuations LAOS_LAO;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
+    @Before
+    public void setUp() throws Exception {
         mScreenMetrics = Settings.readScreenMetrics(getContext().getResources());
 
         // Language only
@@ -140,6 +154,7 @@
         assertFalse("Tilde",      sp.isWordSeparator('~'));
     }
 
+    @Test
     public void testWordSeparator() {
         testingStandardWordSeparator(ENGLISH);
         testingStandardWordSeparator(FRENCH);
@@ -192,6 +207,7 @@
 
     }
 
+    @Test
     public void testWordConnector() {
         testingStandardWordConnector(ENGLISH);
         testingStandardWordConnector(FRENCH);
@@ -245,6 +261,7 @@
         assertFalse("Question",    sp.isUsuallyPrecededBySpace('?'));
     }
 
+    @Test
     public void testIsUsuallyPrecededBySpace() {
         testingStandardPrecededBySpace(ENGLISH);
         testingCommonPrecededBySpace(FRENCH);
@@ -298,6 +315,7 @@
         assertFalse("Tilde",       sp.isUsuallyFollowedBySpace('~'));
     }
 
+    @Test
     public void testIsUsuallyFollowedBySpace() {
         testingStandardFollowedBySpace(ENGLISH);
         testingStandardFollowedBySpace(FRENCH);
@@ -345,7 +363,8 @@
         assertFalse("Tilde",       sp.isUsuallyFollowedBySpace('~'));
     }
 
-    public void isSentenceSeparator() {
+    @Test
+    public void testIsSentenceSeparator() {
         testingStandardSentenceSeparator(ENGLISH);
         try {
             testingStandardSentenceSeparator(ARMENIA_ARMENIAN);
@@ -357,6 +376,7 @@
         assertFalse(ARMENIA_ARMENIAN.isSentenceSeparator(ARMENIAN_COMMA));
     }
 
+    @Test
     public void testLanguageHasSpace() {
         assertTrue(ENGLISH.mCurrentLanguageHasSpaces);
         assertTrue(FRENCH.mCurrentLanguageHasSpaces);
@@ -369,6 +389,7 @@
         assertTrue(LAO.mCurrentLanguageHasSpaces);
     }
 
+    @Test
     public void testUsesAmericanTypography() {
         assertTrue(ENGLISH.mUsesAmericanTypography);
         assertTrue(UNITED_STATES.mUsesAmericanTypography);
@@ -379,6 +400,7 @@
         assertFalse(SWISS_GERMAN.mUsesAmericanTypography);
     }
 
+    @Test
     public void testUsesGermanRules() {
         assertFalse(ENGLISH.mUsesGermanRules);
         assertFalse(FRENCH.mUsesGermanRules);
@@ -436,6 +458,7 @@
         }
     }
 
+    @Test
     public void testPhonePunctuationSuggestions() {
         if (!isPhone()) {
             return;
@@ -454,6 +477,7 @@
                 PUNCTUATION_LABELS_PHONE, PUNCTUATION_WORDS_PHONE_HEBREW);
     }
 
+    @Test
     public void testTabletPunctuationSuggestions() {
         if (!isTablet()) {
             return;
diff --git a/tests/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelperTests.java b/tests/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelperTests.java
index f3273a2..b44a929 100644
--- a/tests/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelperTests.java
+++ b/tests/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelperTests.java
@@ -16,13 +16,22 @@
 
 package com.android.inputmethod.latin.suggestions;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static junit.framework.TestCase.assertEquals;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.SuggestedWords;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class SuggestionStripLayoutHelperTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SuggestionStripLayoutHelperTests {
     private static void confirmShowTypedWord(final String message, final int inputType) {
         assertFalse(message, SuggestionStripLayoutHelper.shouldOmitTypedWord(
                 inputType,
@@ -42,6 +51,7 @@
                 true /* shouldShowUiToAcceptTypedWord */));
     }
 
+    @Test
     public void testShouldShowTypedWord() {
         confirmShowTypedWord("no input style",
                 SuggestedWords.INPUT_STYLE_NONE);
@@ -51,7 +61,8 @@
                 SuggestedWords.INPUT_STYLE_RECORRECTION);
     }
 
-    public void testshouldOmitTypedWordWhileTyping() {
+    @Test
+    public void testShouldOmitTypedWordWhileTyping() {
         assertFalse("typing", SuggestionStripLayoutHelper.shouldOmitTypedWord(
                 SuggestedWords.INPUT_STYLE_TYPING,
                 false /* gestureFloatingPreviewTextEnabled */,
@@ -70,7 +81,8 @@
                 true /* shouldShowUiToAcceptTypedWord */));
     }
 
-    public void testshouldOmitTypedWordWhileGesturing() {
+    @Test
+    public void testShouldOmitTypedWordWhileGesturing() {
         assertFalse("gesturing", SuggestionStripLayoutHelper.shouldOmitTypedWord(
                 SuggestedWords.INPUT_STYLE_UPDATE_BATCH,
                 false /* gestureFloatingPreviewTextEnabled */,
@@ -89,7 +101,8 @@
                 true /* shouldShowUiToAcceptTypedWord */));
     }
 
-    public void testshouldOmitTypedWordWhenGestured() {
+    @Test
+    public void testShouldOmitTypedWordWhenGestured() {
         assertFalse("gestured", SuggestionStripLayoutHelper.shouldOmitTypedWord(
                 SuggestedWords.INPUT_STYLE_TAIL_BATCH,
                 false /* gestureFloatingPreviewTextEnabled */,
@@ -115,6 +128,7 @@
     private static final int POSITION_CENTER = 1;
     private static final int POSITION_RIGHT = 2;
 
+    @Test
     public void testGetPositionInSuggestionStrip() {
         assertEquals("1st word without auto correction", POSITION_CENTER,
                 SuggestionStripLayoutHelper.getPositionInSuggestionStrip(
diff --git a/tests/src/com/android/inputmethod/latin/touchinputconsumer/NullGestureConsumerTests.java b/tests/src/com/android/inputmethod/latin/touchinputconsumer/NullGestureConsumerTests.java
index ad6bcc3..d508f36 100644
--- a/tests/src/com/android/inputmethod/latin/touchinputconsumer/NullGestureConsumerTests.java
+++ b/tests/src/com/android/inputmethod/latin/touchinputconsumer/NullGestureConsumerTests.java
@@ -16,18 +16,26 @@
 
 package com.android.inputmethod.latin.touchinputconsumer;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 /**
  * Tests for GestureConsumer.NULL_GESTURE_CONSUMER.
  */
 @SmallTest
-public class NullGestureConsumerTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class NullGestureConsumerTests {
     /**
      * Tests that GestureConsumer.NULL_GESTURE_CONSUMER indicates that it won't consume gesture data
      * and that its methods don't raise exceptions even for invalid data.
      */
+    @Test
     public void testNullGestureConsumer() {
         assertFalse(GestureConsumer.NULL_GESTURE_CONSUMER.willConsume());
         GestureConsumer.NULL_GESTURE_CONSUMER.onInit(null, null);
@@ -40,6 +48,7 @@
     /**
      * Tests that newInstance returns NULL_GESTURE_CONSUMER for invalid input.
      */
+    @Test
     public void testNewInstanceGivesNullGestureConsumerForInvalidInputs() {
         assertSame(GestureConsumer.NULL_GESTURE_CONSUMER,
                 GestureConsumer.newInstance(null, null, null, null));
diff --git a/tests/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtilsTests.java
index 1db8395..ba3951f 100644
--- a/tests/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtilsTests.java
@@ -22,19 +22,28 @@
 import static com.android.inputmethod.latin.common.Constants.Subtype.ExtraValue.IS_ADDITIONAL_SUBTYPE;
 import static com.android.inputmethod.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET;
 import static com.android.inputmethod.latin.common.Constants.Subtype.ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
 import android.os.Build;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils;
 
 import java.util.Locale;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class AdditionalSubtypeUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class AdditionalSubtypeUtilsTests {
 
     /**
      * Predictable subtype ID for en_US dvorak layout. This is actually a hash code calculated as
@@ -98,10 +107,9 @@
             ",EmojiCapable" +
             ",isAdditionalSubtype";
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final Context context = getContext();
+    @Before
+    public void setUp() throws Exception {
+        final Context context = InstrumentationRegistry.getTargetContext();
         SubtypeLocaleUtils.init(context);
     }
 
@@ -149,6 +157,7 @@
         assertEquals(SUBTYPE_ID_ZZ_AZERTY, subtype.hashCode());
     }
 
+    @Test
     public void testRestorable() {
         final InputMethodSubtype EN_US_DVORAK =
                 AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
diff --git a/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java b/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java
index c214b5f..f30f666 100644
--- a/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/AsyncResultHolderTests.java
@@ -16,12 +16,18 @@
 
 package com.android.inputmethod.latin.utils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.util.Log;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @MediumTest
-public class AsyncResultHolderTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class AsyncResultHolderTests {
     static final String TAG = AsyncResultHolderTests.class.getSimpleName();
 
     private static final int TIMEOUT_IN_MILLISECONDS = 500;
@@ -44,12 +50,14 @@
         }).start();
     }
 
+    @Test
     public void testGetWithoutSet() {
         final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>("Test");
         final int resultValue = holder.get(DEFAULT_VALUE, TIMEOUT_IN_MILLISECONDS);
         assertEquals(DEFAULT_VALUE, resultValue);
     }
 
+    @Test
     public void testGetBeforeSet() {
         final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>("Test");
         setAfterGivenTime(holder, SET_VALUE, TIMEOUT_IN_MILLISECONDS + MARGIN_IN_MILLISECONDS);
@@ -57,6 +65,7 @@
         assertEquals(DEFAULT_VALUE, resultValue);
     }
 
+    @Test
     public void testGetAfterSet() {
         final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>("Test");
         holder.set(SET_VALUE);
@@ -64,6 +73,7 @@
         assertEquals(SET_VALUE, resultValue);
     }
 
+    @Test
     public void testGetBeforeTimeout() {
         final AsyncResultHolder<Integer> holder = new AsyncResultHolder<>("Test");
         setAfterGivenTime(holder, SET_VALUE, TIMEOUT_IN_MILLISECONDS - MARGIN_IN_MILLISECONDS);
diff --git a/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java
index 9680d85..3a452e4 100644
--- a/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java
@@ -16,18 +16,26 @@
 
 package com.android.inputmethod.latin.utils;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.text.TextUtils;
 
 import com.android.inputmethod.latin.common.LocaleUtils;
 import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import java.util.Locale;
 
 @SmallTest
-public class CapsModeUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class CapsModeUtilsTests {
     private static void onePathForCaps(final CharSequence cs, final int expectedResult,
             final int mask, final SpacingAndPunctuations sp, final boolean hasSpaceBefore) {
         final int oneTimeResult = expectedResult & mask;
@@ -49,6 +57,7 @@
         onePathForCaps(cs, expectedResult, s, sp, hasSpaceBefore);
     }
 
+    @Test
     public void testGetCapsMode() {
         final int c = TextUtils.CAP_MODE_CHARACTERS;
         final int w = TextUtils.CAP_MODE_WORDS;
@@ -59,7 +68,7 @@
                 return new SpacingAndPunctuations(res);
             }
         };
-        final Resources res = getContext().getResources();
+        final Resources res = InstrumentationRegistry.getTargetContext().getResources();
         SpacingAndPunctuations sp = job.runInLocale(res, Locale.ENGLISH);
         allPathsForCaps("", c | w | s, sp, false);
         allPathsForCaps("Word", c, sp, false);
diff --git a/tests/src/com/android/inputmethod/latin/utils/CollectionUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/CollectionUtilsTests.java
index 0cbb02c..96dfa36 100644
--- a/tests/src/com/android/inputmethod/latin/utils/CollectionUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/CollectionUtilsTests.java
@@ -16,11 +16,16 @@
 
 package com.android.inputmethod.latin.utils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.android.inputmethod.latin.common.CollectionUtils;
 
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -28,15 +33,20 @@
 import java.util.List;
 import java.util.Map;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Tests for {@link CollectionUtils}.
  */
 @SmallTest
-public class CollectionUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class CollectionUtilsTests {
     /**
      * Tests that {@link CollectionUtils#arrayAsList(Object[],int,int)} fails as expected
      * with some invalid inputs.
      */
+    @Test
     public void testArrayAsListFailure() {
         final String[] array = { "0", "1" };
         // Negative start
@@ -66,6 +76,7 @@
      * Tests that {@link CollectionUtils#arrayAsList(Object[],int,int)} gives the expected
      * results for a few valid inputs.
      */
+    @Test
     public void testArrayAsList() {
         final ArrayList<String> empty = new ArrayList<>();
         assertEquals(empty, CollectionUtils.arrayAsList(new String[] {}, 0, 0));
@@ -81,6 +92,7 @@
      * Tests that {@link CollectionUtils#isNullOrEmpty(java.util.Collection)} gives the expected
      * results for a few cases.
      */
+    @Test
     public void testIsNullOrEmpty() {
         assertTrue(CollectionUtils.isNullOrEmpty((List<String>) null));
         assertTrue(CollectionUtils.isNullOrEmpty((Map<String, String>) null));
diff --git a/tests/src/com/android/inputmethod/latin/utils/DictionaryInfoUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/DictionaryInfoUtilsTests.java
index 812353c..e24707a 100644
--- a/tests/src/com/android/inputmethod/latin/utils/DictionaryInfoUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/DictionaryInfoUtilsTests.java
@@ -16,17 +16,27 @@
 
 package com.android.inputmethod.latin.utils;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.common.LocaleUtils;
 import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
 
 import java.util.Locale;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class DictionaryInfoUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class DictionaryInfoUtilsTests {
+    @Test
     public void testLooksValidForDictionaryInsertion() {
         final RunInLocale<SpacingAndPunctuations> job = new RunInLocale<SpacingAndPunctuations>() {
             @Override
@@ -34,7 +44,7 @@
                 return new SpacingAndPunctuations(res);
             }
         };
-        final Resources res = getContext().getResources();
+        final Resources res = InstrumentationRegistry.getTargetContext().getResources();
         final SpacingAndPunctuations sp = job.runInLocale(res, Locale.ENGLISH);
         assertTrue(DictionaryInfoUtils.looksValidForDictionaryInsertion("aochaueo", sp));
         assertFalse(DictionaryInfoUtils.looksValidForDictionaryInsertion("", sp));
@@ -46,6 +56,7 @@
         assertFalse(DictionaryInfoUtils.looksValidForDictionaryInsertion("!!!", sp));
     }
 
+    @Test
     public void testGetMainDictId() {
         assertEquals("main:en",
                 DictionaryInfoUtils.getMainDictId(LocaleUtils.constructLocaleFromString("en")));
diff --git a/tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java
index 8692305..6118ad8 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ExecutorUtilsTests.java
@@ -16,24 +16,31 @@
 
 package com.android.inputmethod.latin.utils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.util.Log;
 
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Unit tests for {@link ExecutorUtils}.
  */
 @MediumTest
-public class ExecutorUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class ExecutorUtilsTests {
     private static final String TAG = ExecutorUtilsTests.class.getSimpleName();
 
     private static final int NUM_OF_TASKS = 10;
     private static final int DELAY_FOR_WAITING_TASKS_MILLISECONDS = 500;
 
+    @Test
     public void testExecute() {
         final ExecutorService executor =
                 ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD);
diff --git a/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
index df01807..8c004bf 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
@@ -17,32 +17,39 @@
 package com.android.inputmethod.latin.utils;
 
 import static com.android.inputmethod.latin.utils.ImportantNoticeUtils.KEY_TIMESTAMP_OF_CONTACTS_NOTICE;
+import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.text.TextUtils;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.settings.SettingsValues;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
-import java.util.concurrent.TimeUnit;
-
 @MediumTest
-public class ImportantNoticeUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class ImportantNoticeUtilsTests {
 
     private ImportantNoticePreferences mImportantNoticePreferences;
 
     @Mock private SettingsValues mMockSettingsValues;
 
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
+
     private static class ImportantNoticePreferences {
         private final SharedPreferences mPref;
 
-        private Integer mVersion;
         private Long mLastTime;
 
         public ImportantNoticePreferences(final Context context) {
@@ -96,21 +103,20 @@
         }
     }
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
         mImportantNoticePreferences = new ImportantNoticePreferences(getContext());
         mImportantNoticePreferences.save();
         when(mMockSettingsValues.isPersonalizationEnabled()).thenReturn(true);
     }
 
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
+    @After
+    public void tearDown() throws Exception {
         mImportantNoticePreferences.restore();
     }
 
+    @Test
     public void testPersonalizationSetting() {
         mImportantNoticePreferences.clear();
 
diff --git a/tests/src/com/android/inputmethod/latin/utils/JsonUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/JsonUtilsTests.java
index 1941120..a9e40a7 100644
--- a/tests/src/com/android/inputmethod/latin/utils/JsonUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/JsonUtilsTests.java
@@ -16,14 +16,21 @@
 
 package com.android.inputmethod.latin.utils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import java.util.Arrays;
 import java.util.List;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class JsonUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class JsonUtilsTests {
+    @Test
     public void testJsonUtils() {
         final Object[] objs = new Object[] { 1, "aaa", "bbb", 3 };
         final List<Object> objArray = Arrays.asList(objs);
diff --git a/tests/src/com/android/inputmethod/latin/utils/LanguageOnSpacebarUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/LanguageOnSpacebarUtilsTests.java
index e4b6a66..972b783 100644
--- a/tests/src/com/android/inputmethod/latin/utils/LanguageOnSpacebarUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/LanguageOnSpacebarUtilsTests.java
@@ -19,10 +19,12 @@
 import static com.android.inputmethod.latin.utils.LanguageOnSpacebarUtils.FORMAT_TYPE_FULL_LOCALE;
 import static com.android.inputmethod.latin.utils.LanguageOnSpacebarUtils.FORMAT_TYPE_LANGUAGE_ONLY;
 import static com.android.inputmethod.latin.utils.LanguageOnSpacebarUtils.FORMAT_TYPE_NONE;
+import static org.junit.Assert.assertEquals;
 
 import android.content.Context;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.RichInputMethodManager;
@@ -36,8 +38,13 @@
 
 import javax.annotation.Nonnull;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class LanguageOnSpacebarUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class LanguageOnSpacebarUtilsTests {
     private RichInputMethodManager mRichImm;
 
     RichInputMethodSubtype EN_US_QWERTY;
@@ -50,10 +57,9 @@
     RichInputMethodSubtype IW_HEBREW;
     RichInputMethodSubtype ZZ_QWERTY;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final Context context = getContext();
+    @Before
+    public void setUp() throws Exception {
+        final Context context = InstrumentationRegistry.getTargetContext();
         RichInputMethodManager.init(context);
         mRichImm = RichInputMethodManager.getInstance();
 
@@ -99,6 +105,7 @@
                 LanguageOnSpacebarUtils.getLanguageOnSpacebarFormatType(subtype));
     }
 
+    @Test
     public void testOneSubtypeImplicitlyEnabled() {
         enableSubtypes(EN_US_QWERTY);
         assertFormatType(EN_US_QWERTY, true, Locale.US,            FORMAT_TYPE_NONE);
@@ -113,6 +120,7 @@
         assertFormatType(FR_CA_QWERTY, true, Locale.CANADA_FRENCH, FORMAT_TYPE_NONE);
     }
 
+    @Test
     public void testOneSubtypeExplicitlyEnabled() {
         enableSubtypes(EN_US_QWERTY);
         assertFormatType(EN_US_QWERTY, false, Locale.UK,     FORMAT_TYPE_LANGUAGE_ONLY);
@@ -131,6 +139,7 @@
         assertFormatType(FR_CA_QWERTY, false, Locale.FRANCE,        FORMAT_TYPE_LANGUAGE_ONLY);
     }
 
+    @Test
     public void testOneSubtypeImplicitlyEnabledWithNoLanguageSubtype() {
         final Locale Locale_IW = new Locale("iw");
         enableSubtypes(IW_HEBREW, ZZ_QWERTY);
@@ -140,6 +149,7 @@
         assertFormatType(ZZ_QWERTY,    true, Locale_IW, FORMAT_TYPE_FULL_LOCALE);
     }
 
+    @Test
     public void testTwoSubtypesExplicitlyEnabled() {
         enableSubtypes(EN_US_QWERTY, FR_AZERTY);
         assertFormatType(EN_US_QWERTY, false, Locale.US,     FORMAT_TYPE_LANGUAGE_ONLY);
@@ -157,6 +167,7 @@
 
     }
 
+    @Test
     public void testMultiSubtypeWithSameLanuageAndSameLayout() {
         // Explicitly enable en_US, en_GB, fr_FR, and no language keyboards.
         enableSubtypes(EN_US_QWERTY, EN_GB_QWERTY, FR_CA_QWERTY, ZZ_QWERTY);
@@ -172,6 +183,7 @@
         assertFormatType(ZZ_QWERTY,    false, Locale.JAPAN, FORMAT_TYPE_FULL_LOCALE);
     }
 
+    @Test
     public void testMultiSubtypesWithSameLanguageButHaveDifferentLayout() {
         enableSubtypes(FR_AZERTY, FR_CA_QWERTY, FR_CH_SWISS, FR_CH_QWERTZ);
 
@@ -191,6 +203,7 @@
         assertFormatType(FR_CH_QWERTZ, false, Locale.JAPAN, FORMAT_TYPE_LANGUAGE_ONLY);
     }
 
+    @Test
     public void testMultiSubtypesWithSameLanguageAndMayHaveSameLayout() {
         enableSubtypes(FR_AZERTY, FR_CA_QWERTY, FR_CH_SWISS, FR_CH_QWERTY, FR_CH_QWERTZ);
 
diff --git a/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java b/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java
index 9b82683..8224272 100644
--- a/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/RecapitalizeStatusTests.java
@@ -16,17 +16,24 @@
 
 package com.android.inputmethod.latin.utils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import com.android.inputmethod.latin.common.Constants;
 
 import java.util.Locale;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class RecapitalizeStatusTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class RecapitalizeStatusTests {
     private static final int[] SPACE = { Constants.CODE_SPACE };
 
+    @Test
     public void testTrim() {
         final RecapitalizeStatus status = new RecapitalizeStatus();
         status.start(30, 40, "abcdefghij", Locale.ENGLISH, SPACE);
@@ -54,6 +61,7 @@
         assertEquals(43, status.getNewCursorEnd());
     }
 
+    @Test
     public void testRotate() {
         final RecapitalizeStatus status = new RecapitalizeStatus();
         status.start(29, 40, "abcd efghij", Locale.ENGLISH, SPACE);
diff --git a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
index 8e764e4..ac05d3c 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
@@ -16,13 +16,22 @@
 
 package com.android.inputmethod.latin.utils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 
 import java.util.HashMap;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class ResourceUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class ResourceUtilsTests {
+    @Test
     public void testFindConstantForKeyValuePairsSimple() {
         final HashMap<String,String> anyKeyValue = new HashMap<>();
         anyKeyValue.put("anyKey", "anyValue");
@@ -69,6 +78,7 @@
         assertNull(ResourceUtils.findConstantForKeyValuePairs(emptyKeyValue, array));
     }
 
+    @Test
     public void testFindConstantForKeyValuePairsCombined() {
         final String HARDWARE_KEY = "HARDWARE";
         final String MODEL_KEY = "MODEL";
@@ -113,6 +123,7 @@
         assertEquals("0.2", ResourceUtils.findConstantForKeyValuePairs(keyValues, failArray));
     }
 
+    @Test
     public void testFindConstantForKeyValuePairsRegexp() {
         final String HARDWARE_KEY = "HARDWARE";
         final String MODEL_KEY = "MODEL";
diff --git a/tests/src/com/android/inputmethod/latin/utils/SpannableStringUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/SpannableStringUtilsTests.java
index 665d81c..9a6b862 100644
--- a/tests/src/com/android/inputmethod/latin/utils/SpannableStringUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/SpannableStringUtilsTests.java
@@ -16,8 +16,13 @@
 
 package com.android.inputmethod.latin.utils;
 
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.text.style.SuggestionSpan;
 import android.text.style.URLSpan;
 import android.text.SpannableString;
@@ -25,8 +30,18 @@
 import android.text.Spanned;
 import android.text.SpannedString;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class SpannableStringUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SpannableStringUtilsTests {
+
+    private Context getContext() {
+        return InstrumentationRegistry.getTargetContext();
+    }
+
+    @Test
     public void testConcatWithSuggestionSpansOnly() {
         SpannableStringBuilder s = new SpannableStringBuilder("test string\ntest string\n"
                 + "test string\ntest string\ntest string\ntest string\ntest string\ntest string\n"
@@ -87,6 +102,7 @@
         assertTrue(false);
     }
 
+    @Test
     public void testSplitCharSequenceWithSpan() {
         // text:  " a bcd efg hij  "
         // span1:  ^^^^^^^
@@ -182,6 +198,7 @@
         assertSpanCount(0, charSequencesFromSpanned[6]);
     }
 
+    @Test
     public void testSplitCharSequencePreserveTrailingEmptySegmengs() {
         assertEquals(1, SpannableStringUtils.split("", " ",
                 false /* preserveTrailingEmptySegmengs */).length);
diff --git a/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java
index 2297cac..8e47f3a 100644
--- a/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtilsTests.java
@@ -16,10 +16,16 @@
 
 package com.android.inputmethod.latin.utils;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import android.content.Context;
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
@@ -30,8 +36,14 @@
 import java.util.ArrayList;
 import java.util.Locale;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
-public class SubtypeLocaleUtilsTests extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SubtypeLocaleUtilsTests {
     // All input method subtypes of LatinIME.
     private final ArrayList<RichInputMethodSubtype> mSubtypesList = new ArrayList<>();
 
@@ -64,10 +76,9 @@
     InputMethodSubtype HI_LATN_DVORAK; // Hinglis Dvorak
     InputMethodSubtype SR_LATN_QWERTY; // Serbian Latin Qwerty
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final Context context = getContext();
+    @Before
+    public void setUp() throws Exception {
+        final Context context = InstrumentationRegistry.getTargetContext();
         mRes = context.getResources();
         RichInputMethodManager.init(context);
         mRichImm = RichInputMethodManager.getInstance();
@@ -136,13 +147,13 @@
         }
     }
 
-    @Override
-    protected void tearDown() throws Exception {
+    @After
+    public void tearDown() throws Exception {
         // Restore additional subtypes.
         mRichImm.setAdditionalInputMethodSubtypes(mSavedAddtionalSubtypes);
-        super.tearDown();
     }
 
+    @Test
     public void testAllFullDisplayName() {
         for (final RichInputMethodSubtype subtype : mSubtypesList) {
             final String subtypeName = SubtypeLocaleUtils
@@ -159,6 +170,7 @@
         }
     }
 
+    @Test
     public void testKeyboardLayoutSetName() {
         assertEquals("en_US", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_US));
         assertEquals("en_GB", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_GB));
@@ -223,6 +235,7 @@
     //  sr_ZZ qwerty         T  Serbian (QWERTY)        exception
     //  zz    pc             T  Alphabet (PC)
 
+    @Test
     public void testPredefinedSubtypesInEnglishSystemLocale() {
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
@@ -264,6 +277,7 @@
         tests.runInLocale(mRes, Locale.ENGLISH);
     }
 
+    @Test
     public void testAdditionalSubtypesInEnglishSystemLocale() {
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
@@ -323,6 +337,7 @@
     //  sr_ZZ qwerty         T  Serbe (QWERTY)                   exception
     //  zz    pc             T  Alphabet latin (PC)
 
+    @Test
     public void testPredefinedSubtypesInFrenchSystemLocale() {
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
@@ -364,6 +379,7 @@
         tests.runInLocale(mRes, Locale.FRENCH);
     }
 
+    @Test
     public void testAdditionalSubtypesInFrenchSystemLocale() {
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
@@ -405,6 +421,7 @@
     //  hi_ZZ qwerty  F  हिंग्लिश
     //  hi_ZZ dvorak  T  हिंग्लिश (Dvorak)
 
+    @Test
     public void testHinglishSubtypesInHindiSystemLocale() {
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
@@ -432,6 +449,7 @@
     //  sr_ZZ serbian_qwertz F  Српски (латиница)
     //  sr_ZZ qwerty         T  Српски (QWERTY)
 
+    @Test
     public void testSerbianLatinSubtypesInSerbianSystemLocale() {
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
@@ -451,6 +469,7 @@
         tests.runInLocale(mRes, new Locale("sr"));
     }
 
+    @Test
     public void testIsRtlLanguage() {
         // Known Right-to-Left language subtypes.
         final InputMethodSubtype ARABIC = mRichImm
diff --git a/tools/EditTextVariations/Android.mk b/tools/EditTextVariations/Android.mk
new file mode 100644
index 0000000..1f49aa4
--- /dev/null
+++ b/tools/EditTextVariations/Android.mk
@@ -0,0 +1,26 @@
+# Copyright (C) 2013 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := EditTextVariations
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tools/EditTextVariations/AndroidManifest.xml b/tools/EditTextVariations/AndroidManifest.xml
new file mode 100644
index 0000000..7694f4d
--- /dev/null
+++ b/tools/EditTextVariations/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.inputmethod.tools.edittextvariations"
+    android:versionName="0.67"
+    android:versionCode="67"
+>
+    <supports-screens android:resizeable="true" />
+    <uses-sdk
+        android:targetSdkVersion="27"
+        android:minSdkVersion="11" />
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
+        android:allowBackup="false"
+    >
+        <activity
+            android:name=".EditTextVariations"
+            android:windowSoftInputMode="stateHidden|adjustPan"
+            android:theme="@style/defaultActivityTheme"
+            android:label="@string/app_name"
+        >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tools/EditTextVariations/assets/Theme.css b/tools/EditTextVariations/assets/Theme.css
new file mode 100644
index 0000000..b7aa514
--- /dev/null
+++ b/tools/EditTextVariations/assets/Theme.css
@@ -0,0 +1,56 @@
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+body {
+    background-color: black;
+}
+div.placeholder {
+    color: #a0a0a0;
+    font-size: 18px;
+    margin: 0px 0px -34px 0px;
+    padding: 4px 0px 4px 0px
+}
+div.input {
+    border: none;
+    margin: 4px 0px 4px -8px;
+}
+input {
+    color: black;
+    background-color: white;
+    font-size: 18px;
+    line-height: 200%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: none;
+    border-left: none;
+}
+textarea {
+    color: black;
+    background-color: white;
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: none;
+    border-left: none;
+}
diff --git a/tools/EditTextVariations/assets/Theme_Black.css b/tools/EditTextVariations/assets/Theme_Black.css
new file mode 100644
index 0000000..ce663a1
--- /dev/null
+++ b/tools/EditTextVariations/assets/Theme_Black.css
@@ -0,0 +1,56 @@
+<!--
+/*
+**
+** 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.
+*/
+-->
+
+body {
+    background-color: black;
+}
+div.placeholder {
+    color: #a0a0a0;
+    font-size: 18px;
+    margin: 0px 0px -34px 0px;
+    padding: 4px 0px 4px 0px
+}
+div.input {
+    border: none;
+    margin: 4px 0px 4px -8px;
+}
+input {
+    color: black;
+    background-color: white;
+    font-size: 18px;
+    line-height: 200%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: none;
+    border-left: none;
+}
+textarea {
+    color: black;
+    background-color: white;
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: none;
+    border-left: none;
+}
diff --git a/tools/EditTextVariations/assets/Theme_Holo.css b/tools/EditTextVariations/assets/Theme_Holo.css
new file mode 100644
index 0000000..a3afe2e
--- /dev/null
+++ b/tools/EditTextVariations/assets/Theme_Holo.css
@@ -0,0 +1,56 @@
+<!--
+/*
+**
+** 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.
+*/
+-->
+
+body {
+    background-color: #16191C;
+}
+div.placeholder {
+    color: #808080;
+    font-size: 18px;
+    margin: 0px 0px -34px 0px;
+    padding: 4px 0px 4px 0px
+}
+div.input {
+    border: none;
+    margin: 4px 0px 4px -8px;
+}
+input {
+    color: white;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 180%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #5E6063;
+    border-left: none;
+}
+textarea {
+    color: white;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #5E6063;
+    border-left: none;
+}
diff --git a/tools/EditTextVariations/assets/Theme_Holo_Light.css b/tools/EditTextVariations/assets/Theme_Holo_Light.css
new file mode 100644
index 0000000..fb3a83c
--- /dev/null
+++ b/tools/EditTextVariations/assets/Theme_Holo_Light.css
@@ -0,0 +1,56 @@
+<!--
+/*
+**
+** 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.
+*/
+-->
+
+body {
+    background-color: #F2F2F2;
+}
+div.placeholder {
+    color: #808080;
+    font-size: 18px;
+    margin: 0px 0px -34px 0px;
+    padding: 4px 0px 4px 0px
+}
+div.input {
+    border: none;
+    margin: 4px 0px 4px -8px;
+}
+input {
+    color: black;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #808080;
+    border-left: none;
+}
+textarea {
+    color: black;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #808080;
+    border-left: none;
+}
diff --git a/tools/EditTextVariations/assets/Theme_Light.css b/tools/EditTextVariations/assets/Theme_Light.css
new file mode 100644
index 0000000..4cce0a0
--- /dev/null
+++ b/tools/EditTextVariations/assets/Theme_Light.css
@@ -0,0 +1,56 @@
+<!--
+/*
+**
+** 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.
+*/
+-->
+
+body {
+    background-color: #f3f3f3;
+}
+div.placeholder {
+    color: #a0a0a0;
+    font-size: 18px;
+    margin: 0px 0px -34px 0px;
+    padding: 4px 0px 4px 0px
+}
+div.input {
+    border: none;
+    margin: 4px 0px 4px -8px;
+}
+input {
+    color: black;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 200%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: 1px solid #808080;
+    border-right: 1px solid rgba(0, 0, 0, 0.5);
+    border-bottom: 1px solid #808080;
+    border-left: 1px solid rgba(0, 0, 0, 0.5);
+}
+textarea {
+    color: black;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: 1px solid #808080;
+    border-right: 1px solid rgba(0, 0, 0, 0.5);
+    border-bottom: 1px solid #808080;
+    border-left: 1px solid rgba(0, 0, 0, 0.5);
+}
diff --git a/tools/EditTextVariations/assets/Theme_Material.css b/tools/EditTextVariations/assets/Theme_Material.css
new file mode 100644
index 0000000..3581a88
--- /dev/null
+++ b/tools/EditTextVariations/assets/Theme_Material.css
@@ -0,0 +1,56 @@
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+body {
+    background-color: #212121;
+}
+div.placeholder {
+    color: #909090;
+    font-size: 18px;
+    margin: 0px 0px -34px 0px;
+    padding: 4px 0px 4px 0px
+}
+div.input {
+    border: none;
+    margin: 4px 0px 4px -8px;
+}
+input {
+    color: white;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 180%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #757575;
+    border-left: none;
+}
+textarea {
+    color: white;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #757575;
+    border-left: none;
+}
diff --git a/tools/EditTextVariations/assets/Theme_Material_Light.css b/tools/EditTextVariations/assets/Theme_Material_Light.css
new file mode 100644
index 0000000..1a78a2d
--- /dev/null
+++ b/tools/EditTextVariations/assets/Theme_Material_Light.css
@@ -0,0 +1,56 @@
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+body {
+    background-color: #FAFAFA;
+}
+div.placeholder {
+    color: #7D7D7D;
+    font-size: 18px;
+    margin: 0px 0px -34px 0px;
+    padding: 4px 0px 4px 0px
+}
+div.input {
+    border: none;
+    margin: 4px 0px 4px -8px;
+}
+input {
+    color: white;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 180%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #737373;
+    border-left: none;
+}
+textarea {
+    color: white;
+    background-color: rgba(0, 0, 0, 0.0);
+    font-size: 18px;
+    line-height: 150%;
+    vertical-align: center;
+    padding-left: 8px;
+    border-top: none;
+    border-right: none;
+    border-bottom: 1px solid #737373;
+    border-left: none;
+}
diff --git a/tools/EditTextVariations/assets/webview.html b/tools/EditTextVariations/assets/webview.html
new file mode 100644
index 0000000..daf0fdb
--- /dev/null
+++ b/tools/EditTextVariations/assets/webview.html
@@ -0,0 +1,96 @@
+<!--
+/*
+**
+** 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.
+*/
+-->
+
+<html>
+    <head>
+        <script type="text/javascript">
+            (function(d, name) {
+                var css = document.createElement('link');
+                css.rel = 'stylesheet';
+                css.href = name + ".css";
+                d.head.appendChild(css);
+            })(document, theme.name());
+        </script>
+    </head>
+    <body>
+    <div
+        class="input"
+        style="margin-top:-8px"
+    >
+        <input
+            type="text"
+            size="80%"
+            name="webtext"
+            placeholder="&lt;input type=&quot;text&quot;/&gt;" />
+    </div>
+    <div class="input">
+        <input
+            type="email"
+            size="80%"
+            name="webemail"
+            placeholder="&lt;input type=&quot;email&quot;/&gt;" />
+    </div>
+    <div class="input">
+        <input
+            type="password"
+            size="80%"
+            name="webpassword"
+            placeholder="&lt;input type=&quot;password&quot;/&gt;" />
+    </div>
+    <div class="input">
+        <input
+            type="url"
+            size="80%"
+            name="weburl"
+            placeholder="&lt;input type=&quot;url&quot;/&gt;" />
+    </div>
+    <div class="input">
+        <input
+            type="number"
+            size="80%"
+            name="webnumber"
+            placeholder="&lt;input type=&quot;number&quot;/&gt;" />
+    </div>
+    <div class="input">
+        <input
+            type="tel"
+            size="80%"
+            name="webtel"
+            placeholder="&lt;input type=&quot;tel&quot;/&gt;" />
+    </div>
+    <div class="input">
+        <input
+            type="search"
+            size="80%"
+            name="websearch"
+            placeholder="&lt;input type=&quot;search&quot;/&gt;" />
+    </div>
+    <div
+        class="input"
+        style="margin-bottom:-4px"
+    >
+        <textarea
+            rows="2"
+            cols="80%"
+            name="webtextarea"
+            placeholder="&lt;textarea&gt;&lt/textarea&gt;"
+        ></textarea>
+    </div>
+  </body>
+</html>
diff --git a/tools/EditTextVariations/res/drawable-hdpi/ic_launcher.png b/tools/EditTextVariations/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..e0923a6
--- /dev/null
+++ b/tools/EditTextVariations/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/tools/EditTextVariations/res/drawable-mdpi/ic_launcher.png b/tools/EditTextVariations/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..9bc0914
--- /dev/null
+++ b/tools/EditTextVariations/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/tools/EditTextVariations/res/drawable-xhdpi/ic_launcher.png b/tools/EditTextVariations/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..d60ac3d
--- /dev/null
+++ b/tools/EditTextVariations/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/tools/EditTextVariations/res/drawable-xxhdpi/ic_launcher.png b/tools/EditTextVariations/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..f3069d7
--- /dev/null
+++ b/tools/EditTextVariations/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/tools/EditTextVariations/res/layout/main.xml b/tools/EditTextVariations/res/layout/main.xml
new file mode 100644
index 0000000..99abfb0
--- /dev/null
+++ b/tools/EditTextVariations/res/layout/main.xml
@@ -0,0 +1,298 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+>
+    <LinearLayout
+        android:id="@+id/edit_text_list"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+    >
+        <EditText
+            android:id="@+id/text_multi_lines_none"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textMultiLine|textAutoCorrect"
+            android:imeOptions="actionUnspecified" />
+        <EditText
+            android:id="@+id/text_multi_lines_send"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textMultiLine|textAutoCorrect"
+            android:imeOptions="actionSend" />
+        <view
+            class="com.android.inputmethod.tools.edittextvariations.MultiLineShortMessageEditText"
+            android:id="@+id/text_short_message_send_multi_lines"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textShortMessage|textMultiLine|textAutoCorrect|textCapSentences"
+            android:imeOptions="actionSend" />
+        <view
+            class="com.android.inputmethod.tools.edittextvariations.MultiLineShortMessageEditText"
+            android:id="@+id/text_multi_lines_search"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
+            android:imeOptions="actionSearch" />
+        <EditText
+            android:id="@+id/text_short_message_send"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textShortMessage|textAutoCorrect|textCapSentences"
+            android:imeOptions="actionSend" />
+        <EditText
+            android:id="@+id/text_autocap_none"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textAutoCorrect|textCapSentences"
+            android:imeOptions="actionNone" />
+        <EditText
+            android:id="@+id/text_autocap_send"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textAutoCorrect|textCapSentences"
+            android:imeOptions="actionSend" />
+        <EditText
+            android:id="@+id/text_uri_go"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textUri"
+            android:imeOptions="actionGo" />
+        <EditText
+            android:id="@+id/text_email_address_done"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textEmailAddress"
+            android:imeOptions="actionDone" />
+        <EditText
+            android:id="@+id/text_auto_correct_search"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textAutoCorrect"
+            android:imeOptions="actionSearch" />
+        <EditText
+            android:id="@+id/text_auto_correct_next"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textAutoCorrect"
+            android:imeOptions="actionNext" />
+        <EditText
+            android:id="@+id/text_auto_correct_previous"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textAutoCorrect" />
+        <EditText
+            android:id="@+id/text_auto_correct_custom"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textAutoCorrect"
+            android:imeActionLabel="@string/custom_action_label"
+            android:imeActionId="100" />
+        <EditText
+            android:id="@+id/phone"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="phone" />
+        <EditText
+            android:id="@+id/phone_no_action"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="phone"
+            android:imeOptions="actionNone" />
+        <EditText
+            android:id="@+id/number_send"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="number"
+            android:imeOptions="actionSend" />
+        <EditText
+            android:id="@+id/number_no_action"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="number"
+            android:imeOptions="actionNone" />
+        <EditText
+            android:id="@+id/text_password_next"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textPassword"
+            android:imeOptions="actionNext" />
+        <EditText
+            android:id="@+id/text_visible_password_done"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textVisiblePassword"
+            android:imeOptions="actionDone" />
+        <EditText
+            android:id="@+id/number_password_send"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="numberPassword"
+            android:imeOptions="actionDone" />
+        <EditText
+            android:id="@+id/text_no_suggestions"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textNoSuggestions"
+            android:imeOptions="actionGo" />
+        <EditText
+            android:id="@+id/text_no_auto_correction"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textShortMessage"
+            android:imeOptions="actionDone" />
+        <WebView
+            android:id="@+id/web_view"
+            android:layout_width="fill_parent"
+            android:layout_height="380sp"
+            android:focusable="true" />
+        <EditText
+            android:id="@+id/text_cap_characters_with_auto_correction"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textCapCharacters|textAutoCorrect" />
+        <EditText
+            android:id="@+id/text_cap_words_with_auto_correction"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textCapWords|textAutoCorrect" />
+        <EditText
+            android:id="@+id/text_cap_sentences_with_auto_correction"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textCapSentences|textAutoCorrect" />
+        <EditText
+            android:id="@+id/text_cap_characters"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textCapCharacters" />
+        <EditText
+            android:id="@+id/text_cap_words"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textCapWords" />
+        <EditText
+            android:id="@+id/text_cap_sentences"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textCapSentences" />
+        <EditText
+            android:id="@+id/text_email_subject"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textEmailSubject" />
+        <EditText
+            android:id="@+id/text_personal_name"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textPersonName" />
+        <EditText
+            android:id="@+id/text_postal_address"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textPostalAddress" />
+        <EditText
+            android:id="@+id/text_phonetic"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textPhonetic" />
+        <EditText
+            android:id="@+id/number_signed"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="numberSigned" />
+        <EditText
+            android:id="@+id/number_decimal"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="numberDecimal" />
+        <EditText
+            android:id="@+id/number_signed_decimal"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="numberSigned|numberDecimal" />
+        <EditText
+            android:id="@+id/date_time"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="datetime" />
+        <EditText
+            android:id="@+id/date"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="date" />
+        <EditText
+            android:id="@+id/time"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="time" />
+        <EditText
+            android:id="@+id/text_no_extract_ui"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="text"
+            android:imeOptions="flagNoExtractUi" />
+        <EditText
+            android:id="@+id/text_no_fullscreen"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textCapSentences"
+            android:imeOptions="flagNoFullscreen" />
+        <EditText
+            android:id="@+id/text_nm"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="text"
+            android:privateImeOptions="nm" />
+        <EditText
+            android:id="@+id/text_force_ascii_flag"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="text" />
+        <AutoCompleteTextView
+            android:id="@+id/text_app_completion"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content" />
+        <AutoCompleteTextView
+            android:id="@+id/text_app_completion_no_fullscreen"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:imeOptions="flagNoFullscreen" />
+        <AutoCompleteTextView
+            android:id="@+id/text_app_compeletion_no_extract_ui"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:imeOptions="flagNoExtractUi" />
+        <EditText
+            android:id="@+id/text_restarting"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="text" />
+        <EditText
+            android:id="@+id/text_null"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="none" />
+    </LinearLayout>
+</ScrollView>
diff --git a/tools/EditTextVariations/res/values-v11/donottranslate.xml b/tools/EditTextVariations/res/values-v11/donottranslate.xml
new file mode 100644
index 0000000..5b7eb23
--- /dev/null
+++ b/tools/EditTextVariations/res/values-v11/donottranslate.xml
@@ -0,0 +1,23 @@
+<?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>
+    <string name="default_theme">Theme_Holo_Light</string>
+</resources>
diff --git a/tools/EditTextVariations/res/values-v14/themes.xml b/tools/EditTextVariations/res/values-v14/themes.xml
new file mode 100644
index 0000000..22c6016
--- /dev/null
+++ b/tools/EditTextVariations/res/values-v14/themes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <style name="defaultActivityTheme" parent="@android:style/Theme.DeviceDefault.Light" />
+</resources>
diff --git a/tools/EditTextVariations/res/values-v27/themes.xml b/tools/EditTextVariations/res/values-v27/themes.xml
new file mode 100644
index 0000000..8fd3aae
--- /dev/null
+++ b/tools/EditTextVariations/res/values-v27/themes.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <style name="defaultActivityTheme" parent="@android:style/Theme.DeviceDefault.Light">
+        <item name="android:navigationBarColor">@android:color/white</item>
+        <item name="android:navigationBarDividerColor">#1f000000</item>
+        <item name="android:windowLightNavigationBar">true</item>
+    </style>
+</resources>
diff --git a/tools/EditTextVariations/res/values/countries.xml b/tools/EditTextVariations/res/values/countries.xml
new file mode 100644
index 0000000..6d7e5c1
--- /dev/null
+++ b/tools/EditTextVariations/res/values/countries.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources>
+    <!-- The list of country names. [CHAR LIMIT=100] -->
+    <string-array name="countries_array">
+        <item>Afghanistan</item>
+        <item>Albania</item>
+        <item>Algeria</item>
+        <item>American Samoa</item>
+        <item>Andorra</item>
+        <item>Angola</item>
+        <item>Anguilla</item>
+        <item>Antarctica</item>
+        <item>Antigua and Barbuda</item>
+        <item>Argentina</item>
+        <item>Armenia</item>
+        <item>Aruba</item>
+        <item>Australia</item>
+        <item>Austria</item>
+        <item>Azerbaijan</item>
+        <item>Bahrain</item>
+        <item>Bangladesh</item>
+        <item>Barbados</item>
+        <item>Belarus</item>
+        <item>Belgium</item>
+        <item>Belize</item>
+        <item>Benin</item>
+        <item>Bermuda</item>
+        <item>Bhutan</item>
+        <item>Bolivia</item>
+        <item>Bosnia and Herzegovina</item>
+        <item>Botswana</item>
+        <item>Bouvet Island</item>
+        <item>Brazil</item>
+        <item>British Indian Ocean Territory</item>
+        <item>British Virgin Islands</item>
+        <item>Brunei</item>
+        <item>Bulgaria</item>
+        <item>Burkina Faso</item>
+        <item>Burundi</item>
+        <item>"Cote d'Ivoire"</item>
+        <item>Cambodia</item>
+        <item>Cameroon</item>
+        <item>Canada</item>
+        <item>Cape Verde</item>
+        <item>Cayman Islands</item>
+        <item>Central African Republic</item>
+        <item>Chad</item>
+        <item>Chile</item>
+        <item>China</item>
+        <item>Christmas Island</item>
+        <item>Cocos (Keeling) Islands</item>
+        <item>Colombia</item>
+        <item>Comoros</item>
+        <item>Congo</item>
+        <item>Cook Islands</item>
+        <item>Costa Rica</item>
+        <item>Croatia</item>
+        <item>Cuba</item>
+        <item>Cyprus</item>
+        <item>Czech Republic</item>
+        <item>Democratic Republic of the Congo</item>
+        <item>Denmark</item>
+        <item>Djibouti</item>
+        <item>Dominica</item>
+        <item>Dominican Republic</item>
+        <item>East Timor</item>
+        <item>Ecuador</item>
+        <item>Egypt</item>
+        <item>El Salvador</item>
+        <item>Equatorial Guinea</item>
+        <item>Eritrea</item>
+        <item>Estonia</item>
+        <item>Ethiopia</item>
+        <item>Faeroe Islands</item>
+        <item>Falkland Islands</item>
+        <item>Fiji</item>
+        <item>Finland</item>
+        <item>Republic of Macedonia</item>
+        <item>France</item>
+        <item>French Guiana</item>
+        <item>French Polynesia</item>
+        <item>French Southern Territories</item>
+        <item>Gabon</item>
+        <item>Georgia</item>
+        <item>Germany</item>
+        <item>Ghana</item>
+        <item>Gibraltar</item>
+        <item>Greece</item>
+        <item>Greenland</item>
+        <item>Grenada</item>
+        <item>Guadeloupe</item>
+        <item>Guam</item>
+        <item>Guatemala</item>
+        <item>Guinea</item>
+        <item>Guinea-Bissau</item>
+        <item>Guyana</item>
+        <item>Haiti</item>
+        <item>Heard Island and McDonald Islands</item>
+        <item>Honduras</item>
+        <item>Hong Kong</item>
+        <item>Hungary</item>
+        <item>Iceland</item>
+        <item>India</item>
+        <item>Indonesia</item>
+        <item>Iran</item>
+        <item>Iraq</item>
+        <item>Ireland</item>
+        <item>Israel</item>
+        <item>Italy</item>
+        <item>Jamaica</item>
+        <item>Japan</item>
+        <item>Jordan</item>
+        <item>Kazakhstan</item>
+        <item>Kenya</item>
+        <item>Kiribati</item>
+        <item>Kuwait</item>
+        <item>Kyrgyzstan</item>
+        <item>Laos</item>
+        <item>Latvia</item>
+        <item>Lebanon</item>
+        <item>Lesotho</item>
+        <item>Liberia</item>
+        <item>Libya</item>
+        <item>Liechtenstein</item>
+        <item>Lithuania</item>
+        <item>Luxembourg</item>
+        <item>Macau</item>
+        <item>Madagascar</item>
+        <item>Malawi</item>
+        <item>Malaysia</item>
+        <item>Maldives</item>
+        <item>Mali</item>
+        <item>Malta</item>
+        <item>Marshall Islands</item>
+        <item>Martinique</item>
+        <item>Mauritania</item>
+        <item>Mauritius</item>
+        <item>Mayotte</item>
+        <item>Mexico</item>
+        <item>Micronesia</item>
+        <item>Moldova</item>
+        <item>Monaco</item>
+        <item>Mongolia</item>
+        <item>Montserrat</item>
+        <item>Morocco</item>
+        <item>Mozambique</item>
+        <item>Myanmar</item>
+        <item>Namibia</item>
+        <item>Nauru</item>
+        <item>Nepal</item>
+        <item>Netherlands</item>
+        <item>Netherlands Antilles</item>
+        <item>New Caledonia</item>
+        <item>New Zealand</item>
+        <item>Nicaragua</item>
+        <item>Niger</item>
+        <item>Nigeria</item>
+        <item>Niue</item>
+        <item>Norfolk Island</item>
+        <item>North Korea</item>
+        <item>Northern Marianas</item>
+        <item>Norway</item>
+        <item>Oman</item>
+        <item>Pakistan</item>
+        <item>Palau</item>
+        <item>Panama</item>
+        <item>Papua New Guinea</item>
+        <item>Paraguay</item>
+        <item>Peru</item>
+        <item>Philippines</item>
+        <item>Pitcairn Islands</item>
+        <item>Poland</item>
+        <item>Portugal</item>
+        <item>Puerto Rico</item>
+        <item>Qatar</item>
+        <item>Reunion</item>
+        <item>Romania</item>
+        <item>Russia</item>
+        <item>Rwanda</item>
+        <item>Sao Tome and Principe</item>
+        <item>Saint Helena</item>
+        <item>Saint Kitts and Nevis</item>
+        <item>Saint Lucia</item>
+        <item>Saint Pierre and Miquelon</item>
+        <item>Saint Vincent and the Grenadines</item>
+        <item>Samoa</item>
+        <item>San Marino</item>
+        <item>Saudi Arabia</item>
+        <item>Senegal</item>
+        <item>Seychelles</item>
+        <item>Sierra Leone</item>
+        <item>Singapore</item>
+        <item>Slovakia</item>
+        <item>Slovenia</item>
+        <item>Solomon Islands</item>
+        <item>Somalia</item>
+        <item>South Africa</item>
+        <item>South Georgia and the South Sandwich Islands</item>
+        <item>South Korea</item>
+        <item>Spain</item>
+        <item>Sri Lanka</item>
+        <item>Sudan</item>
+        <item>Suriname</item>
+        <item>Svalbard and Jan Mayen</item>
+        <item>Swaziland</item>
+        <item>Sweden</item>
+        <item>Switzerland</item>
+        <item>Syria</item>
+        <item>Taiwan</item>
+        <item>Tajikistan</item>
+        <item>Tanzania</item>
+        <item>Thailand</item>
+        <item>The Bahamas</item>
+        <item>The Gambia</item>
+        <item>Togo</item>
+        <item>Tokelau</item>
+        <item>Tonga</item>
+        <item>Trinidad and Tobago</item>
+        <item>Tunisia</item>
+        <item>Turkey</item>
+        <item>Turkmenistan</item>
+        <item>Turks and Caicos Islands</item>
+        <item>Tuvalu</item>
+        <item>Virgin Islands</item>
+        <item>Uganda</item>
+        <item>Ukraine</item>
+        <item>United Arab Emirates</item>
+        <item>United Kingdom</item>
+        <item>United States</item>
+        <item>United States Minor Outlying Islands</item>
+        <item>Uruguay</item>
+        <item>Uzbekistan</item>
+        <item>Vanuatu</item>
+        <item>Vatican City</item>
+        <item>Venezuela</item>
+        <item>Vietnam</item>
+        <item>Wallis and Futuna</item>
+        <item>Western Sahara</item>
+        <item>Yemen</item>
+        <item>Zambia</item>
+        <item>Zimbabwe</item>
+        <item>Yemen</item>
+    </string-array>
+</resources>
diff --git a/tools/EditTextVariations/res/values/strings.xml b/tools/EditTextVariations/res/values/strings.xml
new file mode 100644
index 0000000..02387f2
--- /dev/null
+++ b/tools/EditTextVariations/res/values/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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">
+    <!-- This test application name. -->
+    <string name="app_name" translatable="false">EditTextVariations</string>
+    <!-- The menu title to change color theme of this application. [CHAR LIMIT=20] -->
+    <string name="menu_change_theme">Change Theme</string>
+    <!-- The menu title to display the version name of this application. [CHAR LIMIT=20] -->
+    <string name="menu_version">Version <xliff:g id="VERSION_NAME" example="0.56">%s</xliff:g></string>
+    <!-- The menu title to turn on the text field focus navigation. [CHAR LIMIT=20] -->
+    <string name="menu_navigate_on" translatable="false">Navigate On</string>
+    <!-- The menu title to turn off the text field focus navigation. [CHAR LIMIT=20] -->
+    <string name="menu_navigate_off" translatable="false">Navigate Off</string>
+    <!-- The menu title to show software keyboard when the application is launched. [CHAR LIMIT=20] -->
+    <string name="menu_softinput_visible" translatable="false">Keyboard Visible</string>
+    <!-- The menu title to stay hidden software keyboard when the application is launched. [CHAR LIMIT=20] -->
+    <string name="menu_softinput_hidden" translatable="false">Keyboard Hidden</string>
+    <!-- The example of custom action key label. Must be short to fit on key. 5 chars or less is preferable.  [CHAR LIMIT=7] -->
+    <string name="custom_action_label">Custom</string>
+</resources>
diff --git a/tools/EditTextVariations/res/values/themes.xml b/tools/EditTextVariations/res/values/themes.xml
new file mode 100644
index 0000000..036a711
--- /dev/null
+++ b/tools/EditTextVariations/res/values/themes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <style name="defaultActivityTheme" parent="@android:style/Theme.Holo" />
+</resources>
diff --git a/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/EchoingTextWatcher.java b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/EchoingTextWatcher.java
new file mode 100644
index 0000000..1c652c2
--- /dev/null
+++ b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/EchoingTextWatcher.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.tools.edittextvariations;
+
+import android.annotation.SuppressLint;
+import android.os.Handler;
+import android.os.Message;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.widget.EditText;
+
+import java.util.Locale;
+
+final class EchoingTextWatcher implements TextWatcher {
+    private static final int SET_TEXT_DELAY = 500;
+
+    final EditText mEditText;
+    CharSequence mExpected;
+
+    @SuppressLint("HandlerLeak")
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(final Message msg) {
+            final String toBeappended = (String) msg.obj;
+            final CharSequence current = mEditText.getText();
+            final CharSequence newText = TextUtils.concat(current, toBeappended);
+            mExpected = newText;
+            mEditText.setText(newText);
+            mEditText.setSelection(newText.length());
+        }
+    };
+
+    @SuppressWarnings("unused")
+    public static void attachTo(final EditText editText) {
+        final EchoingTextWatcher watcher = new EchoingTextWatcher(editText);
+    }
+
+    public EchoingTextWatcher(final EditText editText) {
+        mEditText = editText;
+        editText.addTextChangedListener(this);
+    }
+
+    @Override
+    public void afterTextChanged(final Editable ss) {
+    }
+
+    @Override
+    public void beforeTextChanged(final CharSequence s, final int start, final int count,
+            final int after) {
+    }
+
+    @Override
+    public void onTextChanged(final CharSequence s, final int start, final int before,
+            final int count) {
+        if (count == 0 || before > 0 || TextUtils.equals(s, mExpected)) {
+            return;
+        }
+        final int len = s.length();
+        if (len > 0) {
+            final String last = s.subSequence(len - 1, len).toString();
+            final char lastChar = last.charAt(0);
+            if (Character.isUpperCase(lastChar)) {
+                final String lowerCase = last.toLowerCase(Locale.getDefault());
+                mHandler.sendMessageDelayed(mHandler.obtainMessage(0, lowerCase), SET_TEXT_DELAY);
+            } else if (Character.isLowerCase(lastChar)) {
+                final String upperCase = last.toUpperCase(Locale.getDefault());
+                mHandler.sendMessageDelayed(mHandler.obtainMessage(0, upperCase), SET_TEXT_DELAY);
+            }
+        }
+    }
+}
diff --git a/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/EditTextVariations.java b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/EditTextVariations.java
new file mode 100644
index 0000000..44e0a4d
--- /dev/null
+++ b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/EditTextVariations.java
@@ -0,0 +1,473 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.tools.edittextvariations;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.text.InputType;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.inputmethod.EditorInfo;
+import android.webkit.JavascriptInterface;
+import android.webkit.WebView;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public final class EditTextVariations extends Activity implements TextView.OnEditorActionListener,
+        DialogInterface.OnClickListener {
+    private static final String TAG = EditTextVariations.class.getSimpleName();
+    private static final boolean DEBUG_INPUT_TEXT = false;
+
+    private static final int MENU_CHANGE_THEME = 0;
+    private static final int MENU_VERSION = 1;
+    private static final int MENU_NAVIGATE_ON = 2;
+    private static final int MENU_NAVIGATE_OFF = 3;
+    private static final int MENU_SOFTINPUT_VISIBLE = 4;
+    private static final int MENU_SOFTINPUT_HIDDEN = 5;
+    private static final String PREF_THEME = "theme";
+    private static final String PREF_NAVIGATE = "navigate";
+    private static final String PREF_SOFTINPUT = "softinput";
+
+    private SharedPreferences prefs;
+    private View[] fields;
+
+    private static final FinalClassField<Integer> ApplicationInfo_FLAG_SUPPORTS_RTL =
+            FinalClassField.newInstance(ApplicationInfo.class, "FLAG_SUPPORTS_RTL", 1 << 22);
+
+    // This flag should be defined IceCreamSandwich and later.
+    // Note that Froyo and Gingerbread have hidden IME_FLAG_NO_FULLSCREEN as
+    // value 0x80000000.
+    private static final FinalClassField<Integer> EditorInfo_IME_FLAG_FORCE_ASCII =
+            FinalClassField.newInstance(EditorInfo.class, "IME_FLAG_FORCE_ASCII",
+                    Build.VERSION.SDK_INT >= /* ICE_CREAM_SANDWICH */14 ? 0x80000000 : 0);
+
+    private ArrayAdapter<String> mAutoCompleteAdapter;
+
+    /** Called when the activity is first created. */
+    @SuppressLint("SetJavaScriptEnabled")
+    @Override
+    public void onCreate(final Bundle savedInstanceState) {
+        getApplicationInfo().flags |= ApplicationInfo_FLAG_SUPPORTS_RTL.value;
+        prefs = PreferenceManager.getDefaultSharedPreferences(this);
+        loadTheme();
+        loadSoftInputMode();
+
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main);
+
+        final String[] countries = getResources().getStringArray(R.array.countries_array);
+        mAutoCompleteAdapter = new ArrayAdapter<>(
+                this, android.R.layout.simple_dropdown_item_1line, countries);
+
+        final boolean navigateMode = getNavigateMode();
+        final ViewGroup vg = (ViewGroup) findViewById(R.id.edit_text_list);
+        final int n = vg.getChildCount();
+        fields = new View[n];
+        for (int i = 0; i < n; i++) {
+            final View v = vg.getChildAt(i);
+            if (v instanceof EditText) {
+                final int id = v.getId();
+                final EditText e = (EditText) v;
+                int inputType = e.getInputType();
+                int imeOptions = e.getImeOptions();
+                if (id == R.id.text_auto_correct_previous) {
+                    imeOptions &= ~EditorInfo.IME_MASK_ACTION;
+                    imeOptions |= EditorInfo.IME_ACTION_PREVIOUS;
+                }
+                if (id == R.id.text_force_ascii_flag) {
+                    imeOptions |= EditorInfo_IME_FLAG_FORCE_ASCII.value;
+                }
+                if (id == R.id.text_null) {
+                    inputType = InputType.TYPE_NULL;
+                }
+                if (id == R.id.text_restarting) {
+                    EchoingTextWatcher.attachTo(e);
+                }
+                if (navigateMode && i > 0) {
+                    imeOptions |= EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS;
+                }
+                if (navigateMode && i < n - 1) {
+                    imeOptions |= EditorInfo.IME_FLAG_NAVIGATE_NEXT;
+                }
+
+                e.setInputType(inputType);
+                e.setImeOptions(imeOptions);
+                setupHintText(e);
+                if (navigateMode) {
+                    e.setOnEditorActionListener(this);
+                }
+            }
+            if (v instanceof AutoCompleteTextView) {
+                final AutoCompleteTextView e = (AutoCompleteTextView) v;
+                e.setAdapter(mAutoCompleteAdapter);
+                e.setThreshold(1);
+            }
+            if (v instanceof WebView) {
+                final WebView wv = (WebView) v;
+                wv.getSettings().setJavaScriptEnabled(true);
+                wv.addJavascriptInterface(new Object() {
+                    @JavascriptInterface
+                    public String name() {
+                        return getThemeName();
+                    }
+                }, "theme");
+                wv.loadUrl("file:///android_asset/webview.html");
+            }
+            fields[i] = v;
+        }
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(final Menu menu) {
+        super.onCreateOptionsMenu(menu);
+
+        menu.add(Menu.NONE, MENU_NAVIGATE_ON, 0, getString(R.string.menu_navigate_on));
+        menu.add(Menu.NONE, MENU_NAVIGATE_OFF, 1, getString(R.string.menu_navigate_off));
+        menu.add(Menu.NONE, MENU_SOFTINPUT_VISIBLE, 2, getString(R.string.menu_softinput_visible));
+        menu.add(Menu.NONE, MENU_SOFTINPUT_HIDDEN, 3, getString(R.string.menu_softinput_hidden));
+        menu.add(Menu.NONE, MENU_CHANGE_THEME, 4, R.string.menu_change_theme);
+        try {
+            final PackageInfo pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
+            menu.add(Menu.NONE, MENU_VERSION, 5,
+                    getString(R.string.menu_version, pinfo.versionName))
+                    .setEnabled(false);
+        } catch (NameNotFoundException e) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(final MenuItem item) {
+        final int itemId = item.getItemId();
+        if (itemId == MENU_CHANGE_THEME) {
+            final List<CharSequence> items = new ArrayList<>();
+            for (final ThemeItem theme : ThemeItem.THEME_LIST) {
+                items.add(theme.name);
+            }
+            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle(R.string.menu_change_theme);
+            builder.setCancelable(true);
+            builder.setNegativeButton(android.R.string.cancel, null);
+            builder.setItems(items.toArray(new CharSequence[items.size()]), this);
+            builder.show();
+        } else if (itemId == MENU_NAVIGATE_ON || itemId == MENU_NAVIGATE_OFF) {
+            saveNavigateMode(itemId == MENU_NAVIGATE_ON);
+            restartActivity();
+        } else if (itemId == MENU_SOFTINPUT_VISIBLE || itemId == MENU_SOFTINPUT_HIDDEN) {
+            saveSoftInputMode(itemId == MENU_SOFTINPUT_VISIBLE);
+            restartActivity();
+        }
+        return true;
+    }
+
+    @Override
+    public void onClick(final DialogInterface dialog, final int which) {
+        saveTheme(ThemeItem.THEME_LIST.get(which));
+        restartActivity();
+    }
+
+    private void restartActivity() {
+        final Intent intent = getIntent();
+        finish();
+        startActivity(intent);
+    }
+
+    private static void setupHintText(final EditText e) {
+        final int imeOptions = e.getImeOptions();
+        String hint = (e instanceof MultiLineShortMessageEditText) ? "*" : "";
+        hint += inputTypeToString(e.getInputType());
+        String text;
+        if (e.getImeActionLabel() != null) {
+            text = "actionLabel<" + e.getImeActionLabel() + ":" + e.getImeActionId() + ">";
+        } else {
+            text = actionName(imeOptions & EditorInfo.IME_MASK_ACTION);
+        }
+        text = appendFlagText(text,
+                (imeOptions & EditorInfo.IME_FLAG_NO_EXTRACT_UI) != 0, "flagNoExtractUi");
+        text = appendFlagText(text,
+                (imeOptions & EditorInfo.IME_FLAG_NO_FULLSCREEN) != 0, "flagNoFullscreen");
+        text = appendFlagText(text,
+                (imeOptions & EditorInfo_IME_FLAG_FORCE_ASCII.value) != 0, "flagForceAscii");
+        text = appendFlagText(text,
+                (imeOptions & EditorInfo.IME_FLAG_NAVIGATE_NEXT) != 0, ">");
+        text = appendFlagText(text,
+                (imeOptions & EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS) != 0, "<");
+        if (text.length() > 0)
+            hint += " " + text;
+        final String privateOptions = e.getPrivateImeOptions();
+        if (!TextUtils.isEmpty(privateOptions)) {
+            hint += " (";
+            String sep = "";
+            for (final String opt : privateOptions.trim().split(",")) {
+                final String[] elem = opt.trim().split("\\.");
+                hint += sep + elem[elem.length - 1];
+                sep = ",";
+            }
+            hint += ")";
+        }
+        if (DEBUG_INPUT_TEXT) {
+            Log.d(TAG, String.format("class=0x%08x variation=0x%08x flags=0x%08x hint=%s",
+                    e.getInputType() & InputType.TYPE_MASK_CLASS,
+                    e.getInputType() & InputType.TYPE_MASK_VARIATION,
+                    e.getInputType() & InputType.TYPE_MASK_FLAGS, hint));
+        }
+        if (e.getId() == R.id.text_restarting) {
+            hint += " restarting";
+        }
+        e.setHint(hint);
+    }
+
+    private void saveBooleanPreference(final String key, final boolean value) {
+        final SharedPreferences.Editor editor = prefs.edit();
+        editor.putBoolean(key, value);
+        editor.apply();
+    }
+
+    private void saveStringPreference(final String key, final String value) {
+        final SharedPreferences.Editor editor = prefs.edit();
+        editor.putString(key, value);
+        editor.apply();
+    }
+
+    private void saveNavigateMode(final boolean enabled) {
+        saveBooleanPreference(PREF_NAVIGATE, enabled);
+    }
+
+    private boolean getNavigateMode() {
+        return prefs.getBoolean(PREF_NAVIGATE, false);
+    }
+
+    private void saveSoftInputMode(final boolean visible) {
+        saveBooleanPreference(PREF_SOFTINPUT, visible);
+    }
+
+    private void loadSoftInputMode() {
+        final boolean visible = prefs.getBoolean(PREF_SOFTINPUT, false);
+        final Window w = getWindow();
+        w.setSoftInputMode(visible
+                ? WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
+                : WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
+    }
+
+    private void saveTheme(final ThemeItem theme) {
+        saveStringPreference(PREF_THEME, theme.name);
+    }
+
+    String getThemeName() {
+        return prefs.getString(PREF_THEME, ThemeItem.getDefaultThemeName());
+    }
+
+    private void loadTheme() {
+        final String themeName = getThemeName();
+        for (final ThemeItem theme : ThemeItem.THEME_LIST) {
+            if (themeName.equals(theme.name)) {
+                setTheme(theme.id);
+                return;
+            }
+        }
+    }
+
+    @Override
+    public boolean onEditorAction(final TextView v, final int action, final KeyEvent event) {
+        for (int i = 0; i < fields.length; i++) {
+            if (v == fields[i]) {
+                final int direction;
+                if (action == EditorInfo.IME_ACTION_PREVIOUS) {
+                    direction = -1;
+                } else {
+                    direction = +1;
+                }
+
+                final int target = i + direction;
+                if (target < 0 || target >= fields.length)
+                    return false;
+
+                final View targetView = fields[target];
+                targetView.requestFocus();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static String actionName(final int action) {
+        switch (action & EditorInfo.IME_MASK_ACTION) {
+        case EditorInfo.IME_ACTION_UNSPECIFIED:
+            return "actionUnspecified";
+        case EditorInfo.IME_ACTION_NONE:
+            return "actionNone";
+        case EditorInfo.IME_ACTION_GO:
+            return "actionGo";
+        case EditorInfo.IME_ACTION_SEARCH:
+            return "actionSearch";
+        case EditorInfo.IME_ACTION_SEND:
+            return "actionSend";
+        case EditorInfo.IME_ACTION_NEXT:
+            return "actionNext";
+        case EditorInfo.IME_ACTION_DONE:
+            return "actionDone";
+        case EditorInfo.IME_ACTION_PREVIOUS:
+            return "actionPrevious";
+        default:
+            return "actionUnknown(" + action + ")";
+        }
+    }
+
+    private static String inputTypeToString(final int inputType) {
+        if (inputType == InputType.TYPE_NULL) {
+            return "TYPE_NULL";
+        }
+        final int clazz = inputType & InputType.TYPE_MASK_CLASS;
+        final int variation = inputType & InputType.TYPE_MASK_VARIATION;
+        final int flags = inputType & InputType.TYPE_MASK_FLAGS;
+        String base = "unknown(class=" + clazz + " variation=" + variation + " flag=0x"
+                + Integer.toHexString(flags);
+
+        switch (clazz) {
+        case InputType.TYPE_CLASS_TEXT:
+            switch (variation) {
+            case InputType.TYPE_TEXT_VARIATION_NORMAL:
+                base = "text";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_URI:
+                base = "textUri";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+                base = "textEmailAddress";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT:
+                base = "textEmailSubject";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE:
+                base = "textShortMessage";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE:
+                base = "textLongMessage";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_PERSON_NAME:
+                base = "textPersonName";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS:
+                base = "textPostalAddress";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_PASSWORD:
+                base = "textPassword";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+                base = "textVisiblePassword";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT:
+                base = "textWebEditText";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_FILTER:
+                base = "textFilter";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_PHONETIC:
+                base = "textPhonetic";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+                base = "textWebEmailAddress";
+                break;
+            case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+                base = "textWebPassword";
+                break;
+            }
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS) != 0,
+                    "textCapCharacters");
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_CAP_WORDS) != 0,
+                    "textCapWords");
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_CAP_SENTENCES) != 0,
+                    "textCapSentences");
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) != 0,
+                    "textAutoCorrect");
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0,
+                    "textAutoComplete");
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_MULTI_LINE) != 0,
+                    "textMultiLine");
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE) != 0,
+                    "textImeMultiLine");
+            base = appendFlagText(base, (flags & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0,
+                    "textNoSuggestions");
+            break;
+
+        case InputType.TYPE_CLASS_NUMBER:
+            if (variation == InputType.TYPE_NUMBER_VARIATION_NORMAL) {
+                base = "number";
+            } else if (variation == InputType.TYPE_NUMBER_VARIATION_PASSWORD) {
+                base = "numberPassword";
+            }
+            base = appendFlagText(base, (flags & InputType.TYPE_NUMBER_FLAG_SIGNED) != 0,
+                    "numberSigned");
+            base = appendFlagText(base, (flags & InputType.TYPE_NUMBER_FLAG_DECIMAL) != 0,
+                    "numberDecimal");
+            break;
+
+        case InputType.TYPE_CLASS_PHONE:
+            base = "phone";
+            break;
+
+        case InputType.TYPE_CLASS_DATETIME:
+            switch (variation) {
+            case InputType.TYPE_DATETIME_VARIATION_NORMAL:
+                base = "datetime";
+                break;
+            case InputType.TYPE_DATETIME_VARIATION_DATE:
+                base = "date";
+                break;
+            case InputType.TYPE_DATETIME_VARIATION_TIME:
+                base = "time";
+                break;
+            }
+            break;
+        }
+
+        return base;
+    }
+
+    private static String appendFlagText(final String text, final boolean flag, final String name) {
+        if (flag) {
+            if (text.length() == 0 || name.startsWith(text))
+                return name;
+            return text + "|" + name;
+        }
+        return text;
+    }
+}
diff --git a/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/FinalClassField.java b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/FinalClassField.java
new file mode 100644
index 0000000..14c556a
--- /dev/null
+++ b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/FinalClassField.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.tools.edittextvariations;
+
+import java.lang.reflect.Field;
+
+public final class FinalClassField<T> {
+    public final boolean defined;
+    public final String name;
+    public final String className;
+    public final T value;
+
+    @SuppressWarnings("unchecked")
+    private FinalClassField(final Field field, final String className, final String fieldName,
+            final T compatValue) {
+        this.defined = field != null;
+        this.name = fieldName;
+        this.className = className;
+        T v = null;
+        try {
+            final Object obj = field.get(null);
+            v = (T) obj;
+        } catch (final Exception e) {
+            v = compatValue;
+        }
+        this.value = v;
+    }
+
+    public static <T> FinalClassField<T> newInstance(final Class<?> definedClass, final String name,
+            final T compatValue) {
+        if (definedClass == null)
+            throw new NullPointerException("defined class");
+        String className = definedClass.getCanonicalName();
+        try {
+            return new FinalClassField<>(
+                    definedClass.getField(name), className, name, compatValue);
+        } catch (Exception e) {
+            return new FinalClassField<>(null, className, name, compatValue);
+        }
+    }
+
+    public static <T> FinalClassField<T> newInstance(final String className, final String fieldName,
+            final T compatValue) {
+        try {
+            return newInstance(Class.forName(className), fieldName, compatValue);
+        } catch (ClassNotFoundException e) {
+            return new FinalClassField<>(null, className, fieldName, compatValue);
+        }
+    }
+}
diff --git a/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/InstanceMethod.java b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/InstanceMethod.java
new file mode 100644
index 0000000..05dc0d6
--- /dev/null
+++ b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/InstanceMethod.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.android.inputmethod.tools.edittextvariations;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public final class InstanceMethod {
+    public final boolean defined;
+    public final String name;
+    public final String className;
+
+    private final Class<?> clazz;
+    private final Method method;
+
+    private InstanceMethod(final Class<?> receiverClass, final Method instanceMethod,
+            final String receiverName, final String methodName) {
+        this.defined = instanceMethod != null;
+        this.clazz = receiverClass;
+        this.method = instanceMethod;
+        this.name = methodName;
+        this.className = receiverName;
+    }
+
+    public Object invoke(final Object receiverObject, final Object... args) {
+        if (!defined)
+            throw new RuntimeException("method " + name + " not defined");
+        if (receiverObject == null)
+            throw new NullPointerException("receiver object");
+        if (clazz.isInstance(receiverObject)) {
+            try {
+                if (args.length == 0) {
+                    return method.invoke(receiverObject);
+                }
+                return method.invoke(clazz, args);
+            } catch (IllegalArgumentException e) {
+                throw new RuntimeException("IllegalArgumentException");
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException("IllegalAccessException");
+            } catch (InvocationTargetException e) {
+                throw new RuntimeException("InvocationTargetException");
+            }
+        }
+        throw new RuntimeException("receiver type not matched: method=" + name
+                + " actual receiver=" + receiverObject.getClass().getCanonicalName());
+    }
+
+    public static InstanceMethod newInstance(final Class<?> receiverClass, final String methodName,
+            final Class<?>... parameterTypes) {
+        if (receiverClass == null)
+            throw new NullPointerException("receiver class");
+        final String className = receiverClass.getCanonicalName();
+        try {
+            return new InstanceMethod(receiverClass,
+                    receiverClass.getMethod(methodName, parameterTypes), className, methodName);
+        } catch (Exception e) {
+            return new InstanceMethod(receiverClass, null, className, methodName);
+        }
+    }
+
+    public static InstanceMethod newInstance(final String className, final String methodName,
+            final Class<?>... parameterTypes) {
+        try {
+            return newInstance(Class.forName(className), methodName, parameterTypes);
+        } catch (ClassNotFoundException e) {
+            return new InstanceMethod(null, null, className, methodName);
+        }
+    }
+}
diff --git a/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/MultiLineShortMessageEditText.java b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/MultiLineShortMessageEditText.java
new file mode 100644
index 0000000..7ab7007
--- /dev/null
+++ b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/MultiLineShortMessageEditText.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.tools.edittextvariations;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.widget.EditText;
+
+public final class MultiLineShortMessageEditText extends EditText {
+
+    public MultiLineShortMessageEditText(final Context context) {
+        super(context);
+    }
+
+    public MultiLineShortMessageEditText(final Context context, final AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MultiLineShortMessageEditText(final Context context, final AttributeSet attrs,
+            final int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    @Override
+    public InputConnection onCreateInputConnection(final EditorInfo outAttrs) {
+        final InputConnection ic = super.onCreateInputConnection(outAttrs);
+        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
+        return ic;
+    }
+}
diff --git a/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/ThemeItem.java b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/ThemeItem.java
new file mode 100644
index 0000000..f3c6d4f
--- /dev/null
+++ b/tools/EditTextVariations/src/com/android/inputmethod/tools/edittextvariations/ThemeItem.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.android.inputmethod.tools.edittextvariations;
+
+import android.os.Build;
+
+import com.android.inputmethod.tools.edittextvariations.R;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class ThemeItem {
+    public final int id;
+    public final String name;
+
+    private ThemeItem(final String name, final int resId) {
+        this.id = resId;
+        this.name = name;
+    }
+
+    private static final String THEME_DEFAULT = "Default";
+    private static final String THEME_HOLO = "Theme_Holo";
+    private static final String THEME_HOLO_LIGHT = "Theme_Holo_Light";
+    private static final String THEME_DEVICE_DEFAULT = "Theme_DeviceDefault";
+    private static final String THEME_DEVICE_DEFAULT_LIGHT = "Theme_DeviceDefault_Light";
+    private static final String THEME_MATERIAL = "Theme_Material";
+    private static final String THEME_MATERIAL_LIGHT = "Theme_Material_Light";
+
+    public static String getDefaultThemeName() {
+        return THEME_DEFAULT;
+    }
+
+    public static final List<ThemeItem> THEME_LIST = createThemeList(
+            THEME_HOLO, THEME_HOLO_LIGHT, THEME_DEVICE_DEFAULT, THEME_DEVICE_DEFAULT_LIGHT,
+            THEME_MATERIAL, THEME_MATERIAL_LIGHT);
+
+    private static List<ThemeItem> createThemeList(final String... candidateList) {
+        final ArrayList<ThemeItem> list = new ArrayList<>();
+
+        // Default theme is always available as it's defined in our resource.
+        list.add(new ThemeItem(THEME_DEFAULT, R.style.defaultActivityTheme));
+
+        for (final String name : candidateList) {
+            final FinalClassField<Integer> constant =
+                    FinalClassField.newInstance(android.R.style.class, name, 0);
+            if (constant.defined) {
+                list.add(new ThemeItem(name, constant.value));
+            }
+        }
+
+        return Collections.unmodifiableList(list);
+    }
+}