Merge "Updating how widget previews look" into jb-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b77f116a2b
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:gravity="center_horizontal"
|
||||
|
||||
launcher:blurColor="#FF6B8CF0"
|
||||
launcher:outlineColor="#FF8CD2FF"
|
||||
|
||||
android:focusable="true"
|
||||
android:background="@drawable/focusable_view_bg" />
|
||||
|
||||
@@ -25,8 +25,5 @@
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_horizontal"
|
||||
|
||||
launcher:blurColor="#FF6B8CF0"
|
||||
launcher:outlineColor="#FF8CD2FF"
|
||||
|
||||
android:focusable="true"
|
||||
android:background="@drawable/focusable_view_bg" />
|
||||
|
||||
@@ -22,16 +22,27 @@
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical"
|
||||
|
||||
launcher:blurColor="#FF6B8CF0"
|
||||
launcher:outlineColor="#FF8CD2FF"
|
||||
|
||||
android:background="@drawable/focusable_view_bg"
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
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">
|
||||
<!-- The name of the widget. -->
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
@@ -62,13 +73,5 @@
|
||||
android:textSize="12sp" />
|
||||
</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>
|
||||
|
||||
@@ -61,7 +61,9 @@
|
||||
<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_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 -->
|
||||
<dimen name="workspace_cell_width_land">88dp</dimen>
|
||||
<dimen name="workspace_cell_width_port">96dp</dimen>
|
||||
|
||||
@@ -40,9 +40,6 @@
|
||||
<dimen name="apps_customize_cell_height">96dp</dimen>
|
||||
<integer name="apps_customize_maxCellCountX">-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>
|
||||
|
||||
<!-- roughly a status bar (for determining how many rows of icons are in home) -->
|
||||
|
||||
@@ -93,24 +93,6 @@
|
||||
<attr name="sourceImageViewId" format="integer" />
|
||||
</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
|
||||
a PagedView view in XML files. -->
|
||||
<declare-styleable name="PagedView">
|
||||
|
||||
+12
-3
@@ -105,9 +105,18 @@
|
||||
should be. If 0, it will not be scaled at all. -->
|
||||
<dimen name="dragViewScale">12dp</dimen>
|
||||
|
||||
<!-- Padding applied to AppWidgets -->
|
||||
<dimen name="app_widget_preview_padding_left">8dp</dimen>
|
||||
<dimen name="app_widget_preview_padding_top">8dp</dimen>
|
||||
<!-- Padding applied to AppWidget previews -->
|
||||
<dimen name="app_widget_preview_padding_left">16dp</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 -->
|
||||
<!-- 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.Config;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.ColorMatrix;
|
||||
import android.graphics.ColorMatrixColorFilter;
|
||||
import android.graphics.Insets;
|
||||
import android.graphics.MaskFilter;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.Shader;
|
||||
import android.graphics.TableMaskFilter;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Process;
|
||||
@@ -54,6 +60,7 @@ import android.view.animation.AccelerateInterpolator;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.widget.GridLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.launcher.R;
|
||||
@@ -63,6 +70,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
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.
|
||||
*/
|
||||
@@ -245,6 +311,17 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
private ArrayList<AsyncTaskPageData> mDeferredSyncWidgetPageItems =
|
||||
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) {
|
||||
super(context, attrs);
|
||||
mLayoutInflater = LayoutInflater.from(context);
|
||||
@@ -689,11 +766,11 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
|
||||
FastBitmapDrawable previewDrawable = (FastBitmapDrawable) image.getDrawable();
|
||||
float minScale = 1.25f;
|
||||
int minWidth, minHeight;
|
||||
minWidth = Math.max((int) (previewDrawable.getIntrinsicWidth() * minScale), size[0]);
|
||||
minHeight = Math.max((int) (previewDrawable.getIntrinsicHeight() * minScale), size[1]);
|
||||
int maxWidth, maxHeight;
|
||||
maxWidth = Math.min((int) (previewDrawable.getIntrinsicWidth() * minScale), size[0]);
|
||||
maxHeight = Math.min((int) (previewDrawable.getIntrinsicHeight() * minScale), size[1]);
|
||||
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
|
||||
float[] mv = new float[9];
|
||||
@@ -706,17 +783,15 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
m.getValues(mv);
|
||||
scale = (float) mv[0];
|
||||
} else {
|
||||
// Workaround for the fact that we don't keep the original ResolveInfo associated with
|
||||
// the shortcut around. To get the icon, we just render the preview image (which has
|
||||
// the shortcut icon) to a new drag bitmap that clips the non-icon space.
|
||||
preview = Bitmap.createBitmap(mWidgetPreviewIconPaddedDimension,
|
||||
mWidgetPreviewIconPaddedDimension, Bitmap.Config.ARGB_8888);
|
||||
Drawable d = image.getDrawable();
|
||||
PendingAddShortcutInfo createShortcutInfo = (PendingAddShortcutInfo) v.getTag();
|
||||
Drawable icon = mIconCache.getFullResIcon(createShortcutInfo.shortcutActivityInfo);
|
||||
preview = Bitmap.createBitmap(icon.getIntrinsicWidth(),
|
||||
icon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
|
||||
|
||||
mCanvas.setBitmap(preview);
|
||||
mCanvas.save();
|
||||
mCanvas.translate((mWidgetPreviewIconPaddedDimension - d.getIntrinsicWidth()) / 2,
|
||||
(mWidgetPreviewIconPaddedDimension - d.getIntrinsicHeight()) / 2);
|
||||
d.draw(mCanvas);
|
||||
renderDrawableToBitmap(icon, preview, 0, 0,
|
||||
icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
|
||||
mCanvas.restore();
|
||||
mCanvas.setBitmap(null);
|
||||
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) {
|
||||
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,
|
||||
float scale, int multiplyColor) {
|
||||
float scale) {
|
||||
if (bitmap != null) {
|
||||
Canvas c = new Canvas(bitmap);
|
||||
c.scale(scale, scale);
|
||||
@@ -1133,20 +1208,60 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
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
|
||||
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;
|
||||
}
|
||||
|
||||
private Bitmap getWidgetPreview(ComponentName provider, int previewImage, int iconId,
|
||||
int cellHSpan, int cellVSpan, int maxWidth, int maxHeight) {
|
||||
private Bitmap getWidgetPreview(ComponentName provider, int previewImage,
|
||||
int iconId, int cellHSpan, int cellVSpan, int maxWidth,
|
||||
int maxHeight) {
|
||||
// Load the preview image if possible
|
||||
String packageName = provider.getPackageName();
|
||||
if (maxWidth < 0) maxWidth = Integer.MAX_VALUE;
|
||||
@@ -1163,68 +1278,93 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
|
||||
int bitmapWidth;
|
||||
int bitmapHeight;
|
||||
Bitmap defaultPreview = null;
|
||||
boolean widgetPreviewExists = (drawable != null);
|
||||
if (widgetPreviewExists) {
|
||||
bitmapWidth = drawable.getIntrinsicWidth();
|
||||
bitmapHeight = drawable.getIntrinsicHeight();
|
||||
} else {
|
||||
// Generate a preview image if we couldn't load one
|
||||
if (cellHSpan < 1) cellHSpan = 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
|
||||
// the Workspace params for more accuracy.
|
||||
bitmapWidth = mWidgetSpacingLayout.estimateCellWidth(cellHSpan);
|
||||
bitmapHeight = mWidgetSpacingLayout.estimateCellHeight(cellVSpan);
|
||||
if (cellHSpan == cellVSpan) {
|
||||
// For square widgets, we just have a fixed size for 1x1 and larger-than-1x1
|
||||
int minOffset = (int) (mAppIconSize * sWidgetPreviewIconPaddingPercentage);
|
||||
if (cellHSpan <= 1) {
|
||||
bitmapWidth = bitmapHeight = mAppIconSize + 2 * minOffset;
|
||||
} else {
|
||||
bitmapWidth = bitmapHeight = mAppIconSize + 4 * minOffset;
|
||||
|
||||
BitmapDrawable previewDrawable = (BitmapDrawable) getResources()
|
||||
.getDrawable(R.drawable.widget_preview_tile);
|
||||
final int previewDrawableWidth = previewDrawable
|
||||
.getIntrinsicWidth();
|
||||
final int previewDrawableHeight = previewDrawable
|
||||
.getIntrinsicHeight();
|
||||
bitmapWidth = previewDrawableWidth * cellHSpan; // subtract 2 dips
|
||||
bitmapHeight = previewDrawableHeight * cellVSpan;
|
||||
|
||||
defaultPreview = Bitmap.createBitmap(bitmapWidth, bitmapHeight,
|
||||
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;
|
||||
if (bitmapWidth > maxWidth) {
|
||||
scale = maxWidth / (float) bitmapWidth;
|
||||
}
|
||||
if (bitmapHeight * scale > maxHeight) {
|
||||
scale = maxHeight / (float) bitmapHeight;
|
||||
}
|
||||
if (scale != 1f) {
|
||||
bitmapWidth = (int) (scale * bitmapWidth);
|
||||
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) {
|
||||
renderDrawableToBitmap(drawable, preview, 0, 0, bitmapWidth, bitmapHeight);
|
||||
renderDrawableToBitmap(drawable, preview, 0, 0, bitmapWidth,
|
||||
bitmapHeight);
|
||||
} else {
|
||||
// Generate a preview image if we couldn't load one
|
||||
int minOffset = (int) (mAppIconSize * sWidgetPreviewIconPaddingPercentage);
|
||||
int smallestSide = Math.min(bitmapWidth, bitmapHeight);
|
||||
float iconScale = Math.min((float) smallestSide / (mAppIconSize + 2 * minOffset), 1f);
|
||||
if (cellHSpan != 1 || cellVSpan != 1) {
|
||||
renderDrawableToBitmap(mDefaultWidgetBackground, preview, 0, 0, bitmapWidth,
|
||||
bitmapHeight);
|
||||
final Canvas c = mCachedAppWidgetPreviewCanvas.get();
|
||||
final Rect src = mCachedAppWidgetPreviewSrcRect.get();
|
||||
final Rect dest = mCachedAppWidgetPreviewDestRect.get();
|
||||
c.setBitmap(preview);
|
||||
src.set(0, 0, defaultPreview.getWidth(), defaultPreview.getHeight());
|
||||
dest.set(0, 0, preview.getWidth(), preview.getHeight());
|
||||
|
||||
Paint p = mCachedAppWidgetPreviewPaint.get();
|
||||
if (p == null) {
|
||||
p = new Paint();
|
||||
p.setFilterBitmap(true);
|
||||
mCachedAppWidgetPreviewPaint.set(p);
|
||||
}
|
||||
|
||||
// Draw the icon in the top left corner
|
||||
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) {}
|
||||
c.drawBitmap(defaultPreview, src, dest, p);
|
||||
c.setBitmap(null);
|
||||
}
|
||||
return preview;
|
||||
}
|
||||
@@ -1274,7 +1414,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
} else if (rawInfo instanceof ResolveInfo) {
|
||||
// Fill in the shortcuts information
|
||||
ResolveInfo info = (ResolveInfo) rawInfo;
|
||||
createItemInfo = new PendingAddItemInfo();
|
||||
createItemInfo = new PendingAddShortcutInfo(info.activityInfo);
|
||||
createItemInfo.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
|
||||
createItemInfo.componentName = new ComponentName(info.activityInfo.packageName,
|
||||
info.activityInfo.name);
|
||||
@@ -1363,7 +1503,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
|
||||
} else if (rawInfo instanceof ResolveInfo) {
|
||||
// Fill in the shortcuts information
|
||||
ResolveInfo info = (ResolveInfo) rawInfo;
|
||||
images.add(getShortcutPreview(info));
|
||||
images.add(getShortcutPreview(info, data.maxImageWidth, data.maxImageHeight));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.app.ActivityManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.res.Resources;
|
||||
@@ -94,15 +95,20 @@ public class IconCache {
|
||||
}
|
||||
|
||||
public Drawable getFullResIcon(ResolveInfo info) {
|
||||
return getFullResIcon(info.activityInfo);
|
||||
}
|
||||
|
||||
public Drawable getFullResIcon(ActivityInfo info) {
|
||||
|
||||
Resources resources;
|
||||
try {
|
||||
resources = mPackageManager.getResourcesForApplication(
|
||||
info.activityInfo.applicationInfo);
|
||||
info.applicationInfo);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
resources = null;
|
||||
}
|
||||
if (resources != null) {
|
||||
int iconId = info.activityInfo.getIconResource();
|
||||
int iconId = info.getIconResource();
|
||||
if (iconId != 0) {
|
||||
return getFullResIcon(resources, iconId);
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ public class PagedViewWidget extends LinearLayout {
|
||||
ShortPressListener mShortPressListener = null;
|
||||
boolean mShortPressTriggered = false;
|
||||
static PagedViewWidget sShortpressTarget = null;
|
||||
boolean mIsAppWidget;
|
||||
|
||||
public PagedViewWidget(Context context) {
|
||||
this(context, null);
|
||||
@@ -84,6 +85,7 @@ public class PagedViewWidget extends LinearLayout {
|
||||
|
||||
public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info,
|
||||
int maxWidth, int[] cellSpan) {
|
||||
mIsAppWidget = true;
|
||||
final ImageView image = (ImageView) findViewById(R.id.widget_preview);
|
||||
if (maxWidth > -1) {
|
||||
image.setMaxWidth(maxWidth);
|
||||
@@ -100,6 +102,7 @@ public class PagedViewWidget extends LinearLayout {
|
||||
}
|
||||
|
||||
public void applyFromResolveInfo(PackageManager pm, ResolveInfo info) {
|
||||
mIsAppWidget = false;
|
||||
CharSequence label = info.loadLabel(pm);
|
||||
final ImageView image = (ImageView) findViewById(R.id.widget_preview);
|
||||
image.setContentDescription(label);
|
||||
@@ -115,16 +118,25 @@ public class PagedViewWidget extends LinearLayout {
|
||||
final ImageView i = (ImageView) findViewById(R.id.widget_preview);
|
||||
int[] maxSize = new int[2];
|
||||
maxSize[0] = i.getWidth() - i.getPaddingLeft() - i.getPaddingRight();
|
||||
maxSize[1] = i.getHeight() - i.getPaddingBottom() - i.getPaddingTop();
|
||||
maxSize[1] = i.getHeight() - i.getPaddingTop();
|
||||
return maxSize;
|
||||
}
|
||||
|
||||
void applyPreview(FastBitmapDrawable preview, int index) {
|
||||
final PagedViewWidgetImageView image =
|
||||
(PagedViewWidgetImageView) findViewById(R.id.widget_preview);
|
||||
(PagedViewWidgetImageView) findViewById(R.id.widget_preview);
|
||||
if (preview != null) {
|
||||
image.mAllowRequestLayout = false;
|
||||
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.mAllowRequestLayout = true;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
package com.android.launcher2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Insets;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.ImageView;
|
||||
|
||||
@@ -34,4 +36,22 @@ class PagedViewWidgetImageView extends ImageView {
|
||||
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.AppWidgetProviderInfo;
|
||||
import android.content.ComponentName;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.os.Parcelable;
|
||||
|
||||
/**
|
||||
@@ -31,6 +32,15 @@ class PendingAddItemInfo extends ItemInfo {
|
||||
ComponentName componentName;
|
||||
}
|
||||
|
||||
class PendingAddShortcutInfo extends PendingAddItemInfo {
|
||||
|
||||
ActivityInfo shortcutActivityInfo;
|
||||
|
||||
public PendingAddShortcutInfo(ActivityInfo activityInfo) {
|
||||
shortcutActivityInfo = activityInfo;
|
||||
}
|
||||
}
|
||||
|
||||
class PendingAddWidgetInfo extends PendingAddItemInfo {
|
||||
int minWidth;
|
||||
int minHeight;
|
||||
|
||||
Reference in New Issue
Block a user