Prevent the creation of Shorcuts with null intents (issue 5629292)

Change-Id: I54fbad2d4af27c6d8fc0d79c33e890298a3db4dc
diff --git a/src/com/android/launcher2/InstallShortcutReceiver.java b/src/com/android/launcher2/InstallShortcutReceiver.java
index 9d7054c..ed8f299 100644
--- a/src/com/android/launcher2/InstallShortcutReceiver.java
+++ b/src/com/android/launcher2/InstallShortcutReceiver.java
@@ -65,11 +65,15 @@
                 boolean duplicate = data.getBooleanExtra(Launcher.EXTRA_SHORTCUT_DUPLICATE, true);
                 if (duplicate || !LauncherModel.shortcutExists(context, name, intent)) {
                     LauncherApplication app = (LauncherApplication) context.getApplicationContext();
-                    app.getModel().addShortcut(context, data,
+                    ShortcutInfo info = app.getModel().addShortcut(context, data,
                             LauncherSettings.Favorites.CONTAINER_DESKTOP, screen, mCoordinates[0],
                             mCoordinates[1], true);
-                    Toast.makeText(context, context.getString(R.string.shortcut_installed, name),
-                            Toast.LENGTH_SHORT).show();
+                    if (info != null) {
+                        Toast.makeText(context, context.getString(R.string.shortcut_installed, name),
+                                Toast.LENGTH_SHORT).show();
+                    } else {
+                        return false;
+                    }
                 } else {
                     Toast.makeText(context, context.getString(R.string.shortcut_duplicate, name),
                             Toast.LENGTH_SHORT).show();
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 6ea14db..e489e46 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -873,6 +873,9 @@
         boolean foundCellSpan = false;
 
         ShortcutInfo info = mModel.infoFromShortcutIntent(this, data, null);
+        if (info == null) {
+            return;
+        }
         final View view = createShortcut(info);
 
         // First we check if we already know the exact location where we want to add this item.
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 1755903..50a36a5 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -1772,6 +1772,9 @@
     ShortcutInfo addShortcut(Context context, Intent data, long container, int screen,
             int cellX, int cellY, boolean notify) {
         final ShortcutInfo info = infoFromShortcutIntent(context, data, null);
+        if (info == null) {
+            return null;
+        }
         addItemToDatabase(context, info, container, screen, cellX, cellY, notify);
 
         return info;
@@ -1835,6 +1838,12 @@
         String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
         Parcelable bitmap = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON);
 
+        if (intent == null) {
+            // If the intent is null, we can't construct a valid ShortcutInfo, so we return null
+            Log.e(TAG, "Can't construct ShorcutInfo with null intent");
+            return null;
+        }
+
         Bitmap icon = null;
         boolean customIcon = false;
         ShortcutIconResource iconResource = null;
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 79e9942..3f74fd9 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -2455,7 +2455,9 @@
                 if (isShortcut) {
                     final Intent intent = data.getItemAt(index).getIntent();
                     Object info = model.infoFromShortcutIntent(mContext, intent, data.getIcon());
-                    onDropExternal(new int[] { x, y }, info, layout, false);
+                    if (info != null) {
+                        onDropExternal(new int[] { x, y }, info, layout, false);
+                    }
                 } else {
                     if (widgets.size() == 1) {
                         // If there is only one item, then go ahead and add and configure