package com.android.launcher3.dragndrop; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.util.AttributeSet; 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; } }