From a28fd3fa7c82947d847c05ed11905f556b8dcfa2 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 15 Mar 2010 14:44:42 -0700 Subject: [PATCH] Prevent NPE in Launcher when an icon cannot be found. Bug #2509023 Change-Id: I053c7c9a37ed4aeb4d78a9f62dfdeea09a3959aa --- .../android/launcher2/FastBitmapDrawable.java | 22 +++++++++-- src/com/android/launcher2/IconCache.java | 39 +++++++++---------- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/com/android/launcher2/FastBitmapDrawable.java b/src/com/android/launcher2/FastBitmapDrawable.java index 850535e670..226d6d8d8e 100644 --- a/src/com/android/launcher2/FastBitmapDrawable.java +++ b/src/com/android/launcher2/FastBitmapDrawable.java @@ -24,9 +24,17 @@ import android.graphics.ColorFilter; class FastBitmapDrawable extends Drawable { private Bitmap mBitmap; + private int mWidth; + private int mHeight; FastBitmapDrawable(Bitmap b) { mBitmap = b; + if (b != null) { + mWidth = mBitmap.getWidth(); + mHeight = mBitmap.getHeight(); + } else { + mWidth = mHeight = 0; + } } @Override @@ -49,26 +57,32 @@ class FastBitmapDrawable extends Drawable { @Override public int getIntrinsicWidth() { - return mBitmap.getWidth(); + return mWidth; } @Override public int getIntrinsicHeight() { - return mBitmap.getHeight(); + return mHeight; } @Override public int getMinimumWidth() { - return mBitmap.getWidth(); + return mWidth; } @Override public int getMinimumHeight() { - return mBitmap.getHeight(); + return mHeight; } public void setBitmap(Bitmap b) { mBitmap = b; + if (b != null) { + mWidth = mBitmap.getWidth(); + mHeight = mBitmap.getHeight(); + } else { + mWidth = mHeight = 0; + } } public Bitmap getBitmap() { diff --git a/src/com/android/launcher2/IconCache.java b/src/com/android/launcher2/IconCache.java index 855d914313..04762e9441 100644 --- a/src/com/android/launcher2/IconCache.java +++ b/src/com/android/launcher2/IconCache.java @@ -17,27 +17,14 @@ package com.android.launcher2; import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.ContentValues; import android.content.Intent; -import android.content.Context; -import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.content.res.Resources; -import android.database.Cursor; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; +import android.graphics.Canvas; import android.graphics.drawable.Drawable; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.util.Log; -import android.os.Process; -import java.lang.ref.WeakReference; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; /** * Cache of application icons. Icons can be made from any thread. @@ -53,9 +40,10 @@ public class IconCache { public Bitmap titleBitmap; } - private LauncherApplication mContext; - private PackageManager mPackageManager; - private Utilities.BubbleText mBubble; + private final Bitmap mDefaultIcon; + private final LauncherApplication mContext; + private final PackageManager mPackageManager; + private final Utilities.BubbleText mBubble; private final HashMap mCache = new HashMap(INITIAL_ICON_CACHE_CAPACITY); @@ -63,6 +51,18 @@ public class IconCache { mContext = context; mPackageManager = context.getPackageManager(); mBubble = new Utilities.BubbleText(context); + mDefaultIcon = makeDefaultIcon(); + } + + private Bitmap makeDefaultIcon() { + Drawable d = mPackageManager.getDefaultActivityIcon(); + Bitmap b = Bitmap.createBitmap(Math.max(d.getIntrinsicWidth(), 1), + Math.max(d.getIntrinsicHeight(), 1), + Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(b); + d.setBounds(0, 0, b.getWidth(), b.getHeight()); + d.draw(c); + return b; } /** @@ -90,7 +90,7 @@ public class IconCache { synchronized (mCache) { CacheEntry entry = cacheLocked(application.componentName, info); if (entry.titleBitmap == null) { - entry.titleBitmap = mBubble.createTextBitmap(entry.title.toString()); + entry.titleBitmap = mBubble.createTextBitmap(entry.title); } application.title = entry.title; @@ -104,7 +104,7 @@ public class IconCache { ComponentName component = intent.getComponent(); if (resolveInfo == null || component == null) { - return null; + return mDefaultIcon; } CacheEntry entry = cacheLocked(component, resolveInfo); @@ -137,4 +137,3 @@ public class IconCache { return entry; } } -