| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.launcher2; |
| |
| import com.android.launcher.R; |
| |
| import android.content.ComponentName; |
| import android.content.Intent; |
| import android.content.pm.PackageManager; |
| import android.content.pm.ResolveInfo; |
| import android.content.res.Resources; |
| import android.graphics.Bitmap; |
| import android.graphics.Canvas; |
| import android.graphics.drawable.Drawable; |
| import android.util.DisplayMetrics; |
| |
| import java.util.HashMap; |
| |
| /** |
| * Cache of application icons. Icons can be made from any thread. |
| */ |
| public class IconCache { |
| private static final String TAG = "Launcher.IconCache"; |
| |
| private static final int INITIAL_ICON_CACHE_CAPACITY = 50; |
| |
| private static class CacheEntry { |
| public Bitmap icon; |
| public String title; |
| public Bitmap titleBitmap; |
| } |
| |
| private final Bitmap mDefaultIcon; |
| private final LauncherApplication mContext; |
| private final PackageManager mPackageManager; |
| private final Utilities.BubbleText mBubble; |
| private final HashMap<ComponentName, CacheEntry> mCache = |
| new HashMap<ComponentName, CacheEntry>(INITIAL_ICON_CACHE_CAPACITY); |
| private int mIconDpi; |
| |
| public IconCache(LauncherApplication context) { |
| mContext = context; |
| mPackageManager = context.getPackageManager(); |
| mBubble = new Utilities.BubbleText(context); |
| if (LauncherApplication.isScreenXLarge()) { |
| mIconDpi = DisplayMetrics.DENSITY_HIGH; |
| } else { |
| mIconDpi = context.getResources().getDisplayMetrics().densityDpi; |
| } |
| // need to set mIconDpi before getting default icon |
| mDefaultIcon = makeDefaultIcon(); |
| } |
| |
| public Drawable getFullResDefaultActivityIcon() { |
| return getFullResIcon(Resources.getSystem(), |
| com.android.internal.R.drawable.sym_def_app_icon); |
| } |
| |
| public Drawable getFullResIcon(Resources resources, int iconId) { |
| return resources.getDrawableForDensity(iconId, mIconDpi); |
| } |
| |
| public Drawable getFullResIcon(ResolveInfo info, PackageManager packageManager) { |
| Resources resources; |
| try { |
| resources = packageManager.getResourcesForApplication( |
| info.activityInfo.applicationInfo); |
| } catch (PackageManager.NameNotFoundException e) { |
| resources = null; |
| } |
| if (resources != null) { |
| int iconId = info.activityInfo.getIconResource(); |
| if (iconId != 0) { |
| return getFullResIcon(resources, iconId); |
| } |
| } |
| return getFullResDefaultActivityIcon(); |
| } |
| |
| private Bitmap makeDefaultIcon() { |
| Drawable d = getFullResDefaultActivityIcon(); |
| 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; |
| } |
| |
| /** |
| * Remove any records for the supplied ComponentName. |
| */ |
| public void remove(ComponentName componentName) { |
| synchronized (mCache) { |
| mCache.remove(componentName); |
| } |
| } |
| |
| /** |
| * Empty out the cache. |
| */ |
| public void flush() { |
| synchronized (mCache) { |
| mCache.clear(); |
| } |
| } |
| |
| /** |
| * Fill in "application" with the icon and label for "info." |
| */ |
| public void getTitleAndIcon(ApplicationInfo application, ResolveInfo info) { |
| synchronized (mCache) { |
| CacheEntry entry = cacheLocked(application.componentName, info); |
| if (entry.titleBitmap == null) { |
| entry.titleBitmap = mBubble.createTextBitmap(entry.title); |
| } |
| |
| application.title = entry.title; |
| application.titleBitmap = entry.titleBitmap; |
| application.iconBitmap = entry.icon; |
| } |
| } |
| |
| public Bitmap getIcon(Intent intent) { |
| synchronized (mCache) { |
| final ResolveInfo resolveInfo = mPackageManager.resolveActivity(intent, 0); |
| ComponentName component = intent.getComponent(); |
| |
| if (resolveInfo == null || component == null) { |
| return mDefaultIcon; |
| } |
| |
| CacheEntry entry = cacheLocked(component, resolveInfo); |
| return entry.icon; |
| } |
| } |
| |
| public Bitmap getIcon(ComponentName component, ResolveInfo resolveInfo) { |
| synchronized (mCache) { |
| if (resolveInfo == null || component == null) { |
| return null; |
| } |
| |
| CacheEntry entry = cacheLocked(component, resolveInfo); |
| return entry.icon; |
| } |
| } |
| |
| public boolean isDefaultIcon(Bitmap icon) { |
| return mDefaultIcon == icon; |
| } |
| |
| private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info) { |
| CacheEntry entry = mCache.get(componentName); |
| if (entry == null) { |
| entry = new CacheEntry(); |
| |
| mCache.put(componentName, entry); |
| |
| entry.title = info.loadLabel(mPackageManager).toString(); |
| if (entry.title == null) { |
| entry.title = info.activityInfo.name; |
| } |
| entry.icon = Utilities.createIconBitmap( |
| getFullResIcon(info, mPackageManager), mContext); |
| } |
| return entry; |
| } |
| } |