| /* |
| * 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 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.Pair; |
| 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; |
| } |
| |
| 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.isScreenLarge()) { |
| 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.mipmap.sym_def_app_icon); |
| } |
| |
| public Drawable getFullResIcon(Resources resources, int iconId) { |
| try { |
| return resources.getDrawableForDensity(iconId, mIconDpi); |
| } catch (Resources.NotFoundException e) { |
| return getFullResDefaultActivityIcon(); |
| } |
| } |
| |
| 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, |
| HashMap<Object, CharSequence> labelCache) { |
| synchronized (mCache) { |
| CacheEntry entry = cacheLocked(application.componentName, info, labelCache); |
| |
| application.title = entry.title; |
| 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, null); |
| return entry.icon; |
| } |
| } |
| |
| public Bitmap getIcon(ComponentName component, ResolveInfo resolveInfo) { |
| synchronized (mCache) { |
| if (resolveInfo == null || component == null) { |
| return null; |
| } |
| |
| CacheEntry entry = cacheLocked(component, resolveInfo, null); |
| return entry.icon; |
| } |
| } |
| |
| public boolean isDefaultIcon(Bitmap icon) { |
| return mDefaultIcon == icon; |
| } |
| |
| private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info, |
| HashMap<Object, CharSequence> labelCache) { |
| CacheEntry entry = mCache.get(componentName); |
| if (entry == null) { |
| entry = new CacheEntry(); |
| |
| mCache.put(componentName, entry); |
| |
| if (labelCache != null && labelCache.containsKey(info)) { |
| entry.title = labelCache.get(info).toString(); |
| } else { |
| entry.title = info.loadLabel(mPackageManager).toString(); |
| if (labelCache != null) { |
| labelCache.put(info, entry.title); |
| } |
| } |
| if (entry.title == null) { |
| entry.title = info.activityInfo.name; |
| } |
| |
| entry.icon = Utilities.createIconBitmap( |
| getFullResIcon(info, mPackageManager), mContext); |
| } |
| return entry; |
| } |
| |
| public HashMap<ComponentName,Bitmap> getAllIcons() { |
| synchronized (mCache) { |
| HashMap<ComponentName,Bitmap> set = new HashMap<ComponentName,Bitmap>(); |
| int i = 0; |
| for (ComponentName cn : mCache.keySet()) { |
| final CacheEntry e = mCache.get(cn); |
| set.put(cn, e.icon); |
| } |
| return set; |
| } |
| } |
| } |