Merge branch 'master' into honeycomb-release
diff --git a/src/com/android/launcher2/BubbleTextView.java b/src/com/android/launcher2/BubbleTextView.java
index 113f35d..855f261 100644
--- a/src/com/android/launcher2/BubbleTextView.java
+++ b/src/com/android/launcher2/BubbleTextView.java
@@ -147,16 +147,18 @@
// Draw the hotdog bubble
final Layout layout = getLayout();
- final int offset = getExtendedPaddingTop();
- final int paddingLeft = getPaddingLeft();
- final int paddingRight = getPaddingRight();
- final float left = layout.getLineLeft(0) + paddingLeft;
- final float right = Math.min(layout.getLineRight(0) + paddingRight,
- left + getWidth() - paddingLeft - paddingRight);
- mRect.set(left - mPaddingH, offset + (int) layout.getLineTop(0) - mPaddingV,
- right + mPaddingH, offset + (int) layout.getLineBottom(0) + mPaddingV);
+ if (layout != null) {
+ final int offset = getExtendedPaddingTop();
+ final int paddingLeft = getPaddingLeft();
+ final int paddingRight = getPaddingRight();
+ final float left = layout.getLineLeft(0) + paddingLeft;
+ final float right = Math.min(layout.getLineRight(0) + paddingRight,
+ left + getWidth() - paddingLeft - paddingRight);
+ mRect.set(left - mPaddingH, offset + (int) layout.getLineTop(0) - mPaddingV,
+ right + mPaddingH, offset + (int) layout.getLineBottom(0) + mPaddingV);
- canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
+ canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
+ }
super.draw(canvas);
}
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index 023e9f4..8fe489d 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -796,7 +796,8 @@
final int[] cellXY = mTmpCellXY;
getLocationOnScreen(cellXY);
- mWallpaperManager.sendWallpaperCommand(getWindowToken(), "android.home.drop",
+ mWallpaperManager.sendWallpaperCommand(getWindowToken(),
+ WallpaperManager.COMMAND_DROP,
cellXY[0] + childLeft + lp.width / 2,
cellXY[1] + childTop + lp.height / 2, 0, null);
diff --git a/src/com/android/launcher2/DimmableAppWidgetHostView.java b/src/com/android/launcher2/DimmableAppWidgetHostView.java
deleted file mode 100644
index 1f512a3..0000000
--- a/src/com/android/launcher2/DimmableAppWidgetHostView.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher2;
-
-import com.android.launcher.R;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.view.View;
-
-public class DimmableAppWidgetHostView extends LauncherAppWidgetHostView implements Dimmable {
- public DimmableAppWidgetHostView(Context context) {
- super(context);
- mPaint.setFilterBitmap(true);
- }
-
- private final Paint mPaint = new Paint();
- private Bitmap mDimmedView;
- private Canvas mDimmedViewCanvas;
- private boolean isDimmedViewUpdatePass;
- private float mDimmableProgress;
-
- private void setChildAlpha(float alpha) {
- if (getChildCount() > 0) {
- final View child = getChildAt(0);
- if (child.getAlpha() != alpha) {
- getChildAt(0).setAlpha(alpha);
- }
- }
- }
-
- private void updateChildAlpha() {
- // hacky, but sometimes widgets get their alpha set back to 1.0f, so we call
- // this to force them back
- setChildAlpha(getAlpha());
- }
-
- //@Override
- public boolean onSetAlpha(int alpha) {
- super.onSetAlpha(alpha);
- return true;
- }
-
- public void setDimmableProgress(float progress) {
- mDimmableProgress = progress;
- }
-
- public float getDimmableProgress() {
- return mDimmableProgress;
- }
-
- private void updateDimmedView() {
- if (mDimmedView == null) {
- mDimmedView = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
- Bitmap.Config.ARGB_8888);
- mDimmedViewCanvas = new Canvas(mDimmedView);
- }
- mDimmedViewCanvas.drawColor(0x00000000);
- mDimmedViewCanvas.concat(getMatrix());
- isDimmedViewUpdatePass = true;
- draw(mDimmedViewCanvas);
- // make the bitmap look "dimmed"
- int dimmedColor = getContext().getResources().getColor(R.color.dimmed_view_color);
- mDimmedViewCanvas.drawColor(dimmedColor, PorterDuff.Mode.SRC_IN);
- isDimmedViewUpdatePass = false;
- invalidate();
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
-
- if (mDimmedView == null && mDimmableProgress > 0.0f) {
- updateDimmedView();
- }
- }
-
- @Override
- public void dispatchDraw(Canvas canvas) {
- if (isDimmedViewUpdatePass) {
- final float alpha = getAlpha();
- canvas.save();
- setAlpha(1.0f);
- super.dispatchDraw(canvas);
- canvas.restore();
- setAlpha(alpha);
- } else {
- if (mDimmedView != null && mDimmableProgress > 0) {
- // draw the dimmed version of this widget
- mPaint.setAlpha((int) (mDimmableProgress * 255));
- canvas.drawBitmap(mDimmedView, 0, 0, mPaint);
- }
-
- updateChildAlpha();
- super.dispatchDraw(canvas);
- }
- }
-}
diff --git a/src/com/android/launcher2/DimmableBubbleTextView.java b/src/com/android/launcher2/DimmableBubbleTextView.java
deleted file mode 100644
index cb3b8ef..0000000
--- a/src/com/android/launcher2/DimmableBubbleTextView.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher2;
-
-import com.android.launcher.R;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.util.AttributeSet;
-
-public class DimmableBubbleTextView extends BubbleTextView implements Dimmable {
- private Paint mDimmedPaint = new Paint();
- private int mAlpha;
- private Bitmap mDimmedView;
- private Canvas mDimmedViewCanvas;
- private boolean isDimmedViewUpdatePass;
- private float mDimmableProgress;
-
- public DimmableBubbleTextView(Context context) {
- super(context);
- mDimmedPaint.setFilterBitmap(true);
- }
-
- public DimmableBubbleTextView(Context context, AttributeSet attrs) {
- super(context, attrs);
- mDimmedPaint.setFilterBitmap(true);
- }
-
- public DimmableBubbleTextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mDimmedPaint.setFilterBitmap(true);
- }
-
- public void setDimmableProgress(float progress) {
- mDimmableProgress = progress;
- }
-
- public float getDimmableProgress() {
- return mDimmableProgress;
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
-
- if (mDimmedView == null) {
- isDimmedViewUpdatePass = true;
- mDimmedView = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
- Bitmap.Config.ARGB_8888);
- mDimmedViewCanvas = new Canvas(mDimmedView);
- mDimmedViewCanvas.concat(getMatrix());
-
- draw(mDimmedViewCanvas);
-
- // MAKE THE DIMMED VERSION
- int dimmedColor = getContext().getResources().getColor(R.color.dimmed_view_color);
- mDimmedViewCanvas.drawColor(dimmedColor, PorterDuff.Mode.SRC_IN);
-
- isDimmedViewUpdatePass = false;
- }
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- if (isDimmedViewUpdatePass) {
- canvas.save();
- final float alpha = getAlpha();
- super.setAlpha(1.0f);
- super.onDraw(canvas);
- super.setAlpha(alpha);
- canvas.restore();
- } else {
- super.onDraw(canvas);
- }
-
- if (mDimmedView != null && mDimmableProgress > 0) {
- mDimmedPaint.setAlpha((int) (mDimmableProgress * 255));
- canvas.drawBitmap(mDimmedView, mScrollX, mScrollY, mDimmedPaint);
- }
- }
-}
\ No newline at end of file
diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index dae84aa..86c099e 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -29,7 +29,7 @@
/**
* An icon that can appear on in the workspace representing an {@link UserFolder}.
*/
-public class FolderIcon extends DimmableBubbleTextView implements DropTarget {
+public class FolderIcon extends BubbleTextView implements DropTarget {
private UserFolderInfo mInfo;
private Launcher mLauncher;
private Drawable mCloseIcon;
diff --git a/src/com/android/launcher2/HolographicOutlineHelper.java b/src/com/android/launcher2/HolographicOutlineHelper.java
index 658490a..bf4c05a 100644
--- a/src/com/android/launcher2/HolographicOutlineHelper.java
+++ b/src/com/android/launcher2/HolographicOutlineHelper.java
@@ -29,6 +29,7 @@
private final Paint mHolographicPaint = new Paint();
private final Paint mBlurPaint = new Paint();
private final Paint mErasePaint = new Paint();
+ private final Paint mAlphaClipPaint = new Paint();
public static final int OUTER_BLUR_RADIUS;
@@ -36,6 +37,10 @@
private static final BlurMaskFilter sMediumOuterBlurMaskFilter;
private static final BlurMaskFilter sThinOuterBlurMaskFilter;
private static final BlurMaskFilter sThickInnerBlurMaskFilter;
+ private static final BlurMaskFilter sMediumInnerBlurMaskFilter;
+
+ private static final int THICK = 0;
+ private static final int MEDIUM = 1;
static {
final float scale = LauncherApplication.getScreenDensity();
@@ -47,6 +52,7 @@
sMediumOuterBlurMaskFilter = new BlurMaskFilter(scale * 2.0f, BlurMaskFilter.Blur.OUTER);
sThinOuterBlurMaskFilter = new BlurMaskFilter(scale * 1.0f, BlurMaskFilter.Blur.OUTER);
sThickInnerBlurMaskFilter = new BlurMaskFilter(scale * 4.0f, BlurMaskFilter.Blur.NORMAL);
+ sMediumInnerBlurMaskFilter = new BlurMaskFilter(scale * 2.0f, BlurMaskFilter.Blur.NORMAL);
}
private static final MaskFilter sFineClipTable = TableMaskFilter.CreateClipTable(0, 20);
@@ -62,6 +68,8 @@
mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
mErasePaint.setFilterBitmap(true);
mErasePaint.setAntiAlias(true);
+ MaskFilter alphaClipTable = TableMaskFilter.CreateClipTable(180, 255);
+ mAlphaClipPaint.setMaskFilter(alphaClipTable);
}
/**
@@ -98,66 +106,42 @@
mHolographicPaint.setMaskFilter(sCoarseClipTable);
mHolographicPaint.setAlpha(150);
mHolographicPaint.setColor(color);
+
canvas.drawBitmap(glow, mTempOffset[0], mTempOffset[1], mHolographicPaint);
glow.recycle();
}
/**
- * Draws a solid outline around a bitmap, erasing the original pixels.
- *
- * @param bitmap The bitmap to modify
- * @param canvas A canvas on the bitmap
- * @param color The color to draw the outline and glow in
- * @param removeOrig If true, punch out the original pixels to just leave the outline
- */
- void applyExpensiveOuterOutline(Bitmap bitmap, Canvas canvas, int color, boolean removeOrig) {
- Bitmap originalImage = null;
- if (removeOrig) {
- originalImage = bitmap.extractAlpha();
- }
-
- // Compute an outer blur on the original bitmap
- mBlurPaint.setMaskFilter(sMediumOuterBlurMaskFilter);
- Bitmap outline = bitmap.extractAlpha(mBlurPaint, mTempOffset);
-
- // Paint the blurred bitmap back into the canvas. Using the clip table causes any alpha
- // pixels above a certain threshold to be rounded up to be fully opaque. This gives the
- // effect of a thick outline, with a slight blur on the edge
- mHolographicPaint.setColor(color);
- mHolographicPaint.setMaskFilter(sFineClipTable);
- canvas.drawBitmap(outline, mTempOffset[0], mTempOffset[1], mHolographicPaint);
- outline.recycle();
-
- if (removeOrig) {
- // Finally, punch out the original pixels, leaving just the outline
- canvas.drawBitmap(originalImage, 0, 0, mErasePaint);
- originalImage.recycle();
- }
- }
-
- /**
* Applies a more expensive and accurate outline to whatever is currently drawn in a specified
* bitmap.
*/
void applyExpensiveOutlineWithBlur(Bitmap srcDst, Canvas srcDstCanvas, int color,
- int outlineColor) {
+ int outlineColor, int thickness) {
+
+ // 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
+ Bitmap glowShape = srcDst.extractAlpha(mAlphaClipPaint, mTempOffset);
+
// calculate the outer blur first
- mBlurPaint.setMaskFilter(sThickOuterBlurMaskFilter);
+ mBlurPaint.setMaskFilter(thickness == THICK ? sThickOuterBlurMaskFilter :
+ sMediumOuterBlurMaskFilter);
int[] outerBlurOffset = new int[2];
- Bitmap thickOuterBlur = srcDst.extractAlpha(mBlurPaint, outerBlurOffset);
+ Bitmap thickOuterBlur = glowShape.extractAlpha(mBlurPaint, outerBlurOffset);
mBlurPaint.setMaskFilter(sThinOuterBlurMaskFilter);
int[] thinOuterBlurOffset = new int[2];
- Bitmap thinOuterBlur = srcDst.extractAlpha(mBlurPaint, thinOuterBlurOffset);
+ Bitmap thinOuterBlur = glowShape.extractAlpha(mBlurPaint, thinOuterBlurOffset);
// calculate the inner blur
+ srcDstCanvas.setBitmap(glowShape);
srcDstCanvas.drawColor(0xFF000000, PorterDuff.Mode.SRC_OUT);
- mBlurPaint.setMaskFilter(sThickInnerBlurMaskFilter);
+ mBlurPaint.setMaskFilter(thickness == THICK ? sThickInnerBlurMaskFilter :
+ sMediumInnerBlurMaskFilter);
int[] thickInnerBlurOffset = new int[2];
- Bitmap thickInnerBlur = srcDst.extractAlpha(mBlurPaint, thickInnerBlurOffset);
+ Bitmap thickInnerBlur = glowShape.extractAlpha(mBlurPaint, thickInnerBlurOffset);
// mask out the inner blur
srcDstCanvas.setBitmap(thickInnerBlur);
- srcDstCanvas.drawBitmap(srcDst, -thickInnerBlurOffset[0],
+ srcDstCanvas.drawBitmap(glowShape, -thickInnerBlurOffset[0],
-thickInnerBlurOffset[1], mErasePaint);
srcDstCanvas.drawRect(0, 0, -thickInnerBlurOffset[0], thickInnerBlur.getHeight(),
mErasePaint);
@@ -182,5 +166,17 @@
thinOuterBlur.recycle();
thickOuterBlur.recycle();
thickInnerBlur.recycle();
+ glowShape.recycle();
}
+
+ void applyThickExpensiveOutlineWithBlur(Bitmap srcDst, Canvas srcDstCanvas, int color,
+ int outlineColor) {
+ applyExpensiveOutlineWithBlur(srcDst, srcDstCanvas, color, outlineColor, THICK);
+ }
+
+ void applyMediumExpensiveOutlineWithBlur(Bitmap srcDst, Canvas srcDstCanvas, int color,
+ int outlineColor) {
+ applyExpensiveOutlineWithBlur(srcDst, srcDstCanvas, color, outlineColor, MEDIUM);
+ }
+
}
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 31cfb5b..257531e 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -757,8 +757,9 @@
break;
}
- case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
+ onWallpaperTap(ev);
+ case MotionEvent.ACTION_CANCEL:
mTouchState = TOUCH_STATE_REST;
mAllowLongPress = false;
mActivePointerId = INVALID_POINTER;
@@ -958,6 +959,8 @@
} else {
snapToDestination();
}
+ } else {
+ onWallpaperTap(ev);
}
mTouchState = TOUCH_STATE_REST;
mActivePointerId = INVALID_POINTER;
@@ -1011,6 +1014,12 @@
mVelocityTracker.clear();
}
}
+ if (mTouchState == TOUCH_STATE_REST) {
+ onWallpaperTap(ev);
+ }
+ }
+
+ protected void onWallpaperTap(MotionEvent ev) {
}
@Override
diff --git a/src/com/android/launcher2/PagedViewIcon.java b/src/com/android/launcher2/PagedViewIcon.java
index 0e72598..300bab5 100644
--- a/src/com/android/launcher2/PagedViewIcon.java
+++ b/src/com/android/launcher2/PagedViewIcon.java
@@ -81,7 +81,7 @@
Canvas holographicOutlineCanvas = new Canvas(holographicOutline);
holographicOutlineCanvas.drawBitmap(icon.mIcon, 0, 0, mPaint);
- sHolographicOutlineHelper.applyExpensiveOutlineWithBlur(holographicOutline,
+ sHolographicOutlineHelper.applyThickExpensiveOutlineWithBlur(holographicOutline,
holographicOutlineCanvas, icon.mHoloBlurColor, icon.mHoloOutlineColor);
mHandler.post(new Runnable() {
@@ -235,7 +235,7 @@
mPaint.setAlpha(255);
checkedOutlineCanvas.drawBitmap(mIcon, 0, 0, mPaint);
- sHolographicOutlineHelper.applyExpensiveOutlineWithBlur(mCheckedOutline,
+ sHolographicOutlineHelper.applyThickExpensiveOutlineWithBlur(mCheckedOutline,
checkedOutlineCanvas, mCheckedBlurColor, mCheckedOutlineColor);
} else {
invalidateCheckedImage();
diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java
index 40e507b..4d4ccc2 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -80,7 +80,7 @@
widget.mPreview.setAlpha(prevAlpha);
widget.mHolographicOutlineCanvas.restore();
- sHolographicOutlineHelper.applyExpensiveOutlineWithBlur(outline,
+ sHolographicOutlineHelper.applyThickExpensiveOutlineWithBlur(outline,
widget.mHolographicOutlineCanvas, widget.mHoloBlurColor,
widget.mHoloOutlineColor);
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index b12d357..42dbc9a 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -542,10 +542,6 @@
Launcher.setScreen(mCurrentPage);
};
- private void updateWallpaperOffset() {
- updateWallpaperOffset(getChildAt(getChildCount() - 1).getRight() - (mRight - mLeft));
- }
-
private void updateWallpaperOffset(int scrollRange) {
final boolean isStaticWallpaper = (mWallpaperManager != null) &&
(mWallpaperManager.getWallpaperInfo() == null);
@@ -892,6 +888,21 @@
return super.onTouchEvent(ev);
}
+ @Override
+ protected void onWallpaperTap(MotionEvent ev) {
+ final int[] position = mTempCell;
+ getLocationOnScreen(position);
+
+ int pointerIndex = ev.getActionIndex();
+ position[0] += (int) ev.getX(pointerIndex);
+ position[1] += (int) ev.getY(pointerIndex);
+
+ mWallpaperManager.sendWallpaperCommand(getWindowToken(),
+ ev.getAction() == MotionEvent.ACTION_UP
+ ? WallpaperManager.COMMAND_TAP : WallpaperManager.COMMAND_SECONDARY_TAP,
+ position[0], position[1], 0, null);
+ }
+
public boolean isSmall() {
return mIsSmall;
}
@@ -1313,8 +1324,7 @@
canvas.setBitmap(b);
drawDragView(v, canvas, padding);
- mOutlineHelper.applyExpensiveOuterOutline(b, canvas, outlineColor, true);
-
+ mOutlineHelper.applyMediumExpensiveOutlineWithBlur(b, canvas, outlineColor, outlineColor);
return b;
}
@@ -1336,8 +1346,7 @@
canvas.setBitmap(b);
canvas.drawRoundRect(new RectF(inset, inset, iconWidth - inset, iconHeight - inset),
rectRadius, rectRadius, mExternalDragOutlinePaint);
- mOutlineHelper.applyExpensiveOuterOutline(b, canvas, outlineColor, true);
-
+ mOutlineHelper.applyMediumExpensiveOutlineWithBlur(b, canvas, outlineColor, outlineColor);
return b;
}