Merge "Updating how widget previews look" into jb-dev

This commit is contained in:
Michael Jurka
2012-05-22 23:39:54 -07:00
committed by Android (Google) Code Review
18 changed files with 286 additions and 111 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

@@ -25,8 +25,5 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_horizontal" android:gravity="center_horizontal"
launcher:blurColor="#FF6B8CF0"
launcher:outlineColor="#FF8CD2FF"
android:focusable="true" android:focusable="true"
android:background="@drawable/focusable_view_bg" /> android:background="@drawable/focusable_view_bg" />
@@ -25,8 +25,5 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_horizontal" android:gravity="center_horizontal"
launcher:blurColor="#FF6B8CF0"
launcher:outlineColor="#FF8CD2FF"
android:focusable="true" android:focusable="true"
android:background="@drawable/focusable_view_bg" /> android:background="@drawable/focusable_view_bg" />
+16 -13
View File
@@ -22,16 +22,27 @@
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical" android:orientation="vertical"
launcher:blurColor="#FF6B8CF0"
launcher:outlineColor="#FF8CD2FF"
android:background="@drawable/focusable_view_bg" android:background="@drawable/focusable_view_bg"
android:focusable="true"> android:focusable="true">
<!-- The preview of the widget or shortcut. -->
<com.android.launcher2.PagedViewWidgetImageView
android:id="@+id/widget_preview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="@dimen/app_widget_preview_padding_top"
android:paddingLeft="@dimen/app_widget_preview_padding_left"
android:paddingRight="@dimen/app_widget_preview_padding_right"
android:scaleType="matrix"
android:background="@drawable/widget_container_holo" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="4dp" android:layout_marginTop="@dimen/app_widget_preview_label_margin_top"
android:layout_marginLeft="@dimen/app_widget_preview_label_margin_left"
android:layout_marginRight="@dimen/app_widget_preview_label_margin_right"
android:orientation="horizontal"> android:orientation="horizontal">
<!-- The name of the widget. --> <!-- The name of the widget. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android" <TextView xmlns:android="http://schemas.android.com/apk/res/android"
@@ -62,13 +73,5 @@
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
<!-- The icon of the widget. -->
<com.android.launcher2.PagedViewWidgetImageView
android:id="@+id/widget_preview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="@dimen/app_widget_preview_padding_top"
android:paddingLeft="@dimen/app_widget_preview_padding_left"
android:scaleType="matrix" />
</com.android.launcher2.PagedViewWidget> </com.android.launcher2.PagedViewWidget>
+3 -1
View File
@@ -61,7 +61,9 @@
<dimen name="apps_customize_tab_bar_margin_top">8dp</dimen> <dimen name="apps_customize_tab_bar_margin_top">8dp</dimen>
<dimen name="apps_customize_widget_cell_width_gap">20dp</dimen> <dimen name="apps_customize_widget_cell_width_gap">20dp</dimen>
<dimen name="apps_customize_widget_cell_height_gap">24dp</dimen> <dimen name="apps_customize_widget_cell_height_gap">24dp</dimen>
<dimen name="app_widget_preview_label_margin_top">8dp</dimen>
<dimen name="app_widget_preview_label_margin_left">@dimen/app_widget_preview_padding_left</dimen>
<dimen name="app_widget_preview_label_margin_right">@dimen/app_widget_preview_padding_right</dimen>
<!-- Workspace cell size --> <!-- Workspace cell size -->
<dimen name="workspace_cell_width_land">88dp</dimen> <dimen name="workspace_cell_width_land">88dp</dimen>
<dimen name="workspace_cell_width_port">96dp</dimen> <dimen name="workspace_cell_width_port">96dp</dimen>
-3
View File
@@ -40,9 +40,6 @@
<dimen name="apps_customize_cell_height">96dp</dimen> <dimen name="apps_customize_cell_height">96dp</dimen>
<integer name="apps_customize_maxCellCountX">-1</integer> <integer name="apps_customize_maxCellCountX">-1</integer>
<integer name="apps_customize_maxCellCountY">-1</integer> <integer name="apps_customize_maxCellCountY">-1</integer>
<dimen name="app_widget_preview_padding_left">0dp</dimen>
<dimen name="app_widget_preview_padding_top">10dp</dimen>
<dimen name="all_apps_button_vertical_padding">4dip</dimen> <dimen name="all_apps_button_vertical_padding">4dip</dimen>
<!-- roughly a status bar (for determining how many rows of icons are in home) --> <!-- roughly a status bar (for determining how many rows of icons are in home) -->
-18
View File
@@ -93,24 +93,6 @@
<attr name="sourceImageViewId" format="integer" /> <attr name="sourceImageViewId" format="integer" />
</declare-styleable> </declare-styleable>
<!-- PagedViewIcon specific attributes. These attributes are used to customize
a PagedViewIcon view in XML files. -->
<declare-styleable name="PagedViewIcon">
<!-- The blur color of the holographic outline -->
<attr name="blurColor" format="color" />
<!-- The outline color of the holographic outline -->
<attr name="outlineColor" format="color" />
</declare-styleable>
<!-- PagedViewWidget specific attributes. These attributes are used to
customize a PagedViewWidget view in XML files. -->
<declare-styleable name="PagedViewWidget">
<!-- The blur color of the holographic outline -->
<attr name="blurColor" />
<!-- The outline color of the holographic outline -->
<attr name="outlineColor" />
</declare-styleable>
<!-- PagedView specific attributes. These attributes are used to customize <!-- PagedView specific attributes. These attributes are used to customize
a PagedView view in XML files. --> a PagedView view in XML files. -->
<declare-styleable name="PagedView"> <declare-styleable name="PagedView">
+12 -3
View File
@@ -105,9 +105,18 @@
should be. If 0, it will not be scaled at all. --> should be. If 0, it will not be scaled at all. -->
<dimen name="dragViewScale">12dp</dimen> <dimen name="dragViewScale">12dp</dimen>
<!-- Padding applied to AppWidgets --> <!-- Padding applied to AppWidget previews -->
<dimen name="app_widget_preview_padding_left">8dp</dimen> <dimen name="app_widget_preview_padding_left">16dp</dimen>
<dimen name="app_widget_preview_padding_top">8dp</dimen> <dimen name="app_widget_preview_padding_right">16dp</dimen>
<dimen name="app_widget_preview_padding_top">32dp</dimen>
<dimen name="app_widget_preview_label_margin_top">4dp</dimen>
<dimen name="app_widget_preview_label_margin_left">2dp</dimen>
<dimen name="app_widget_preview_label_margin_right">2dp</dimen>
<!-- Padding applied to shortcut previews -->
<dimen name="shortcut_preview_padding_left">0dp</dimen>
<dimen name="shortcut_preview_padding_right">0dp</dimen>
<dimen name="shortcut_preview_padding_top">0dp</dimen>
<!-- Folders --> <!-- Folders -->
<!-- The size of the image which sits behind the preview of the folder contents --> <!-- The size of the image which sits behind the preview of the folder contents -->
@@ -33,12 +33,18 @@ import android.content.res.TypedArray;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Bitmap.Config; import android.graphics.Bitmap.Config;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Insets;
import android.graphics.MaskFilter; import android.graphics.MaskFilter;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.TableMaskFilter; import android.graphics.TableMaskFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Process; import android.os.Process;
@@ -54,6 +60,7 @@ import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
import android.widget.GridLayout; import android.widget.GridLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import com.android.launcher.R; import com.android.launcher.R;
@@ -63,6 +70,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.lang.ref.WeakReference;
/** /**
* A simple callback interface which also provides the results of the task. * A simple callback interface which also provides the results of the task.
@@ -163,6 +171,64 @@ class AppsCustomizeAsyncTask extends AsyncTask<AsyncTaskPageData, Void, AsyncTas
int threadPriority; int threadPriority;
} }
abstract class WeakReferenceThreadLocal<T> {
private ThreadLocal<WeakReference<T>> mThreadLocal;
public WeakReferenceThreadLocal() {
mThreadLocal = new ThreadLocal<WeakReference<T>>();
}
abstract T initialValue();
public void set(T t) {
mThreadLocal.set(new WeakReference<T>(t));
}
public T get() {
WeakReference<T> reference = mThreadLocal.get();
T obj;
if (reference == null) {
obj = initialValue();
mThreadLocal.set(new WeakReference<T>(obj));
return obj;
} else {
obj = reference.get();
if (obj == null) {
obj = initialValue();
mThreadLocal.set(new WeakReference<T>(obj));
}
return obj;
}
}
}
class CanvasCache extends WeakReferenceThreadLocal<Canvas> {
@Override
protected Canvas initialValue() {
return new Canvas();
}
}
class PaintCache extends WeakReferenceThreadLocal<Paint> {
@Override
protected Paint initialValue() {
return null;
}
}
class BitmapCache extends WeakReferenceThreadLocal<Bitmap> {
@Override
protected Bitmap initialValue() {
return null;
}
}
class RectCache extends WeakReferenceThreadLocal<Rect> {
@Override
protected Rect initialValue() {
return new Rect();
}
}
/** /**
* The Apps/Customize page that displays all the applications, widgets, and shortcuts. * The Apps/Customize page that displays all the applications, widgets, and shortcuts.
*/ */
@@ -245,6 +311,17 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
private ArrayList<AsyncTaskPageData> mDeferredSyncWidgetPageItems = private ArrayList<AsyncTaskPageData> mDeferredSyncWidgetPageItems =
new ArrayList<AsyncTaskPageData>(); new ArrayList<AsyncTaskPageData>();
// Used for drawing shortcut previews
BitmapCache mCachedShortcutPreviewBitmap = new BitmapCache();
PaintCache mCachedShortcutPreviewPaint = new PaintCache();
CanvasCache mCachedShortcutPreviewCanvas = new CanvasCache();
// Used for drawing widget previews
CanvasCache mCachedAppWidgetPreviewCanvas = new CanvasCache();
RectCache mCachedAppWidgetPreviewSrcRect = new RectCache();
RectCache mCachedAppWidgetPreviewDestRect = new RectCache();
PaintCache mCachedAppWidgetPreviewPaint = new PaintCache();
public AppsCustomizePagedView(Context context, AttributeSet attrs) { public AppsCustomizePagedView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mLayoutInflater = LayoutInflater.from(context); mLayoutInflater = LayoutInflater.from(context);
@@ -689,11 +766,11 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
FastBitmapDrawable previewDrawable = (FastBitmapDrawable) image.getDrawable(); FastBitmapDrawable previewDrawable = (FastBitmapDrawable) image.getDrawable();
float minScale = 1.25f; float minScale = 1.25f;
int minWidth, minHeight; int maxWidth, maxHeight;
minWidth = Math.max((int) (previewDrawable.getIntrinsicWidth() * minScale), size[0]); maxWidth = Math.min((int) (previewDrawable.getIntrinsicWidth() * minScale), size[0]);
minHeight = Math.max((int) (previewDrawable.getIntrinsicHeight() * minScale), size[1]); maxHeight = Math.min((int) (previewDrawable.getIntrinsicHeight() * minScale), size[1]);
preview = getWidgetPreview(createWidgetInfo.componentName, createWidgetInfo.previewImage, preview = getWidgetPreview(createWidgetInfo.componentName, createWidgetInfo.previewImage,
createWidgetInfo.icon, spanX, spanY, minWidth, minHeight); createWidgetInfo.icon, spanX, spanY, maxWidth, maxHeight);
// Determine the image view drawable scale relative to the preview // Determine the image view drawable scale relative to the preview
float[] mv = new float[9]; float[] mv = new float[9];
@@ -706,17 +783,15 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
m.getValues(mv); m.getValues(mv);
scale = (float) mv[0]; scale = (float) mv[0];
} else { } else {
// Workaround for the fact that we don't keep the original ResolveInfo associated with PendingAddShortcutInfo createShortcutInfo = (PendingAddShortcutInfo) v.getTag();
// the shortcut around. To get the icon, we just render the preview image (which has Drawable icon = mIconCache.getFullResIcon(createShortcutInfo.shortcutActivityInfo);
// the shortcut icon) to a new drag bitmap that clips the non-icon space. preview = Bitmap.createBitmap(icon.getIntrinsicWidth(),
preview = Bitmap.createBitmap(mWidgetPreviewIconPaddedDimension, icon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
mWidgetPreviewIconPaddedDimension, Bitmap.Config.ARGB_8888);
Drawable d = image.getDrawable();
mCanvas.setBitmap(preview); mCanvas.setBitmap(preview);
mCanvas.save(); mCanvas.save();
mCanvas.translate((mWidgetPreviewIconPaddedDimension - d.getIntrinsicWidth()) / 2, renderDrawableToBitmap(icon, preview, 0, 0,
(mWidgetPreviewIconPaddedDimension - d.getIntrinsicHeight()) / 2); icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
d.draw(mCanvas);
mCanvas.restore(); mCanvas.restore();
mCanvas.setBitmap(null); mCanvas.setBitmap(null);
createItemInfo.spanX = createItemInfo.spanY = 1; createItemInfo.spanX = createItemInfo.spanY = 1;
@@ -1118,11 +1193,11 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
} }
private void renderDrawableToBitmap(Drawable d, Bitmap bitmap, int x, int y, int w, int h) { private void renderDrawableToBitmap(Drawable d, Bitmap bitmap, int x, int y, int w, int h) {
renderDrawableToBitmap(d, bitmap, x, y, w, h, 1f, 0xFFFFFFFF); renderDrawableToBitmap(d, bitmap, x, y, w, h, 1f);
} }
private void renderDrawableToBitmap(Drawable d, Bitmap bitmap, int x, int y, int w, int h, private void renderDrawableToBitmap(Drawable d, Bitmap bitmap, int x, int y, int w, int h,
float scale, int multiplyColor) { float scale) {
if (bitmap != null) { if (bitmap != null) {
Canvas c = new Canvas(bitmap); Canvas c = new Canvas(bitmap);
c.scale(scale, scale); c.scale(scale, scale);
@@ -1133,20 +1208,60 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
c.setBitmap(null); c.setBitmap(null);
} }
} }
private Bitmap getShortcutPreview(ResolveInfo info) {
// Render the background
int offset = 0;
int bitmapSize = mAppIconSize;
Bitmap preview = Bitmap.createBitmap(bitmapSize, bitmapSize, Config.ARGB_8888);
private Bitmap getShortcutPreview(ResolveInfo info, int maxWidth, int maxHeight) {
Bitmap tempBitmap = mCachedShortcutPreviewBitmap.get();
final Canvas c = mCachedShortcutPreviewCanvas.get();
if (tempBitmap == null ||
tempBitmap.getWidth() != maxWidth ||
tempBitmap.getHeight() != maxHeight) {
tempBitmap = Bitmap.createBitmap(maxWidth, maxHeight, Config.ARGB_8888);
mCachedShortcutPreviewBitmap.set(tempBitmap);
} else {
c.setBitmap(tempBitmap);
c.drawColor(0, PorterDuff.Mode.CLEAR);
c.setBitmap(null);
}
// Render the icon // Render the icon
Drawable icon = mIconCache.getFullResIcon(info); Drawable icon = mIconCache.getFullResIcon(info);
renderDrawableToBitmap(icon, preview, offset, offset, mAppIconSize, mAppIconSize);
int paddingTop =
getResources().getDimensionPixelOffset(R.dimen.shortcut_preview_padding_top);
int paddingLeft =
getResources().getDimensionPixelOffset(R.dimen.shortcut_preview_padding_left);
int paddingRight =
getResources().getDimensionPixelOffset(R.dimen.shortcut_preview_padding_right);
int scaledIconWidth = (maxWidth - paddingLeft - paddingRight);
float scaleSize = scaledIconWidth / (float) mAppIconSize;
renderDrawableToBitmap(
icon, tempBitmap, paddingLeft, paddingTop, scaledIconWidth, scaledIconWidth);
Bitmap preview = Bitmap.createBitmap(maxWidth, maxHeight, Config.ARGB_8888);
c.setBitmap(preview);
Paint p = mCachedShortcutPreviewPaint.get();
if (p == null) {
p = new Paint();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0);
p.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
p.setAlpha((int) (255 * 0.06f));
//float density = 1f;
//p.setMaskFilter(new BlurMaskFilter(15*density, BlurMaskFilter.Blur.NORMAL));
mCachedShortcutPreviewPaint.set(p);
}
c.drawBitmap(tempBitmap, 0, 0, p);
c.setBitmap(null);
renderDrawableToBitmap(icon, preview, 0, 0, mAppIconSize, mAppIconSize);
return preview; return preview;
} }
private Bitmap getWidgetPreview(ComponentName provider, int previewImage, int iconId, private Bitmap getWidgetPreview(ComponentName provider, int previewImage,
int cellHSpan, int cellVSpan, int maxWidth, int maxHeight) { int iconId, int cellHSpan, int cellVSpan, int maxWidth,
int maxHeight) {
// Load the preview image if possible // Load the preview image if possible
String packageName = provider.getPackageName(); String packageName = provider.getPackageName();
if (maxWidth < 0) maxWidth = Integer.MAX_VALUE; if (maxWidth < 0) maxWidth = Integer.MAX_VALUE;
@@ -1163,68 +1278,93 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
int bitmapWidth; int bitmapWidth;
int bitmapHeight; int bitmapHeight;
Bitmap defaultPreview = null;
boolean widgetPreviewExists = (drawable != null); boolean widgetPreviewExists = (drawable != null);
if (widgetPreviewExists) { if (widgetPreviewExists) {
bitmapWidth = drawable.getIntrinsicWidth(); bitmapWidth = drawable.getIntrinsicWidth();
bitmapHeight = drawable.getIntrinsicHeight(); bitmapHeight = drawable.getIntrinsicHeight();
} else { } else {
// Generate a preview image if we couldn't load one
if (cellHSpan < 1) cellHSpan = 1; if (cellHSpan < 1) cellHSpan = 1;
if (cellVSpan < 1) cellVSpan = 1; if (cellVSpan < 1) cellVSpan = 1;
// Determine the size of the bitmap for the preview image we will generate
// TODO: This actually uses the apps customize cell layout params, where as we make want BitmapDrawable previewDrawable = (BitmapDrawable) getResources()
// the Workspace params for more accuracy. .getDrawable(R.drawable.widget_preview_tile);
bitmapWidth = mWidgetSpacingLayout.estimateCellWidth(cellHSpan); final int previewDrawableWidth = previewDrawable
bitmapHeight = mWidgetSpacingLayout.estimateCellHeight(cellVSpan); .getIntrinsicWidth();
if (cellHSpan == cellVSpan) { final int previewDrawableHeight = previewDrawable
// For square widgets, we just have a fixed size for 1x1 and larger-than-1x1 .getIntrinsicHeight();
int minOffset = (int) (mAppIconSize * sWidgetPreviewIconPaddingPercentage); bitmapWidth = previewDrawableWidth * cellHSpan; // subtract 2 dips
if (cellHSpan <= 1) { bitmapHeight = previewDrawableHeight * cellVSpan;
bitmapWidth = bitmapHeight = mAppIconSize + 2 * minOffset;
} else { defaultPreview = Bitmap.createBitmap(bitmapWidth, bitmapHeight,
bitmapWidth = bitmapHeight = mAppIconSize + 4 * minOffset; Config.ARGB_8888);
final Canvas c = mCachedAppWidgetPreviewCanvas.get();
c.setBitmap(defaultPreview);
previewDrawable.setBounds(0, 0, bitmapWidth, bitmapHeight);
previewDrawable.setTileModeXY(Shader.TileMode.REPEAT,
Shader.TileMode.REPEAT);
previewDrawable.draw(c);
c.setBitmap(null);
// Draw the icon in the top left corner
int minOffset = (int) (mAppIconSize * sWidgetPreviewIconPaddingPercentage);
int smallestSide = Math.min(bitmapWidth, bitmapHeight);
float iconScale = Math.min((float) smallestSide
/ (mAppIconSize + 2 * minOffset), 1f);
try {
Drawable icon = null;
int hoffset =
(int) ((previewDrawableWidth - mAppIconSize * iconScale) / 2);
int yoffset =
(int) ((previewDrawableHeight - mAppIconSize * iconScale) / 2);
if (iconId > 0)
icon = mIconCache.getFullResIcon(packageName, iconId);
Resources resources = mLauncher.getResources();
if (icon != null) {
renderDrawableToBitmap(icon, defaultPreview, hoffset,
yoffset, (int) (mAppIconSize * iconScale),
(int) (mAppIconSize * iconScale));
} }
} catch (Resources.NotFoundException e) {
} }
} }
// Scale to fit width only - let the widget preview be clipped in the
// vertical dimension
float scale = 1f; float scale = 1f;
if (bitmapWidth > maxWidth) { if (bitmapWidth > maxWidth) {
scale = maxWidth / (float) bitmapWidth; scale = maxWidth / (float) bitmapWidth;
} }
if (bitmapHeight * scale > maxHeight) {
scale = maxHeight / (float) bitmapHeight;
}
if (scale != 1f) { if (scale != 1f) {
bitmapWidth = (int) (scale * bitmapWidth); bitmapWidth = (int) (scale * bitmapWidth);
bitmapHeight = (int) (scale * bitmapHeight); bitmapHeight = (int) (scale * bitmapHeight);
} }
Bitmap preview = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Config.ARGB_8888); Bitmap preview = Bitmap.createBitmap(bitmapWidth, bitmapHeight,
Config.ARGB_8888);
// Draw the scaled preview into the final bitmap
if (widgetPreviewExists) { if (widgetPreviewExists) {
renderDrawableToBitmap(drawable, preview, 0, 0, bitmapWidth, bitmapHeight); renderDrawableToBitmap(drawable, preview, 0, 0, bitmapWidth,
bitmapHeight);
} else { } else {
// Generate a preview image if we couldn't load one final Canvas c = mCachedAppWidgetPreviewCanvas.get();
int minOffset = (int) (mAppIconSize * sWidgetPreviewIconPaddingPercentage); final Rect src = mCachedAppWidgetPreviewSrcRect.get();
int smallestSide = Math.min(bitmapWidth, bitmapHeight); final Rect dest = mCachedAppWidgetPreviewDestRect.get();
float iconScale = Math.min((float) smallestSide / (mAppIconSize + 2 * minOffset), 1f); c.setBitmap(preview);
if (cellHSpan != 1 || cellVSpan != 1) { src.set(0, 0, defaultPreview.getWidth(), defaultPreview.getHeight());
renderDrawableToBitmap(mDefaultWidgetBackground, preview, 0, 0, bitmapWidth, dest.set(0, 0, preview.getWidth(), preview.getHeight());
bitmapHeight);
Paint p = mCachedAppWidgetPreviewPaint.get();
if (p == null) {
p = new Paint();
p.setFilterBitmap(true);
mCachedAppWidgetPreviewPaint.set(p);
} }
c.drawBitmap(defaultPreview, src, dest, p);
// Draw the icon in the top left corner c.setBitmap(null);
try {
Drawable icon = null;
int hoffset = (int) (bitmapWidth / 2 - mAppIconSize * iconScale / 2);
int yoffset = (int) (bitmapHeight / 2 - mAppIconSize * iconScale / 2);
if (iconId > 0) icon = mIconCache.getFullResIcon(packageName, iconId);
Resources resources = mLauncher.getResources();
if (icon == null) icon = resources.getDrawable(R.drawable.ic_launcher_application);
renderDrawableToBitmap(icon, preview, hoffset, yoffset,
(int) (mAppIconSize * iconScale),
(int) (mAppIconSize * iconScale));
} catch (Resources.NotFoundException e) {}
} }
return preview; return preview;
} }
@@ -1274,7 +1414,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
} else if (rawInfo instanceof ResolveInfo) { } else if (rawInfo instanceof ResolveInfo) {
// Fill in the shortcuts information // Fill in the shortcuts information
ResolveInfo info = (ResolveInfo) rawInfo; ResolveInfo info = (ResolveInfo) rawInfo;
createItemInfo = new PendingAddItemInfo(); createItemInfo = new PendingAddShortcutInfo(info.activityInfo);
createItemInfo.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; createItemInfo.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
createItemInfo.componentName = new ComponentName(info.activityInfo.packageName, createItemInfo.componentName = new ComponentName(info.activityInfo.packageName,
info.activityInfo.name); info.activityInfo.name);
@@ -1363,7 +1503,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
} else if (rawInfo instanceof ResolveInfo) { } else if (rawInfo instanceof ResolveInfo) {
// Fill in the shortcuts information // Fill in the shortcuts information
ResolveInfo info = (ResolveInfo) rawInfo; ResolveInfo info = (ResolveInfo) rawInfo;
images.add(getShortcutPreview(info)); images.add(getShortcutPreview(info, data.maxImageWidth, data.maxImageHeight));
} }
} }
} }
+8 -2
View File
@@ -20,6 +20,7 @@ import android.app.ActivityManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.res.Resources; import android.content.res.Resources;
@@ -94,15 +95,20 @@ public class IconCache {
} }
public Drawable getFullResIcon(ResolveInfo info) { public Drawable getFullResIcon(ResolveInfo info) {
return getFullResIcon(info.activityInfo);
}
public Drawable getFullResIcon(ActivityInfo info) {
Resources resources; Resources resources;
try { try {
resources = mPackageManager.getResourcesForApplication( resources = mPackageManager.getResourcesForApplication(
info.activityInfo.applicationInfo); info.applicationInfo);
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
resources = null; resources = null;
} }
if (resources != null) { if (resources != null) {
int iconId = info.activityInfo.getIconResource(); int iconId = info.getIconResource();
if (iconId != 0) { if (iconId != 0) {
return getFullResIcon(resources, iconId); return getFullResIcon(resources, iconId);
} }
+14 -2
View File
@@ -43,6 +43,7 @@ public class PagedViewWidget extends LinearLayout {
ShortPressListener mShortPressListener = null; ShortPressListener mShortPressListener = null;
boolean mShortPressTriggered = false; boolean mShortPressTriggered = false;
static PagedViewWidget sShortpressTarget = null; static PagedViewWidget sShortpressTarget = null;
boolean mIsAppWidget;
public PagedViewWidget(Context context) { public PagedViewWidget(Context context) {
this(context, null); this(context, null);
@@ -84,6 +85,7 @@ public class PagedViewWidget extends LinearLayout {
public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info, public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info,
int maxWidth, int[] cellSpan) { int maxWidth, int[] cellSpan) {
mIsAppWidget = true;
final ImageView image = (ImageView) findViewById(R.id.widget_preview); final ImageView image = (ImageView) findViewById(R.id.widget_preview);
if (maxWidth > -1) { if (maxWidth > -1) {
image.setMaxWidth(maxWidth); image.setMaxWidth(maxWidth);
@@ -100,6 +102,7 @@ public class PagedViewWidget extends LinearLayout {
} }
public void applyFromResolveInfo(PackageManager pm, ResolveInfo info) { public void applyFromResolveInfo(PackageManager pm, ResolveInfo info) {
mIsAppWidget = false;
CharSequence label = info.loadLabel(pm); CharSequence label = info.loadLabel(pm);
final ImageView image = (ImageView) findViewById(R.id.widget_preview); final ImageView image = (ImageView) findViewById(R.id.widget_preview);
image.setContentDescription(label); image.setContentDescription(label);
@@ -115,16 +118,25 @@ public class PagedViewWidget extends LinearLayout {
final ImageView i = (ImageView) findViewById(R.id.widget_preview); final ImageView i = (ImageView) findViewById(R.id.widget_preview);
int[] maxSize = new int[2]; int[] maxSize = new int[2];
maxSize[0] = i.getWidth() - i.getPaddingLeft() - i.getPaddingRight(); maxSize[0] = i.getWidth() - i.getPaddingLeft() - i.getPaddingRight();
maxSize[1] = i.getHeight() - i.getPaddingBottom() - i.getPaddingTop(); maxSize[1] = i.getHeight() - i.getPaddingTop();
return maxSize; return maxSize;
} }
void applyPreview(FastBitmapDrawable preview, int index) { void applyPreview(FastBitmapDrawable preview, int index) {
final PagedViewWidgetImageView image = final PagedViewWidgetImageView image =
(PagedViewWidgetImageView) findViewById(R.id.widget_preview); (PagedViewWidgetImageView) findViewById(R.id.widget_preview);
if (preview != null) { if (preview != null) {
image.mAllowRequestLayout = false; image.mAllowRequestLayout = false;
image.setImageDrawable(preview); image.setImageDrawable(preview);
if (mIsAppWidget) {
// center horizontally
int[] imageSize = getPreviewSize();
int centerAmount = (imageSize[0] - preview.getIntrinsicWidth()) / 2;
image.setPadding(image.getPaddingLeft() + centerAmount,
image.getPaddingTop(),
image.getPaddingRight(),
image.getPaddingBottom());
}
image.setAlpha(1f); image.setAlpha(1f);
image.mAllowRequestLayout = true; image.mAllowRequestLayout = true;
} }
@@ -17,6 +17,8 @@
package com.android.launcher2; package com.android.launcher2;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Insets;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.ImageView; import android.widget.ImageView;
@@ -34,4 +36,22 @@ class PagedViewWidgetImageView extends ImageView {
super.requestLayout(); super.requestLayout();
} }
} }
@Override
protected void onDraw(Canvas canvas) {
Insets insets = Insets.NONE;
if (getBackground() != null) {
insets = getBackground().getLayoutInsets();
}
canvas.save();
canvas.clipRect(getScrollX() + getPaddingLeft() + insets.left,
getScrollY() + getPaddingTop() + insets.top,
getScrollX() + getRight() - getLeft() - getPaddingRight() - insets.right,
getScrollY() + getBottom() - getTop() - getPaddingBottom() - insets.bottom);
super.onDraw(canvas);
canvas.restore();
}
} }
@@ -19,6 +19,7 @@ package com.android.launcher2;
import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo; import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.os.Parcelable; import android.os.Parcelable;
/** /**
@@ -31,6 +32,15 @@ class PendingAddItemInfo extends ItemInfo {
ComponentName componentName; ComponentName componentName;
} }
class PendingAddShortcutInfo extends PendingAddItemInfo {
ActivityInfo shortcutActivityInfo;
public PendingAddShortcutInfo(ActivityInfo activityInfo) {
shortcutActivityInfo = activityInfo;
}
}
class PendingAddWidgetInfo extends PendingAddItemInfo { class PendingAddWidgetInfo extends PendingAddItemInfo {
int minWidth; int minWidth;
int minHeight; int minHeight;