Display icons in the correct density in the ActivityPicker.

This also fixes a memory leak in Home.

Do not merge.

Change-Id: Ib69b4055fae2c8705887bbd12be7fa61b689eb03
This commit is contained in:
Romain Guy
2009-12-09 12:17:33 -08:00
parent 146385663b
commit a9f9031ba3

View File

@@ -16,6 +16,7 @@
package com.android.settings; package com.android.settings;
import android.util.DisplayMetrics;
import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController; import com.android.internal.app.AlertController;
@@ -39,11 +40,9 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.PaintDrawable; import android.graphics.drawable.PaintDrawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable; import android.os.Parcelable;
import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.TextView; import android.widget.TextView;
@@ -161,6 +160,7 @@ public class ActivityPicker extends AlertActivity implements
icon = res.getDrawable(res.getIdentifier( icon = res.getDrawable(res.getIdentifier(
iconResource.resourceName, null, null)); iconResource.resourceName, null, null));
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
// Ignore
} }
items.add(new PickAdapter.Item(this, label, icon)); items.add(new PickAdapter.Item(this, label, icon));
@@ -205,7 +205,9 @@ public class ActivityPicker extends AlertActivity implements
protected IconResizer getResizer(Context context) { protected IconResizer getResizer(Context context) {
if (sResizer == null) { if (sResizer == null) {
sResizer = new IconResizer(context); final Resources resources = context.getResources();
int size = (int) resources.getDimension(android.R.dimen.app_icon_size);
sResizer = new IconResizer(size, size, resources.getDisplayMetrics());
} }
return sResizer; return sResizer;
} }
@@ -233,15 +235,15 @@ public class ActivityPicker extends AlertActivity implements
if (label == null && resolveInfo.activityInfo != null) { if (label == null && resolveInfo.activityInfo != null) {
label = resolveInfo.activityInfo.name; label = resolveInfo.activityInfo.name;
} }
icon = getResizer(context).createIconThumbnail(resolveInfo.loadIcon(pm)); icon = getResizer(context).createIconThumbnail(resolveInfo.loadIcon(pm));
packageName = resolveInfo.activityInfo.applicationInfo.packageName; packageName = resolveInfo.activityInfo.applicationInfo.packageName;
className = resolveInfo.activityInfo.name; className = resolveInfo.activityInfo.name;
} }
/** /**
* Build the {@link Intent} described by this item. If this item * Build the {@link Intent} described by this item. If this item
* can't create a valid {@link ComponentName}, it will return * can't create a valid {@link android.content.ComponentName}, it will return
* {@link Intent#ACTION_CREATE_SHORTCUT} filled with the item label. * {@link Intent#ACTION_CREATE_SHORTCUT} filled with the item label.
*/ */
Intent getIntent(Intent baseIntent) { Intent getIntent(Intent baseIntent) {
@@ -262,16 +264,13 @@ public class ActivityPicker extends AlertActivity implements
} }
private final LayoutInflater mInflater; private final LayoutInflater mInflater;
private final List<Item> mItems;
private List<Item> mItems;
private int mLayoutRes = R.layout.pick_item;
/** /**
* Create an adapter for the given items. * Create an adapter for the given items.
*/ */
public PickAdapter(Context context, List<Item> items) { public PickAdapter(Context context, List<Item> items) {
mInflater = (LayoutInflater) mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mItems = items; mItems = items;
} }
@@ -301,7 +300,7 @@ public class ActivityPicker extends AlertActivity implements
*/ */
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) { if (convertView == null) {
convertView = mInflater.inflate(mLayoutRes, parent, false); convertView = mInflater.inflate(R.layout.pick_item, parent, false);
} }
Item item = (Item) getItem(position); Item item = (Item) getItem(position);
@@ -318,19 +317,20 @@ public class ActivityPicker extends AlertActivity implements
* borrowed from Launcher. * borrowed from Launcher.
*/ */
private static class IconResizer { private static class IconResizer {
private int mIconWidth = -1; private final int mIconWidth;
private int mIconHeight = -1; private final int mIconHeight;
private final DisplayMetrics mMetrics;
private final Rect mOldBounds = new Rect(); private final Rect mOldBounds = new Rect();
private Canvas mCanvas = new Canvas(); private final Canvas mCanvas = new Canvas();
public IconResizer(Context context) { public IconResizer(int width, int height, DisplayMetrics metrics) {
mCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, mCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG,
Paint.FILTER_BITMAP_FLAG)); Paint.FILTER_BITMAP_FLAG));
final Resources resources = context.getResources(); mMetrics = metrics;
mIconWidth = mIconHeight = (int) resources.getDimension( mIconWidth = width;
android.R.dimen.app_icon_size); mIconHeight = height;
} }
/** /**
@@ -348,21 +348,23 @@ public class ActivityPicker extends AlertActivity implements
public Drawable createIconThumbnail(Drawable icon) { public Drawable createIconThumbnail(Drawable icon) {
int width = mIconWidth; int width = mIconWidth;
int height = mIconHeight; int height = mIconHeight;
if (icon == null) {
return null;
}
final int iconWidth = icon.getIntrinsicWidth();
final int iconHeight = icon.getIntrinsicHeight();
if (icon instanceof PaintDrawable) { if (icon instanceof PaintDrawable) {
PaintDrawable painter = (PaintDrawable) icon; PaintDrawable painter = (PaintDrawable) icon;
painter.setIntrinsicWidth(width); painter.setIntrinsicWidth(width);
painter.setIntrinsicHeight(height); painter.setIntrinsicHeight(height);
} else if (icon instanceof BitmapDrawable) {
// Ensure the bitmap has a density.
BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap.getDensity() == Bitmap.DENSITY_NONE) {
bitmapDrawable.setTargetDensity(mMetrics);
}
} }
int iconWidth = icon.getIntrinsicWidth();
int iconHeight = icon.getIntrinsicHeight();
if (width > 0 && height > 0) { if (iconWidth > 0 && iconHeight > 0) {
if (width < iconWidth || height < iconHeight) { if (width < iconWidth || height < iconHeight) {
final float ratio = (float) iconWidth / iconHeight; final float ratio = (float) iconWidth / iconHeight;
@@ -388,7 +390,9 @@ public class ActivityPicker extends AlertActivity implements
icon.setBounds(x, y, x + width, y + height); icon.setBounds(x, y, x + width, y + height);
icon.draw(canvas); icon.draw(canvas);
icon.setBounds(mOldBounds); icon.setBounds(mOldBounds);
//noinspection deprecation
icon = new BitmapDrawable(thumb); icon = new BitmapDrawable(thumb);
((BitmapDrawable) icon).setTargetDensity(mMetrics);
} else if (iconWidth < width && iconHeight < height) { } else if (iconWidth < width && iconHeight < height) {
final Bitmap.Config c = Bitmap.Config.ARGB_8888; final Bitmap.Config c = Bitmap.Config.ARGB_8888;
final Bitmap thumb = Bitmap.createBitmap(mIconWidth, mIconHeight, c); final Bitmap thumb = Bitmap.createBitmap(mIconWidth, mIconHeight, c);
@@ -400,7 +404,9 @@ public class ActivityPicker extends AlertActivity implements
icon.setBounds(x, y, x + iconWidth, y + iconHeight); icon.setBounds(x, y, x + iconWidth, y + iconHeight);
icon.draw(canvas); icon.draw(canvas);
icon.setBounds(mOldBounds); icon.setBounds(mOldBounds);
//noinspection deprecation
icon = new BitmapDrawable(thumb); icon = new BitmapDrawable(thumb);
((BitmapDrawable) icon).setTargetDensity(mMetrics);
} }
} }