Merge "Add content description to the voice key"
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 290ab50..769a1d9 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -218,7 +218,12 @@
         <attr name="iconSettingsKey" format="reference" />
         <attr name="iconSpaceKey" format="reference" />
         <attr name="iconEnterKey" format="reference" />
+        <attr name="iconGoKey" format="reference" />
         <attr name="iconSearchKey" format="reference" />
+        <attr name="iconSendKey" format="reference" />
+        <attr name="iconNextKey" format="reference" />
+        <attr name="iconDoneKey" format="reference" />
+        <attr name="iconPreviousKey" format="reference" />
         <attr name="iconTabKey" format="reference" />
         <attr name="iconShortcutKey" format="reference" />
         <attr name="iconSpaceKeyForNumberLayout" format="reference" />
diff --git a/java/res/values/keyboard-icons-lmp.xml b/java/res/values/keyboard-icons-lmp.xml
index a9cbabc..39e0fe3 100644
--- a/java/res/values/keyboard-icons-lmp.xml
+++ b/java/res/values/keyboard-icons-lmp.xml
@@ -26,7 +26,13 @@
         <item name="iconSettingsKey">@drawable/sym_keyboard_settings_holo_dark</item>
         <item name="iconSpaceKey">@drawable/sym_keyboard_space_holo_dark</item>
         <item name="iconEnterKey">@drawable/sym_keyboard_return_holo_dark</item>
+        <!-- TODO: Uncomment those icon definitions once we have those icon assets. -->
+        <!-- <item name="iconGoKey">@drawable/sym_keyboard_go_holo_dark</item> -->
         <item name="iconSearchKey">@drawable/sym_keyboard_search_holo_dark</item>
+        <!-- <item name="iconSendKey">@drawable/sym_keyboard_send_holo_dark</item> -->
+        <!-- <item name="iconNextKey">@drawable/sym_keyboard_next_holo_dark</item> -->
+        <!-- <item name="iconDoneKey">@drawable/sym_keyboard_done_holo_dark</item> -->
+        <!-- <item name="iconPreviousKey">@drawable/sym_keyboard_previous_holo_dark</item> -->
         <item name="iconTabKey">@drawable/sym_keyboard_tab_holo_dark</item>
         <item name="iconShortcutKey">@drawable/sym_keyboard_voice_holo_dark</item>
         <item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_holo_dark</item>
diff --git a/java/res/values/strings-talkback-descriptions.xml b/java/res/values/strings-talkback-descriptions.xml
index 4ffca10..80406d0 100644
--- a/java/res/values/strings-talkback-descriptions.xml
+++ b/java/res/values/strings-talkback-descriptions.xml
@@ -35,10 +35,14 @@
     <string name="spoken_description_unknown">Key code %d</string>
     <!-- Spoken description for the "Shift" keyboard key when "Shift" is off. -->
     <string name="spoken_description_shift">Shift</string>
+    <!-- Spoken description for the "Shift" keyboard key in symbols mode. -->
+    <string name="spoken_description_symbols_shift">More symbols</string>
     <!-- Spoken description for the "Shift" keyboard key when "Shift" is on. -->
-    <string name="spoken_description_shift_shifted">Shift on (tap to disable)</string>
+    <string name="spoken_description_shift_shifted">Shift</string>
+    <!-- Spoken description for the "Shift" keyboard key in 2nd symbols (a.k.a. symbols shift) mode. -->
+    <string name="spoken_description_symbols_shift_shifted">Symbols</string>
     <!-- Spoken description for the "Shift" keyboard key when "Caps lock" is on. -->
-    <string name="spoken_description_caps_lock">Caps lock on (tap to disable)</string>
+    <string name="spoken_description_caps_lock">Shift</string>
     <!-- Spoken description for the "Delete" keyboard key. -->
     <string name="spoken_description_delete">Delete</string>
     <!-- Spoken description for the "To Symbol" keyboard key. -->
@@ -76,8 +80,8 @@
     <string name="spoken_description_shiftmode_locked">Caps lock enabled</string>
     <!-- Spoken feedback after changing to the symbols keyboard. -->
     <string name="spoken_description_mode_symbol">Symbols mode</string>
-    <!-- Spoken feedback after changing to the symbols shift keyboard. -->
-    <string name="spoken_description_mode_symbol_shift">Symbols shift mode</string>
+    <!-- Spoken feedback after changing to the 2nd symbols (a.k.a. symbols shift) keyboard. -->
+    <string name="spoken_description_mode_symbol_shift">More symbols mode</string>
     <!-- Spoken feedback after changing to the alphanumeric keyboard. -->
     <string name="spoken_description_mode_alpha">Letters mode</string>
     <!-- Spoken feedback after changing to the phone dialer keyboard. -->
diff --git a/java/res/xml-sw600dp/key_styles_enter.xml b/java/res/xml-sw600dp/key_styles_enter.xml
index 0699e45..99ac108 100644
--- a/java/res/xml-sw600dp/key_styles_enter.xml
+++ b/java/res/xml-sw600dp/key_styles_enter.xml
@@ -117,6 +117,16 @@
         </case>
         <case
             latin:imeAction="actionGo"
+            latin:isIconDefined="go_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/go_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionGo"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -126,6 +136,16 @@
         </case>
         <case
             latin:imeAction="actionNext"
+            latin:isIconDefined="next_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/next_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionNext"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -135,6 +155,16 @@
         </case>
         <case
             latin:imeAction="actionPrevious"
+            latin:isIconDefined="previous_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/previous_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionPrevious"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -144,6 +174,16 @@
         </case>
         <case
             latin:imeAction="actionDone"
+            latin:isIconDefined="done_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/done_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionDone"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -153,6 +193,16 @@
         </case>
         <case
             latin:imeAction="actionSend"
+            latin:isIconDefined="send_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/send_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionSend"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml
index acb27ab..8bba136 100644
--- a/java/res/xml/key_styles_enter.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -284,6 +284,16 @@
         </case>
         <case
             latin:imeAction="actionGo"
+            latin:isIconDefined="go_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/go_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionGo"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -293,6 +303,16 @@
         </case>
         <case
             latin:imeAction="actionNext"
+            latin:isIconDefined="next_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/next_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionNext"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -302,6 +322,16 @@
         </case>
         <case
             latin:imeAction="actionPrevious"
+            latin:isIconDefined="previous_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/previous_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionPrevious"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -311,6 +341,16 @@
         </case>
         <case
             latin:imeAction="actionDone"
+            latin:isIconDefined="done_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/done_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionDone"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
@@ -320,6 +360,16 @@
         </case>
         <case
             latin:imeAction="actionSend"
+            latin:isIconDefined="send_key"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/send_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
+        </case>
+        <case
+            latin:imeAction="actionSend"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
index 2e6649b..0499a34 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
@@ -189,9 +189,14 @@
             break;
         case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED:
         case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED:
-        case KeyboardId.ELEMENT_SYMBOLS_SHIFTED:
             resId = R.string.spoken_description_shift_shifted;
             break;
+        case KeyboardId.ELEMENT_SYMBOLS:
+            resId = R.string.spoken_description_symbols_shift;
+            break;
+        case KeyboardId.ELEMENT_SYMBOLS_SHIFTED:
+            resId = R.string.spoken_description_symbols_shift_shifted;
+            break;
         default:
             resId = R.string.spoken_description_shift;
         }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
index 6c9b5ad..65d6a56 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
@@ -42,7 +42,12 @@
     public static final String NAME_SPACE_KEY = "space_key";
     public static final String NAME_SPACE_KEY_FOR_NUMBER_LAYOUT = "space_key_for_number_layout";
     public static final String NAME_ENTER_KEY = "enter_key";
+    public static final String NAME_GO_KEY = "go_key";
     public static final String NAME_SEARCH_KEY = "search_key";
+    public static final String NAME_SEND_KEY = "send_key";
+    public static final String NAME_NEXT_KEY = "next_key";
+    public static final String NAME_DONE_KEY = "done_key";
+    public static final String NAME_PREVIOUS_KEY = "previous_key";
     public static final String NAME_TAB_KEY = "tab_key";
     public static final String NANE_TAB_KEY_PREVIEW = "tab_key_preview";
     public static final String NAME_SHORTCUT_KEY = "shortcut_key";
@@ -64,7 +69,12 @@
         NAME_SETTINGS_KEY,                R.styleable.Keyboard_iconSettingsKey,
         NAME_SPACE_KEY,                   R.styleable.Keyboard_iconSpaceKey,
         NAME_ENTER_KEY,                   R.styleable.Keyboard_iconEnterKey,
+        NAME_GO_KEY,                      R.styleable.Keyboard_iconGoKey,
         NAME_SEARCH_KEY,                  R.styleable.Keyboard_iconSearchKey,
+        NAME_SEND_KEY,                    R.styleable.Keyboard_iconSendKey,
+        NAME_NEXT_KEY,                    R.styleable.Keyboard_iconNextKey,
+        NAME_DONE_KEY,                    R.styleable.Keyboard_iconDoneKey,
+        NAME_PREVIOUS_KEY,                R.styleable.Keyboard_iconPreviousKey,
         NAME_TAB_KEY,                     R.styleable.Keyboard_iconTabKey,
         NAME_SHORTCUT_KEY,                R.styleable.Keyboard_iconShortcutKey,
         NAME_SPACE_KEY_FOR_NUMBER_LAYOUT, R.styleable.Keyboard_iconSpaceKeyForNumberLayout,
diff --git a/native/jni/NativeFileList.mk b/native/jni/NativeFileList.mk
index 34c1907..6ccfec9 100644
--- a/native/jni/NativeFileList.mk
+++ b/native/jni/NativeFileList.mk
@@ -46,23 +46,22 @@
     $(addprefix suggest/policyimpl/dictionary/, \
         header/header_policy.cpp \
         header/header_read_write_utils.cpp \
-        shortcut/shortcut_list_reading_utils.cpp \
         structure/dictionary_structure_with_buffer_policy_factory.cpp) \
-    $(addprefix suggest/policyimpl/dictionary/bigram/, \
-        bigram_list_read_write_utils.cpp \
-        ver4_bigram_list_policy.cpp) \
     $(addprefix suggest/policyimpl/dictionary/structure/pt_common/, \
+        bigram/bigram_list_read_write_utils.cpp \
         dynamic_pt_gc_event_listeners.cpp \
         dynamic_pt_reading_helper.cpp \
         dynamic_pt_reading_utils.cpp \
         dynamic_pt_updating_helper.cpp \
         dynamic_pt_writing_utils.cpp \
-        patricia_trie_reading_utils.cpp) \
+        patricia_trie_reading_utils.cpp \
+        shortcut/shortcut_list_reading_utils.cpp ) \
     $(addprefix suggest/policyimpl/dictionary/structure/v2/, \
         patricia_trie_policy.cpp \
         ver2_patricia_trie_node_reader.cpp \
         ver2_pt_node_array_reader.cpp) \
     $(addprefix suggest/policyimpl/dictionary/structure/v4/, \
+        bigram/ver4_bigram_list_policy.cpp \
         ver4_dict_buffers.cpp \
         ver4_dict_constants.cpp \
         ver4_patricia_trie_node_reader.cpp \
diff --git a/native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.cpp
similarity index 96%
rename from native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.cpp
rename to native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.cpp
index 7d0d096..08b4e0b 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h"
+#include "suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.h"
 
 #include "suggest/policyimpl/dictionary/utils/byte_array_utils.h"
 #include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h"
diff --git a/native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.h
similarity index 100%
rename from native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h
rename to native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.h
diff --git a/native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.cpp
similarity index 95%
rename from native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.cpp
rename to native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.cpp
index d3eea84..91c7694 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.h"
+#include "suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.h"
 
 #include "suggest/policyimpl/dictionary/utils/byte_array_utils.h"
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.h
similarity index 100%
rename from native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.h
rename to native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.h
diff --git a/native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/bigram/bigram_list_policy.h
similarity index 94%
rename from native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_policy.h
rename to native/jni/src/suggest/policyimpl/dictionary/structure/v2/bigram/bigram_list_policy.h
index a898e2a..00bb502 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/bigram/bigram_list_policy.h
@@ -21,7 +21,7 @@
 
 #include "defines.h"
 #include "suggest/core/policy/dictionary_bigrams_structure_policy.h"
-#include "suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h"
+#include "suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
index 6959c4e..54d1e0f 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
@@ -22,9 +22,9 @@
 
 #include "defines.h"
 #include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
-#include "suggest/policyimpl/dictionary/bigram/bigram_list_policy.h"
 #include "suggest/policyimpl/dictionary/header/header_policy.h"
-#include "suggest/policyimpl/dictionary/shortcut/shortcut_list_policy.h"
+#include "suggest/policyimpl/dictionary/structure/v2/bigram/bigram_list_policy.h"
+#include "suggest/policyimpl/dictionary/structure/v2/shortcut/shortcut_list_policy.h"
 #include "suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.h"
 #include "suggest/policyimpl/dictionary/structure/v2/ver2_pt_node_array_reader.h"
 #include "suggest/policyimpl/dictionary/utils/format_utils.h"
diff --git a/native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/shortcut/shortcut_list_policy.h
similarity index 95%
rename from native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_policy.h
rename to native/jni/src/suggest/policyimpl/dictionary/structure/v2/shortcut/shortcut_list_policy.h
index 6d2b477..8e16ccc 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/shortcut/shortcut_list_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/shortcut/shortcut_list_policy.h
@@ -21,7 +21,7 @@
 
 #include "defines.h"
 #include "suggest/core/policy/dictionary_shortcuts_structure_policy.h"
-#include "suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.h"
+#include "suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.h"
 
 namespace latinime {
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.cpp
similarity index 98%
rename from native/jni/src/suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.cpp
rename to native/jni/src/suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.cpp
index 9e584b4..7a52fd1 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.cpp
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-#include "suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.h"
+#include "suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.h"
 
 #include "suggest/core/dictionary/property/bigram_property.h"
-#include "suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h"
 #include "suggest/policyimpl/dictionary/header/header_policy.h"
+#include "suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.h"
 #include "suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.h"
 #include "suggest/policyimpl/dictionary/structure/v4/content/terminal_position_lookup_table.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h"
diff --git a/native/jni/src/suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.h
similarity index 100%
rename from native/jni/src/suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.h
rename to native/jni/src/suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.h
diff --git a/native/jni/src/suggest/policyimpl/dictionary/shortcut/ver4_shortcut_list_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/shortcut/ver4_shortcut_list_policy.h
similarity index 97%
rename from native/jni/src/suggest/policyimpl/dictionary/shortcut/ver4_shortcut_list_policy.h
rename to native/jni/src/suggest/policyimpl/dictionary/structure/v4/shortcut/ver4_shortcut_list_policy.h
index fe98461..7902735 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/shortcut/ver4_shortcut_list_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/shortcut/ver4_shortcut_list_policy.h
@@ -19,7 +19,7 @@
 
 #include "defines.h"
 #include "suggest/core/policy/dictionary_shortcuts_structure_policy.h"
-#include "suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.h"
+#include "suggest/policyimpl/dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.h"
 #include "suggest/policyimpl/dictionary/structure/v4/content/shortcut_dict_content.h"
 #include "suggest/policyimpl/dictionary/structure/v4/content/terminal_position_lookup_table.h"
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp
index 67420a2..0a435e9 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp
@@ -95,4 +95,4 @@
     }
 }
 
-}
+} // namespace latinime
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
index ae47c8c..f89d3d7 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
@@ -17,13 +17,13 @@
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h"
 
 #include "suggest/core/dictionary/property/unigram_property.h"
-#include "suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.h"
 #include "suggest/policyimpl/dictionary/header/header_policy.h"
-#include "suggest/policyimpl/dictionary/shortcut/ver4_shortcut_list_policy.h"
 #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_utils.h"
 #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h"
 #include "suggest/policyimpl/dictionary/structure/pt_common/patricia_trie_reading_utils.h"
+#include "suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.h"
 #include "suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h"
+#include "suggest/policyimpl/dictionary/structure/v4/shortcut/ver4_shortcut_list_policy.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h"
 #include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h"
@@ -415,4 +415,4 @@
     return true;
 }
 
-}
+} // namespace latinime
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
index 86c1c5b..b785764 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
@@ -21,10 +21,10 @@
 
 #include "defines.h"
 #include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
-#include "suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.h"
 #include "suggest/policyimpl/dictionary/header/header_policy.h"
-#include "suggest/policyimpl/dictionary/shortcut/ver4_shortcut_list_policy.h"
 #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.h"
+#include "suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.h"
+#include "suggest/policyimpl/dictionary/structure/v4/shortcut/ver4_shortcut_list_policy.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h"
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
index 12298d9..f31c502 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
@@ -19,9 +19,9 @@
 #include <cstring>
 #include <queue>
 
-#include "suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.h"
 #include "suggest/policyimpl/dictionary/header/header_policy.h"
-#include "suggest/policyimpl/dictionary/shortcut/ver4_shortcut_list_policy.h"
+#include "suggest/policyimpl/dictionary/structure/v4/bigram/ver4_bigram_list_policy.h"
+#include "suggest/policyimpl/dictionary/structure/v4/shortcut/ver4_shortcut_list_policy.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h"
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
index 9ceafa7..770e76e 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
@@ -1245,6 +1245,12 @@
         addUnigramWord(binaryDictionary, "bbb", unigramProbability);
         final int bigramProbability = 10;
         addBigramWords(binaryDictionary, "aaa", "bbb", bigramProbability);
+        final int shortcutProbability = 10;
+        binaryDictionary.addUnigramWord("ccc", unigramProbability, "xxx", shortcutProbability,
+                false /* isNotAWord */, false /* isBlacklisted */, 0 /* timestamp */);
+        binaryDictionary.addUnigramWord("ddd", unigramProbability, null /* shortcutTarget */,
+                Dictionary.NOT_A_PROBABILITY, true /* isNotAWord */,
+                true /* isBlacklisted */, 0 /* timestamp */);
         assertEquals(unigramProbability, binaryDictionary.getFrequency("aaa"));
         assertEquals(unigramProbability, binaryDictionary.getFrequency("bbb"));
         assertTrue(binaryDictionary.isValidBigram("aaa", "bbb"));
@@ -1256,5 +1262,84 @@
         assertEquals(unigramProbability, binaryDictionary.getFrequency("bbb"));
         // TODO: Add tests for bigram frequency when the implementation gets ready.
         assertTrue(binaryDictionary.isValidBigram("aaa", "bbb"));
+        WordProperty wordProperty = binaryDictionary.getWordProperty("ccc");
+        assertEquals(1, wordProperty.mShortcutTargets.size());
+        assertEquals("xxx", wordProperty.mShortcutTargets.get(0).mWord);
+        wordProperty = binaryDictionary.getWordProperty("ddd");
+        assertTrue(wordProperty.mIsBlacklistEntry);
+        assertTrue(wordProperty.mIsNotAWord);
+    }
+
+    public void testLargeDictMigration() {
+        testLargeDictMigration(FormatSpec.VERSION4_ONLY_FOR_TESTING, FormatSpec.VERSION4);
+    }
+
+    private void testLargeDictMigration(final int fromFormatVersion, final int toFormatVersion) {
+        final int UNIGRAM_COUNT = 3000;
+        final int BIGRAM_COUNT = 3000;
+        final int codePointSetSize = 50;
+        final long seed = System.currentTimeMillis();
+        final Random random = new Random(seed);
+
+        File dictFile = null;
+        try {
+            dictFile = createEmptyDictionaryAndGetFile("TestBinaryDictionary", fromFormatVersion);
+        } catch (IOException e) {
+            fail("IOException while writing an initial dictionary : " + e);
+        }
+        final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
+                0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
+                Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
+
+        final ArrayList<String> words = new ArrayList<String>();
+        final ArrayList<Pair<String, String>> bigrams = new ArrayList<Pair<String,String>>();
+        final int[] codePointSet = CodePointUtils.generateCodePointSet(codePointSetSize, random);
+        final HashMap<String, Integer> unigramProbabilities = new HashMap<String, Integer>();
+        final HashMap<Pair<String, String>, Integer> bigramProbabilities =
+                new HashMap<Pair<String, String>, Integer>();
+
+        for (int i = 0; i < UNIGRAM_COUNT; i++) {
+            final String word = CodePointUtils.generateWord(random, codePointSet);
+            final int unigramProbability = random.nextInt(0xFF);
+            addUnigramWord(binaryDictionary, word, unigramProbability);
+            if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
+                binaryDictionary.flushWithGC();
+            }
+            words.add(word);
+            unigramProbabilities.put(word, unigramProbability);
+        }
+
+        for (int i = 0; i < BIGRAM_COUNT; i++) {
+            final int word0Index = random.nextInt(words.size());
+            final int word1Index = random.nextInt(words.size());
+            if (word0Index == word1Index) {
+                continue;
+            }
+            final String word0 = words.get(word0Index);
+            final String word1 = words.get(word1Index);
+            final int bigramProbability = random.nextInt(0xF);
+            binaryDictionary.addBigramWords(word0, word1, bigramProbability,
+                    BinaryDictionary.NOT_A_VALID_TIMESTAMP);
+            if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
+                binaryDictionary.flushWithGC();
+            }
+            final Pair<String, String> bigram = new Pair<String, String>(word0, word1);
+            bigrams.add(bigram);
+            bigramProbabilities.put(bigram, bigramProbability);
+        }
+        assertTrue(binaryDictionary.migrateTo(toFormatVersion));
+
+        for (final String word : words) {
+            assertEquals((int)unigramProbabilities.get(word), binaryDictionary.getFrequency(word));
+        }
+        assertEquals(unigramProbabilities.size(), Integer.parseInt(
+                binaryDictionary.getPropertyForTest(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
+
+        for (final Pair<String, String> bigram : bigrams) {
+            // TODO: Add tests for bigram frequency when the implementation gets ready.
+            assertTrue(binaryDictionary.isValidBigram(bigram.first, bigram.second));
+        }
+        assertEquals(bigramProbabilities.size(), Integer.parseInt(
+                binaryDictionary.getPropertyForTest(BinaryDictionary.BIGRAM_COUNT_QUERY)));
     }
 }