* re-scale icons that are loaded using different denstiy metrics.
* fix potential npe
diff --git a/src/com/android/launcher/Utilities.java b/src/com/android/launcher/Utilities.java
index cb8976c..33b084b 100644
--- a/src/com/android/launcher/Utilities.java
+++ b/src/com/android/launcher/Utilities.java
@@ -16,6 +16,7 @@
 
 package com.android.launcher;
 
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.PaintDrawable;
 import android.graphics.Bitmap;
@@ -80,24 +81,35 @@
     static Drawable createIconThumbnail(Drawable icon, Context context) {
         if (sIconWidth == -1) {
             final Resources resources = context.getResources();
-            sIconWidth = sIconHeight = (int) resources.getDimension(
-                    android.R.dimen.app_icon_size);
+            sIconWidth = sIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size);
         }
 
         int width = sIconWidth;
         int height = sIconHeight;
 
-        final int iconWidth = icon.getIntrinsicWidth();
-        final int iconHeight = icon.getIntrinsicHeight();
-
+        float scale = 1.0f;
         if (icon instanceof PaintDrawable) {
             PaintDrawable painter = (PaintDrawable) icon;
             painter.setIntrinsicWidth(width);
             painter.setIntrinsicHeight(height);
+        } else if (icon instanceof BitmapDrawable) {
+            float displayDensity = context.getResources().getDisplayMetrics().density;
+            BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
+            Bitmap bitmap = bitmapDrawable.getBitmap();
+            float iconDensity = bitmap.getDensityScale();
+            scale = displayDensity / iconDensity;
+
+            // Scale the bitmap to the screen density size if it's not loaded at the same density.
+            if (scale != 1.0f) {
+                icon = bitmapDrawable = new BitmapDrawable(bitmap);
+                bitmapDrawable.setDensityScale(scale);
+            }
         }
+        int iconWidth = icon.getIntrinsicWidth();
+        int iconHeight = icon.getIntrinsicHeight();
 
         if (width > 0 && height > 0) {
-            if (width < iconWidth || height < iconHeight) {
+            if (width < iconWidth || height < iconHeight || scale != 1.0f) {
                 final float ratio = (float) iconWidth / iconHeight;
 
                 if (iconWidth > iconHeight) {