Fix for NPE in #2248683

Also fix a problem in type-to-filter. It was looking for substring match
instead of searching on word boundaries. It will now search by word
boundaries (separated by space).
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java
index a71d17b..9cd6e23 100644
--- a/src/com/android/settings/ManageApplications.java
+++ b/src/com/android/settings/ManageApplications.java
@@ -1403,13 +1403,17 @@
                     }
                 } else {
                     final String prefixString = prefix.toString().toLowerCase();
+                    final String spacePrefixString = " " + prefixString;
                     Map<String, String> newMap = new HashMap<String, String>();
                     synchronized (mFilterLock) {
                         Map<String, String> localMap = mFilterMap;
                         Set<String> keys = mFilterMap.keySet();
                         for (String key : keys) {
                             String label = localMap.get(key);
-                            if (label.indexOf(prefixString) != -1) {
+                            if (label == null) continue;
+                            label = label.toLowerCase();
+                            if (label.startsWith(prefixString)
+                                    || label.indexOf(spacePrefixString) != -1) {
                                 newMap.put(key, label);
                             }
                         }
@@ -1895,6 +1899,9 @@
         public final int compare(ApplicationInfo a, ApplicationInfo b) {
             AppInfo ainfo = mCache.getEntry(a.packageName);
             AppInfo binfo = mCache.getEntry(b.packageName);
+            // Check for null app names, to avoid NPE in rare cases
+            if (ainfo == null || ainfo.appName == null) return -1;
+            if (binfo == null || binfo.appName == null) return 1;
             return sCollator.compare(ainfo.appName.toString(), binfo.appName.toString());
         }
     }