diff options
Diffstat (limited to 'src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java')
-rw-r--r-- | src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java b/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java new file mode 100644 index 000000000..36a0292da --- /dev/null +++ b/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java @@ -0,0 +1,99 @@ +package com.android.launcher3.dragndrop; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.RemoteViews; + +import com.android.launcher3.BaseActivity; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.LauncherAppWidgetProviderInfo; +import com.android.launcher3.widget.WidgetCell; + +/** + * Extension of {@link WidgetCell} which supports generating previews from {@link RemoteViews} + */ +public class LivePreviewWidgetCell extends WidgetCell { + + private RemoteViews mPreview; + + public LivePreviewWidgetCell(Context context) { + this(context, null); + } + + public LivePreviewWidgetCell(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public LivePreviewWidgetCell(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public void setPreview(RemoteViews view) { + mPreview = view; + } + + @Override + public void ensurePreview() { + if (mPreview != null && mActiveRequest == null) { + Bitmap preview = generateFromRemoteViews( + mActivity, mPreview, mItem.widgetInfo, mPresetPreviewSize, new int[1]); + if (preview != null) { + applyPreview(preview); + return; + } + } + super.ensurePreview(); + } + + /** + * Generates a bitmap by inflating {@param views}. + * @see com.android.launcher3.WidgetPreviewLoader#generateWidgetPreview + * + * TODO: Consider moving this to the background thread. + */ + public static Bitmap generateFromRemoteViews(BaseActivity activity, RemoteViews views, + LauncherAppWidgetProviderInfo info, int previewSize, int[] preScaledWidthOut) { + + DeviceProfile dp = activity.getDeviceProfile(); + int viewWidth = dp.cellWidthPx * info.spanX; + int viewHeight = dp.cellHeightPx * info.spanY; + + final View v; + try { + v = views.apply(activity, new FrameLayout(activity)); + v.measure(MeasureSpec.makeMeasureSpec(viewWidth, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(viewHeight, MeasureSpec.EXACTLY)); + + viewWidth = v.getMeasuredWidth(); + viewHeight = v.getMeasuredHeight(); + v.layout(0, 0, viewWidth, viewHeight); + } catch (Exception e) { + return null; + } + + preScaledWidthOut[0] = viewWidth; + final int bitmapWidth, bitmapHeight; + final float scale; + if (viewWidth > previewSize) { + scale = ((float) previewSize) / viewWidth; + bitmapWidth = previewSize; + bitmapHeight = (int) (viewHeight * scale); + } else { + scale = 1; + bitmapWidth = viewWidth; + bitmapHeight = viewHeight; + } + + Bitmap preview = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(preview); + c.scale(scale, scale); + v.draw(c); + c.setBitmap(null); + return preview; + } +} |