Do not throw NPE if the dictionary info is not available on db

Bug: 20035793
Change-Id: Idc13af405eab5457954a93db3dddcd81f6eb6435
diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
index a2789cc..fbc8991 100644
--- a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
+++ b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
@@ -34,6 +34,8 @@
 import java.util.List;
 import java.util.TreeMap;
 
+import javax.annotation.Nullable;
+
 /**
  * Various helper functions for the state database
  */
@@ -705,6 +707,7 @@
      * @param version the word list version.
      * @return the metadata about this word list.
      */
+    @Nullable
     public static ContentValues getContentValuesByWordListId(final SQLiteDatabase db,
             final String id, final int version) {
         final Cursor cursor = db.query(METADATA_TABLE_NAME,
diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java b/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java
index 329b9f6..e5d632f 100644
--- a/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java
+++ b/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java
@@ -19,6 +19,7 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
+import android.util.Log;
 
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -30,10 +31,13 @@
  * Helper class to easy up manipulation of dictionary pack metadata.
  */
 public class MetadataHandler {
+
+    public static final String TAG = MetadataHandler.class.getSimpleName();
+
     // The canonical file name for metadata. This is not the name of a real file on the
     // device, but a symbolic name used in the database and in metadata handling. It is never
     // tested against, only used for human-readability as the file name for the metadata.
-    public final static String METADATA_FILENAME = "metadata.json";
+    public static final String METADATA_FILENAME = "metadata.json";
 
     /**
      * Reads the data from the cursor and store it in metadata objects.
@@ -114,6 +118,14 @@
             final String clientId, final String wordListId, final int version) {
         final ContentValues contentValues = MetadataDbHelper.getContentValuesByWordListId(
                 MetadataDbHelper.getDb(context, clientId), wordListId, version);
+        if (contentValues == null) {
+            // TODO: Figure out why this would happen.
+            // Check if this happens when the metadata gets updated in the background.
+            Log.e(TAG, String.format( "Unable to find the current metadata for wordlist "
+                            + "(clientId=%s, wordListId=%s, version=%d) on the database",
+                    clientId, wordListId, version));
+            return null;
+        }
         return WordListMetadata.createFromContentValues(contentValues);
     }
 
diff --git a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
index 30ff0b8..e720f3c 100644
--- a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
+++ b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
@@ -1143,6 +1143,9 @@
             }
             final WordListMetadata wordListMetaData = MetadataHandler.getCurrentMetadataForWordList(
                     context, clientId, wordlistId, version);
+            if (wordListMetaData == null) {
+                return;
+            }
 
             final ActionBatch actions = new ActionBatch();
             actions.add(new ActionBatch.StartDownloadAction(
diff --git a/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java b/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java
index 59f75e4..99cffb8 100644
--- a/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java
+++ b/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java
@@ -18,6 +18,8 @@
 
 import android.content.ContentValues;
 
+import javax.annotation.Nonnull;
+
 /**
  * The metadata for a single word list.
  *
@@ -77,7 +79,7 @@
      *
      * If this lacks any required field, IllegalArgumentException is thrown.
      */
-    public static WordListMetadata createFromContentValues(final ContentValues values) {
+    public static WordListMetadata createFromContentValues(@Nonnull final ContentValues values) {
         final String id = values.getAsString(MetadataDbHelper.WORDLISTID_COLUMN);
         final Integer type = values.getAsInteger(MetadataDbHelper.TYPE_COLUMN);
         final String description = values.getAsString(MetadataDbHelper.DESCRIPTION_COLUMN);