Display icons in the correct density in the ActivityPicker.
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user