mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-20 03:08:19 +00:00
100 lines
3.2 KiB
Java
100 lines
3.2 KiB
Java
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;
|
|
}
|
|
}
|