[FD1] Move parents' address computation outside

There is no need to do it repeatedly in this loop: it's
clearer and faster to do it at the end only.

Bug: 8526576
Change-Id: I707571179c89479830891ec6d4fd06a9fffed7c1
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
index 467f6a0..29e7c28 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
@@ -559,9 +559,6 @@
             } else if (null != group.mChildren) {
                 final int offsetBasePoint = groupSize + node.mCachedAddress + size;
                 final int offset = group.mChildren.mCachedAddress - offsetBasePoint;
-                // assign my address to children's parent address
-                group.mChildren.mCachedParentAddress = group.mCachedAddress
-                        - group.mChildren.mCachedAddress;
                 if (formatOptions.mSupportsDynamicUpdate) {
                     groupSize += FormatSpec.SIGNED_CHILDREN_ADDRESS_SIZE;
                 } else {
@@ -621,6 +618,26 @@
     }
 
     /**
+     * Compute the cached parent addresses after all has been updated.
+     *
+     * The parent addresses are used by some binary formats at write-to-disk time. Not all formats
+     * need them. In particular, version 2 does not need them, and version 3 does.
+     *
+     * @param flatNodes the flat array of nodes to fill in
+     */
+    private static void computeParentAddresses(final ArrayList<Node> flatNodes) {
+        for (final Node node : flatNodes) {
+            for (CharGroup group : node.mData) {
+                if (null != group.mChildren) {
+                    // assign my address to children's parent address
+                    group.mChildren.mCachedParentAddress = group.mCachedAddress
+                            - group.mChildren.mCachedAddress;
+                }
+            }
+        }
+    }
+
+    /**
      * Compute the addresses and sizes of an ordered node array.
      *
      * This method takes a node array and will update its cached address and size values
@@ -660,6 +677,9 @@
             if (passes > MAX_PASSES) throw new RuntimeException("Too many passes - probably a bug");
         } while (changesDone);
 
+        if (formatOptions.mSupportsDynamicUpdate) {
+            computeParentAddresses(flatNodes);
+        }
         final Node lastNode = flatNodes.get(flatNodes.size() - 1);
         MakedictLog.i("Compression complete in " + passes + " passes.");
         MakedictLog.i("After address compression : "