Ensuring that each CacheEntry has a default title and content description.

- Also defer adding entry to cache until we know that it has correctly loaded

Bug: 21446070

Change-Id: Ia7aae65ecdc5d9d7741f75d3fb6e7b85daeafeff
diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java
index 0c91a71..a3376c4 100644
--- a/src/com/android/launcher3/IconCache.java
+++ b/src/com/android/launcher3/IconCache.java
@@ -49,10 +49,8 @@
 
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map.Entry;
 import java.util.Stack;
 
 /**
@@ -75,8 +73,8 @@
 
     @Thunk static class CacheEntry {
         public Bitmap icon;
-        public CharSequence title;
-        public CharSequence contentDescription;
+        public CharSequence title = "";
+        public CharSequence contentDescription = "";
         public boolean isLowResIcon;
     }
 
@@ -584,7 +582,7 @@
         CacheEntry entry = mCache.get(cacheKey);
         if (entry == null || (entry.isLowResIcon && !useLowResIcon)) {
             entry = new CacheEntry();
-            mCache.put(cacheKey, entry);
+            boolean entryUpdated = true;
 
             // Check the DB first.
             if (!getEntryFromDB(cn, user, entry, useLowResIcon)) {
@@ -609,8 +607,14 @@
 
                 } catch (NameNotFoundException e) {
                     if (DEBUG) Log.d(TAG, "Application not installed " + packageName);
+                    entryUpdated = false;
                 }
             }
+
+            // Only add a filled-out entry to the cache
+            if (entryUpdated) {
+                mCache.put(cacheKey, entry);
+            }
         }
         return entry;
     }