summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/drawable-hdpi/widget_tile.pngbin135 -> 0 bytes
-rw-r--r--res/drawable-mdpi/widget_tile.pngbin110 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/widget_tile.pngbin122 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/widget_tile.pngbin132 -> 0 bytes
-rw-r--r--res/values/dimens.xml5
-rw-r--r--src/com/android/launcher3/WidgetPreviewLoader.java97
-rw-r--r--src/com/android/launcher3/graphics/HolographicOutlineHelper.java29
-rw-r--r--src/com/android/launcher3/graphics/ShadowGenerator.java4
-rw-r--r--src/com/android/launcher3/widget/PendingItemDragHelper.java6
9 files changed, 73 insertions, 68 deletions
diff --git a/res/drawable-hdpi/widget_tile.png b/res/drawable-hdpi/widget_tile.png
deleted file mode 100644
index 572bf6f49..000000000
--- a/res/drawable-hdpi/widget_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/widget_tile.png b/res/drawable-mdpi/widget_tile.png
deleted file mode 100644
index 9652aceec..000000000
--- a/res/drawable-mdpi/widget_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/widget_tile.png b/res/drawable-xhdpi/widget_tile.png
deleted file mode 100644
index be1748d02..000000000
--- a/res/drawable-xhdpi/widget_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/widget_tile.png b/res/drawable-xxhdpi/widget_tile.png
deleted file mode 100644
index c6237db30..000000000
--- a/res/drawable-xxhdpi/widget_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2cf17ead7..9c8162bab 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -85,6 +85,11 @@
<dimen name="widget_preview_label_vertical_padding">8dp</dimen>
<dimen name="widget_preview_label_horizontal_padding">16dp</dimen>
+ <dimen name="widget_preview_shadow_blur">0.5dp</dimen>
+ <dimen name="widget_preview_key_shadow_distance">1dp</dimen>
+ <dimen name="widget_preview_corner_radius">2dp</dimen>
+ <dimen name="widget_preview_cell_divider_width">0.5dp</dimen>
+
<dimen name="widget_section_height">56dp</dimen>
<dimen name="widget_section_icon_size">40dp</dimen>
<dimen name="widget_section_vertical_padding">8dp</dimen>
diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java
index 091ae9903..3512210c7 100644
--- a/src/com/android/launcher3/WidgetPreviewLoader.java
+++ b/src/com/android/launcher3/WidgetPreviewLoader.java
@@ -18,9 +18,8 @@ import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.PorterDuff;
-import android.graphics.Rect;
+import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Handler;
@@ -31,6 +30,7 @@ import android.util.LongSparseArray;
import com.android.launcher3.compat.AppWidgetManagerCompat;
import com.android.launcher3.compat.ShortcutConfigActivityInfo;
import com.android.launcher3.compat.UserManagerCompat;
+import com.android.launcher3.graphics.ShadowGenerator;
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.Preconditions;
@@ -52,8 +52,6 @@ public class WidgetPreviewLoader {
private static final String TAG = "WidgetPreviewLoader";
private static final boolean DEBUG = false;
- private static final float WIDGET_PREVIEW_ICON_PADDING_PERCENTAGE = 0.25f;
-
private final HashMap<String, long[]> mPackageVersions = new HashMap<>();
/**
@@ -104,7 +102,7 @@ public class WidgetPreviewLoader {
* sizes (landscape vs portrait).
*/
private static class CacheDb extends SQLiteCacheHelper {
- private static final int DB_VERSION = 5;
+ private static final int DB_VERSION = 6;
private static final String TABLE_NAME = "shortcut_and_widget_previews";
private static final String COLUMN_COMPONENT = "componentName";
@@ -299,7 +297,7 @@ public class WidgetPreviewLoader {
Drawable drawable = null;
if (info.previewImage != 0) {
try {
- drawable = info.loadPreviewImage(launcher.getApplicationContext(), 0);
+ drawable = info.loadPreviewImage(mContext, 0);
} catch (OutOfMemoryError e) {
Log.w(TAG, "Error loading widget preview for: " + info.provider, e);
// During OutOfMemoryError, the previous heap stack is not affected. Catching
@@ -321,17 +319,14 @@ public class WidgetPreviewLoader {
int previewWidth;
int previewHeight;
- Bitmap tileBitmap = null;
-
if (widgetPreviewExists) {
previewWidth = drawable.getIntrinsicWidth();
previewHeight = drawable.getIntrinsicHeight();
} else {
- // Generate a preview image if we couldn't load one
- tileBitmap = ((BitmapDrawable) mContext.getResources().getDrawable(
- R.drawable.widget_tile)).getBitmap();
- previewWidth = tileBitmap.getWidth() * spanX;
- previewHeight = tileBitmap.getHeight() * spanY;
+ DeviceProfile dp = launcher.getDeviceProfile();
+ int tileSize = Math.min(dp.cellWidthPx, dp.cellHeightPx);
+ previewWidth = tileSize * spanX;
+ previewHeight = tileSize * spanY;
}
// Scale to fit width only - let the widget preview be clipped in the
@@ -371,45 +366,61 @@ public class WidgetPreviewLoader {
drawable.setBounds(x, 0, x + previewWidth, previewHeight);
drawable.draw(c);
} else {
- final Paint p = new Paint();
- p.setFilterBitmap(true);
- int appIconSize = launcher.getDeviceProfile().iconSizePx;
-
- // draw the spanX x spanY tiles
- final Rect src = new Rect(0, 0, tileBitmap.getWidth(), tileBitmap.getHeight());
-
- float tileW = scale * tileBitmap.getWidth();
- float tileH = scale * tileBitmap.getHeight();
- final RectF dst = new RectF(0, 0, tileW, tileH);
-
- float tx = x;
- for (int i = 0; i < spanX; i++, tx += tileW) {
- float ty = 0;
- for (int j = 0; j < spanY; j++, ty += tileH) {
- dst.offsetTo(tx, ty);
- c.drawBitmap(tileBitmap, src, dst, p);
- }
+ Resources res = mContext.getResources();
+ float shadowBlur = res.getDimension(R.dimen.widget_preview_shadow_blur);
+ float keyShadowDistance = res.getDimension(R.dimen.widget_preview_key_shadow_distance);
+ float corner = res.getDimension(R.dimen.widget_preview_corner_radius);
+
+ RectF boxRect = new RectF(shadowBlur, shadowBlur,
+ previewWidth - shadowBlur, previewHeight - shadowBlur - keyShadowDistance);
+
+ final Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
+ p.setColor(0xFFFFFFFF);
+
+ // Key shadow
+ p.setShadowLayer(shadowBlur, 0, keyShadowDistance,
+ ShadowGenerator.KEY_SHADOW_ALPHA << 24);
+ c.drawRoundRect(boxRect, corner, corner, p);
+
+ // Ambient shadow
+ p.setShadowLayer(shadowBlur, 0, 0, ShadowGenerator.AMBIENT_SHADOW_ALPHA << 24);
+ c.drawRoundRect(boxRect, corner, corner, p);
+
+ // Draw horizontal and vertical lines to represent individual columns.
+ p.clearShadowLayer();
+ p.setStyle(Paint.Style.STROKE);
+ p.setStrokeWidth(res.getDimension(R.dimen.widget_preview_cell_divider_width));
+ p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
+
+ float t = boxRect.left;
+ float tileSize = boxRect.width() / spanX;
+ for (int i = 1; i < spanX; i++) {
+ t += tileSize;
+ c.drawLine(t, 0, t, previewHeight, p);
}
- // Draw the icon in the top left corner
- // TODO: use top right for RTL
- int minOffset = (int) (appIconSize * WIDGET_PREVIEW_ICON_PADDING_PERCENTAGE);
- int smallestSide = Math.min(previewWidth, previewHeight);
- float iconScale = Math.min((float) smallestSide / (appIconSize + 2 * minOffset), scale);
+ t = boxRect.top;
+ tileSize = boxRect.height() / spanY;
+ for (int i = 1; i < spanY; i++) {
+ t += tileSize;
+ c.drawLine(0, t, previewWidth, t, p);
+ }
+ // Draw icon in the center.
try {
Drawable icon = info.getIcon(launcher, mIconCache);
if (icon != null) {
+ int appIconSize = launcher.getDeviceProfile().iconSizePx;
+ int iconSize = (int) Math.min(appIconSize * scale,
+ Math.min(boxRect.width(), boxRect.height()));
+
icon = mutateOnMainThread(icon);
- int hoffset = (int) ((tileW - appIconSize * iconScale) / 2) + x;
- int yoffset = (int) ((tileH - appIconSize * iconScale) / 2);
- icon.setBounds(hoffset, yoffset,
- hoffset + (int) (appIconSize * iconScale),
- yoffset + (int) (appIconSize * iconScale));
+ int hoffset = (previewWidth - iconSize) / 2;
+ int yoffset = (previewHeight - iconSize) / 2;
+ icon.setBounds(hoffset, yoffset, hoffset + iconSize, yoffset + iconSize);
icon.draw(c);
}
- } catch (Resources.NotFoundException e) {
- }
+ } catch (Resources.NotFoundException e) { }
c.setBitmap(null);
}
return preview;
diff --git a/src/com/android/launcher3/graphics/HolographicOutlineHelper.java b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java
index 9c397210e..c9873d9ea 100644
--- a/src/com/android/launcher3/graphics/HolographicOutlineHelper.java
+++ b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java
@@ -86,33 +86,26 @@ public class HolographicOutlineHelper {
* bitmap.
*/
public void applyExpensiveOutlineWithBlur(Bitmap srcDst, Canvas srcDstCanvas) {
- applyExpensiveOutlineWithBlur(srcDst, srcDstCanvas, true);
- }
-
- public void applyExpensiveOutlineWithBlur(Bitmap srcDst, Canvas srcDstCanvas,
- boolean clipAlpha) {
if (ProviderConfig.IS_DOGFOOD_BUILD && srcDst.getConfig() != Bitmap.Config.ALPHA_8) {
throw new RuntimeException("Outline blue is only supported on alpha bitmaps");
}
// We start by removing most of the alpha channel so as to ignore shadows, and
// other types of partial transparency when defining the shape of the object
- if (clipAlpha) {
- byte[] pixels = new byte[srcDst.getWidth() * srcDst.getHeight()];
- ByteBuffer buffer = ByteBuffer.wrap(pixels);
- buffer.rewind();
- srcDst.copyPixelsToBuffer(buffer);
-
- for (int i = 0; i < pixels.length; i++) {
- if ((pixels[i] & 0xFF) < 188) {
- pixels[i] = 0;
- }
+ byte[] pixels = new byte[srcDst.getWidth() * srcDst.getHeight()];
+ ByteBuffer buffer = ByteBuffer.wrap(pixels);
+ buffer.rewind();
+ srcDst.copyPixelsToBuffer(buffer);
+
+ for (int i = 0; i < pixels.length; i++) {
+ if ((pixels[i] & 0xFF) < 188) {
+ pixels[i] = 0;
}
-
- buffer.rewind();
- srcDst.copyPixelsFromBuffer(buffer);
}
+ buffer.rewind();
+ srcDst.copyPixelsFromBuffer(buffer);
+
// calculate the outer blur first
mBlurPaint.setMaskFilter(mMediumOuterBlurMaskFilter);
int[] outerBlurOffset = new int[2];
diff --git a/src/com/android/launcher3/graphics/ShadowGenerator.java b/src/com/android/launcher3/graphics/ShadowGenerator.java
index 8aea5a039..31276ecc0 100644
--- a/src/com/android/launcher3/graphics/ShadowGenerator.java
+++ b/src/com/android/launcher3/graphics/ShadowGenerator.java
@@ -39,9 +39,9 @@ public class ShadowGenerator {
// Percent of actual icon size
private static final float KEY_SHADOW_DISTANCE = 1f/48;
- private static final int KEY_SHADOW_ALPHA = 61;
+ public static final int KEY_SHADOW_ALPHA = 61;
- private static final int AMBIENT_SHADOW_ALPHA = 30;
+ public static final int AMBIENT_SHADOW_ALPHA = 30;
private static final Object LOCK = new Object();
// Singleton object guarded by {@link #LOCK}
diff --git a/src/com/android/launcher3/widget/PendingItemDragHelper.java b/src/com/android/launcher3/widget/PendingItemDragHelper.java
index a4698c292..c723f9e8b 100644
--- a/src/com/android/launcher3/widget/PendingItemDragHelper.java
+++ b/src/com/android/launcher3/widget/PendingItemDragHelper.java
@@ -178,12 +178,8 @@ public class PendingItemDragHelper extends DragPreviewProvider {
dst.offset((w - scaledWidth) / 2, (h - scaledHeight) / 2);
canvas.drawBitmap(mPreviewBitmap, src, dst, null);
-
- // Don't clip alpha values for the drag outline if we're using the default widget preview
- boolean clipAlpha = !(mAddInfo instanceof PendingAddWidgetInfo &&
- (((PendingAddWidgetInfo) mAddInfo).previewImage == 0));
HolographicOutlineHelper.getInstance(mView.getContext())
- .applyExpensiveOutlineWithBlur(b, canvas, clipAlpha);
+ .applyExpensiveOutlineWithBlur(b, canvas);
canvas.setBitmap(null);
return b;